我一直在努力通过JDBC实现MySQL SSL连接。
我已经将CA证书导入到自定义JKS信任库中,并将客户端密钥和客户端证书作为自定义JKS密钥库中的PKCS12,然后将它们作为参数传递给下面的代码。
jdbc:mysql://hostname:port/dbname?useSSL=true&requireSSL=true&trustCertificateKeyStoreUrl=file:///path/to/truststore_mysql.ks&trustCertificateKeyStorePassword=mypass&clientCertificateKeyStoreUrl=file:///path/to/keystore_cert_mysql.ks&clientCertificateKeyStorePassword=mypass
但由于以下原因而无法工作:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
启用SSL调试,我可以看到:
%% Invalidated: [Session-1, TLS_DHE_RSA_WITH_AES_256_CBC_SHA]
http-nio-8080-exec-4, SEND TLSv1 ALERT: fatal, description = certificate_unknown
http-nio-8080-exec-4, WRITE: TLSv1 Alert, length = 2
http-nio-8080-exec-4, called closeSocket()
奇怪的是,一切都可以通过keystore和truststore文件作为VM参数传递。
-Djavax.net.ssl.keyStore=/path/to/keystore_cert_mysql.ks
-Djavax.net.ssl.keyStorePassword=mypass
-Djavax.net.ssl.trustStore=/path/to/truststore_mysql.ks
-Djavax.net.ssl.trustStorePassword=mypass
问题是:为什么不使用JDBC连接URL参数?
在此先感谢您的英语。