当尝试使用12.1.0.2 JDBC Thin驱动程序连接到Oracle Database 12c时,我们遇到了异常。我们正在使用TLSv1.2和JKS证书。但是,我们无法成功连接到数据库。
线程中的异常" main" java.sql.SQLRecoverableException:IO错误: 收到致命警报:handshake_failure
答案 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'