使用 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'
当尝试使用 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'