java.sql.SQLException: Listener refused the connection with the following error:
ORA-12529, TNS:connect request rejected based on current filtering rules
(CONNECTION_ID=gV+PGK8dSju4vIuTNE4bYg==)
at oracle.jdbc.driver.T4CConnection.handleLogonNetException(T4CConnection.java:892)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:697)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:1041)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:89)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:732)
at oracle.jdbc.datasource.impl.OracleDataSource.getPhysicalConnection(OracleDataSource.java:681)
at oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java:372)
at oracle.jdbc.datasource.impl.OracleDataSource.getConnectionInternal(OracleDataSource.java:2135)
at oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java:345)
at oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java:306)
at
< /code>
Я пытаюсь создать соединение с помощью токена базы данных IAM Scoped из OCI, используя основную аутентификацию экземпляра. Использование Spring Boot Application и JDK 17 и Oracle Автономная база данных 23AI. < /P>
Попытка установить безопасное соединение без кошелька с Oracle ADW
Использование аутентификации на основе токенов IAM и сгенерированной пары клавиш RSA. Шаги: < /p>
генерирует временную пару клавиш RSA < /li>
Преобразование открытого ключа в формат PEM и получает токен IAM, используя его. Экземпляр.private Connection createWalletlessConnection(DIAssistantConnection connDetails) throws Exception {
KeyPair keyPair = generateRsaKeyPair();
String publicKeyPem = convertPublicKeyToPem(keyPair.getPublic());
String accessToken = fetchScopedIamDbToken(publicKeyPem);
AccessToken jdbcAccessToken = AccessToken.createJsonWebToken(accessToken.toCharArray(), keyPair.getPrivate());
String jdbcUrl = buildJdbcUrl(connDetails.getAdwConnectionString());
OracleDataSource ods = new OracleDataSource();
ods.setURL(jdbcUrl);
Properties props = new Properties();
props.put(OracleConnection.CONNECTION_PROPERTY_TOKEN_AUTHENTICATION, "OCI_TOKEN");
ods.setConnectionProperties(props);
ods.setTokenSupplier(() -> jdbcAccessToken);
return ods.getConnection();
}
private KeyPair generateRsaKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(4096);
return generator.generateKeyPair();
}
private String convertPublicKeyToPem(PublicKey publicKey) {
String base64Key = Base64.getEncoder().encodeToString(publicKey.getEncoded());
StringBuilder pem = new StringBuilder("-----BEGIN PUBLIC KEY-----\n");
for (int i = 0; i < base64Key.length(); i += 64) {
pem.append(base64Key, i, Math.min(i + 64, base64Key.length())).append("\n");
}
pem.append("-----END PUBLIC KEY-----");
return pem.toString();
}
private String fetchScopedIamDbToken(String publicKeyPem) throws Exception {
InstancePrincipalsAuthenticationDetailsProvider provider = InstancePrincipalsAuthenticationDetailsProvider.builder().build();
try (DataplaneClient client = DataplaneClient.builder().build(provider)) {
GenerateScopedAccessTokenDetails details = GenerateScopedAccessTokenDetails.builder()
.scope("urn:oracle:db:
.publicKey(publicKeyPem)
.build();
GenerateScopedAccessTokenRequest request = GenerateScopedAccessTokenRequest.builder()
.generateScopedAccessTokenDetails(details)
.build();
return client.generateScopedAccessToken(request).getSecurityToken().getToken();
}
}
private String buildJdbcUrl(String connectionString) {
String[] parts = connectionString.split("/");
if (parts.length != 2) {
throw new IllegalArgumentException("Invalid connection string format.");
}
String[] hostPort = parts[0].trim().split(":");
String host = hostPort[0].trim();
String port = (hostPort.length > 1) ? hostPort[1].trim() : "1521";
String serviceName = parts[1].trim();
return String.format(
"jdbc:oracle:thin:@(description=(retry_count=20)(retry_delay=3)"
+ "(address=(protocol=tcps)(host=%s)(port=%s))"
+ "(connect_data=(service_name=%s))"
+ "(security=(ssl_server_dn_match=no)))",
host, port, serviceName
);
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ing-java-c