I am implementing a Snowflake connector using snowflake python driver. This is my code:
class SnowflakeDriver:
def __init__(
self,
sf_user: str = os.environ["SNOWFLAKE_USERNAME"],
sf_account: str = os.environ["SNOWFLAKE_ACCOUNT"],
sf_private_key: str = os.environ["SNOWFLAKE_PRIVATE_KEY"],
sf_role: str = os.environ["SNOWFLAKE_ROLE"],
private_key_isa_file: bool = False,
sf_warehouse: str = os.environ["SNOWFLAKE_WAREHOUSE"],
sf_database: str = os.environ["SNOWFLAKE_DATABASE"],
):
try:
if private_key_isa_file:
with open(sf_private_key, "r", encoding="utf-8") as file:
key = file.read()
else:
key = sf_private_key
except FileNotFoundError as err:
print(f"{err}")
sys.exit(1)
private_key_serialized = serialization.load_pem_private_key(sf_private_key.encode(), password=None, backend=default_backend())
private_key_encrypted = private_key_serialized.private_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
try:
conn = snowflake.connector.connect(
user=sf_user,
account=sf_account,
private_key=private_key_encrypted,
warehouse=sf_warehouse,
database=sf_database,
role=sf_role
)
cs = conn.cursor()
try:
cs.execute("SELECT current_version()")
one_row = cs.fetchone()
print(one_row[0])
finally:
cs.close()
conn.close()
except OperationalError as err:
print(f"{err}")
sys.exit(1)
self.conn = conn
def execute_query(self, query: str):
cursor = self.conn.cursor()
cursor.execute(query)
rw_ct = cursor.rowcount
self.conn.commit()
return rw_ct
The problem is that I'm getting the following error:
ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=151584876, lib=9, reason=108, reason_text=b'error:0909006C:PEM routines:get_name:no start line')])
The sentence that raises the exception is private_key_serialized = serialization.load_pem_private_key(sf_private_key.encode(), password=None, backend=default_backend())
This seems to happen only in Windows and work in linux, so I think It might be the way secret keys are stored as environment variables.