es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Conexión JDBC a Snowflake con clave privada – sin frase de paso

Estoy trabajando en un código basado en un cliente Java que intenta conectarse a Snowflake JDBC con una clave privada. He buscado en línea y he encontrado estos enlaces:

https://domohelp.domo.com/hc/en-us/articles/360042931854-Snowflake-Using-Key-Pair-Authentication-Connector

https://docs.snowflake.com/en/user-guide/jdbc-configure.html
y otros enlaces, todos requieren utilizar una frase de paso.

Y este es mi código:

Properties p = new Properties();
p.setProperty(USER, jdbcDetails.username);
String privateKey = jdbcDetails.getPrivateKey().replace("-----BEGIN ENCRYPTED PRIVATE KEY-----\n", "").replace("\n-----END ENCRYPTED PRIVATE KEY-----", "");
String passphrase = "abcdefg";
EncryptedPrivateKeyInfo pkInfo = new EncryptedPrivateKeyInfo(Base64.getMimeDecoder().decode(privateKey));
PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray());
SecretKeyFactory pbeKeyFactory = SecretKeyFactory.getInstance(pkInfo.getAlgName());
PKCS8EncodedKeySpec encodedKeySpec = pkInfo.getKeySpec(pbeKeyFactory.generateSecret(keySpec));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey encryptedPrivateKey = keyFactory.generatePrivate(encodedKeySpec);
p.put("privateKey", encryptedPrivateKey);
return p;

Parece que este código es válido para la conexión, pero después de hablar con nuestro DBA, él me ha dicho que puede conectarse sin especificar la frase de paso.

Con este comando:

snowsql -h a-b-c-d.snowflakecomputing.com -a abcd.AWS_US_EAST-1 -u username  -d INTEGRATION_ENGINE --private-key-path ~postgres/ADHOC/12345/rsa_key.p8 -q "select 1"

¿Cómo puedo conectarme utilizando JDBC con una clave privada y sin frase de paso?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es inusual que el DBA pueda conectarse sin especificar la frase de acceso, ya que generalmente se requiere para la autenticación basada en claves. Sin embargo, si desea conectarse utilizando JDBC con una clave privada y sin una frase de acceso, puede modificar su código para excluir el código relacionado con la frase de acceso. El código modificado se vería así:

    Properties p = new Properties();
    p.setProperty(USER, jdbcDetails.username);
    String privateKey = jdbcDetails.getPrivateKey().replace("-----BEGIN ENCRYPTED PRIVATE KEY-----\n", "");
    privateKey = privateKey.replace("\n-----END ENCRYPTED PRIVATE KEY-----", "");
    EncryptedPrivateKeyInfo pkInfo = new EncryptedPrivateKeyInfo(Base64.getMimeDecoder().decode(privateKey));
    PKCS8EncodedKeySpec encodedKeySpec = pkInfo.getKeySpec(null);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey encryptedPrivateKey = keyFactory.generatePrivate(encodedKeySpec);
    p.put("privateKey", encryptedPrivateKey);
    return p;
    

    Este código omite el código relacionado con la frase de acceso y decodifica directamente la clave privada, la cual luego se utiliza para generar la clave privada cifrada para la conexión. Tenga en cuenta que este enfoque solamente debe utilizarse si se confirma con el DBA que no se requiere una frase de acceso para la autenticación basada en claves.

Comments are closed.