Я не могу подключиться к Snowflake через Java REST API. Следили за документацией Snowflake относительно подключения к Snowflake с драйвером JDBC, но получили следующую ошибку на консоли eclipse:
Я выполнил шаги, указанные в документации Snowflake: https://docs.snowflake.net/manuals/user-guide/jdbc.html.
Я использую пару ключей RSA для аутентификации в Snowflake, как указано в документе. Я также сопоставил открытый ключ с пользователем Snowflake, которого я использую, но все еще сталкиваюсь с этой проблемой. Я сомневаюсь, что проблема заключается в расшифровке ключа.
Ниже приведен код, который я использую для подключения к Snowflake:
Любая помощь будет высоко ценится!!!!!
public class TestSnowflakeConnection {
public static void main(String[] args)
throws Exception
{
DriverManager.registerDriver(new net.snowflake.client.jdbc.SnowflakeDriver());
File f = new File("D:\\....\\Auth-Keys\\rsa_key.p8");
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
String encrypted = new String(keyBytes);
String passphrase = System.getenv("----");
encrypted = encrypted.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", "");
encrypted = encrypted.replace("-----END ENCRYPTED PRIVATE KEY-----", "");
EncryptedPrivateKeyInfo pkInfo = new EncryptedPrivateKeyInfo(Base64.getMimeDecoder().decode(encrypted));
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);
String url = "jdbc:snowflake://<account>.snowflakecomputing.com";
Properties prop = new Properties();
prop.put("user", "username");
prop.put("account", "xxx.xxx.xx-southeast-1.aws");
prop.put("privateKey", encryptedPrivateKey);
Connection conn = DriverManager.getConnection(url, prop);
Statement stat = conn.createStatement();
ResultSet res = stat.executeQuery("select 1");
res.next();
System.out.println(res.getString(1));
conn.close();
}
}
Пара вопросов: