【问题标题】:Oracle Database TLS1.2 / SSL connection using JDBC thin and JKS使用 JDBC Thin 和 JKS 的 Oracle 数据库 TLS1.2/SSL 连接
【发布时间】:2017-01-03 14:09:18
【问题描述】:

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

线程“主”java.sql.SQLRecoverableException 中的异常:IO 错误: 收到致命警报:handshake_failure

【问题讨论】:

    标签: oracle ssl jdbc jks


    【解决方案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 但不是运气。我已经在堆栈中提出了问题stackoverflow.com/questions/66372287/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2021-08-01
    • 2014-11-11
    • 2014-04-15
    • 2021-10-24
    • 2021-01-29
    • 2021-07-11
    相关资源
    最近更新 更多