"""A CLI util which generates a base64 string from a Snowflake private key.""" import argparse import base64 import os from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization def generate_snowflake_private_key_string(passphrase, path_to_rsa_key_p8=None): """Generate a base64 encoded string. This string we need to place as SNOWFLAKE_PRIVATE_KEY_STRING to AWS Secrets Manager. Afterwards we can add it to SF_CONFIG as 'private_key': base64.b64decode( bytes(os.environ.get('SNOWFLAKE_PRIVATE_KEY_STRING'), encoding='utf-8')) """ snowflake_private_key_path = ( path_to_rsa_key_p8 or '{}/.ssh/snowflake/rsa_key.p8'.format( os.environ['HOME'])) with open(snowflake_private_key_path, 'rb') as key: p_key = serialization.load_pem_private_key( key.read(), password=passphrase.encode(), backend=default_backend() ) private_key = p_key.private_bytes( encoding=serialization.Encoding.DER, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption()) private_key_string = str(base64.b64encode(private_key))[1:] with open( os.path.join( os.getcwd(), 'snowflake_private_key_string.txt'), 'wt') as txt_file: txt_file.writelines(private_key_string) if __name__ == '__main__': parser = argparse.ArgumentParser( description='Generate base64 encoded string to place in ' 'AWS Secrets Manager') parser.add_argument('passphrase', help='private key passphrase') parser.add_argument('path_to_rsa_key_p8', nargs='?', default=None, help='full path to Snowflake private key rsa_key.p8') args = parser.parse_args() generate_snowflake_private_key_string( args.passphrase, args.path_to_rsa_key_p8)