使用 JDBC thin 和 JKS 的 Oracle 数据库 TLS1.2/SSL 连接

Oracle Database TLS1.2 / SSL connection using JDBC thin and JKS

当尝试使用 12.1.0.2 JDBC 瘦驱动程序连接到 Oracle Database 12c 时,出现异常。我们使用带有 JKS 证书的 TLSv1.2。但是,我们无法成功连接到数据库。

线程 "main" java.sql.SQLRecoverableException 异常:IO 错误: 收到致命警报:handshake_failure

以下是配置 Oracle JDBC 瘦驱动程序以使用 TLS v1.2 连接到数据库的步骤(假设您的数据库配置正确)。

第 1 步:为错误 19030178 应用补丁(从 12.2.0.1 开始不需要)

您需要为允许 TLSv1.2 的错误 19030178 应用补丁。请注意,该补丁允许 TLSv1.2,但默认情况下不启用它。所以对于 12.1.0.2 补丁驱动你还需要设置 oracle.net.ssl_version='1.2'。此 属性 可以设置为系统 属性(使用 -D)或通过数据源属性设置。

步骤 2:安装 JCE 文件

如果没有 Java 加密扩展 (JCE) 文件,将不会启用强密码套件(例如 TLS_RSA_WITH_AES_256_CBC_SHA256)。因此,无论您使用 JDK7 还是 JDK8,都应该安装 JCE Unlimited Strength Jurisdiction Policy Files。这些文件可以在 Oracle 网站上找到。

步骤 3:始终使用 JDK

的最新更新

请务必使用 JDK7 或 JDK8 的最新更新,因为 TLSv1.2 所需的错误已得到修复。

第 4 步:使用 JKS 文件代替钱包

看起来你已经这样做了,但只是为了让其他人看到:钱包很难配置和与 Oracle JDBC 瘦驱动程序一起使用,因为它们需要额外的 jar 和额外的属性。另一方面,JRE 原生支持 JKS 文件,根据我的经验,它一直运行良好。

第 5 步:使用 JDK7 时,明确启用强密码套件

使用 JDK8 时不需要此步骤。对于 JDK7,如果您使用的是 TLS_RSA_WITH_AES_256_CBC_SHA256 等强密码套件,则必须通过 oracle.net.ssl_cipher_suites 连接 属性.

启用它

第 6 步:使用 -Djavax.net.debug=all

进行调试

最后,如果您 运行 遇到更多问题,您可以使用 -Djavax.net.debug=all.

打开跟踪以找出发生了什么

==== 使用 JDK7 和 12.1.0.2 修补的瘦驱动程序的示例 =====

java  -Doracle.net.ssl_version='1.2' -Doracle.net.ssl_cipher_suites='(TLS_RSA_WITH_AES_256_CBC_SHA256)' -Doracle.net.ssl_server_dn_match='true' -Djavax.net.ssl.trustStore='truststore.jks' -Djavax.net.ssl.trustStorePassword='welcome1' -Djavax.net.ssl.keyStore='keystore.jks' -Djavax.net.ssl.keyStorePassword='welcome1'  JDBCTest 'jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=host)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=myservice))(security=(ssl_server_cert_dn="CN=name,O=org,L=city,ST=state,C=country")))' 'pdb1' 'welcome1'

==== 使用 JDK8 和 12.1.0.2 修补的瘦驱动程序的示例 =====

java -Doracle.net.ssl_version='1.2' -Doracle.net.ssl_server_dn_match='true' -Djavax.net.ssl.trustStore='truststore.jks' -Djavax.net.ssl.trustStorePassword='welcome1' -Djavax.net.ssl.keyStore='keystore.jks' -Djavax.net.ssl.keyStorePassword='welcome1'  JDBCTest 'jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=host)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=myservice))(security=(ssl_server_cert_dn="CN=name,O=org,L=city,ST=state,C=country")))' 'pdb1' 'welcome1'