使用 JDBC Thin 和 JKS 的 Oracle 数据库 TLS1.2/SSL 连接
Posted
技术标签:
【中文标题】使用 JDBC Thin 和 JKS 的 Oracle 数据库 TLS1.2/SSL 连接【英文标题】:Oracle Database TLS1.2 / SSL connection using JDBC thin and JKS 【发布时间】:2017-01-03 14:09:18 【问题描述】:当尝试使用 12.1.0.2 JDBC Thin 驱动程序连接到 Oracle Database 12c 时,我们遇到了异常。我们正在使用带有 JKS 证书的 TLSv1.2。但是,我们无法成功连接到数据库。
线程“主”java.sql.SQLRecoverableException 中的异常:IO 错误: 收到致命警报:handshake_failure
【问题讨论】:
【参考方案1】:以下是配置 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 和额外的属性。另一方面,JKS 文件在 JRE 中受到原生支持,并且根据我的经验,它一直运行良好。
第 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'
【讨论】:
这是在 Thin-JDBC 12.2.0.1 中修复的顺便说一句 @eckes 感谢您指出这一点。我已经相应地编辑了答案。 我遇到了类似的问题,我得到了 java.sql.SQLRecoverableException: IO Error: Connection reset。在 Oracle RDS 服务器 12.2.01 上更新到 SSL 1.2 后会发生这种情况。我改用了 ojdbc8.jar 但不是运气。我已经在堆栈中提出了问题***.com/questions/66372287/…以上是关于使用 JDBC Thin 和 JKS 的 Oracle 数据库 TLS1.2/SSL 连接的主要内容,如果未能解决你的问题,请参考以下文章
谁能解释下jdbc:oracle:thin:@localhost:1521:orcl和jdbc:oracle:thin:@localhost:1521/orcl的区别?