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

时间:2016-08-26 20:22:41

标签: oracle ssl jdbc jks

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

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

1 个答案:

答案 0 :(得分:10)

以下是配置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 Cryptography Extension(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'