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

Nir*_*ala 7 oracle ssl jdbc jks

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

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

Jea*_*ene 10

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

步骤1:为bug 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'
Run Code Online (Sandbox Code Playgroud)

====使用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'
Run Code Online (Sandbox Code Playgroud)