我正在尝试使用MySQL
(版本database
)和此Java
与MySQL Connector/J
5.1.45
AWS RDS
建立SSL连接证书在这里:https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
但我得到以下Exception
:
java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
我可以将此例外追溯到MySQL Connector/J
上的ExportControlled.java
班line 297
:
CertPathValidatorResult result = this.validator.validate(certPath, this.validatorParams);
然后我无法继续下去,因为这会进入JRE
安全类,例如CertPathValidator
。
由于我使用MySQL Connector/J
来完成整个SSL
法术,我的双手并列,我不知道发生了什么或如何解决这个问题。证书在MySQL Workbench
和Intelli J IDEA Database
上正常工作,所以我不知道为什么它现在被拒绝了。
如何解决此问题?
答案 0 :(得分:6)
我解决了很多令人头疼的问题。信任库需要拥有链的所有证书,我使用https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem,其中IN THEORY拥有所有证书,但是当您将其导入密钥库文件时,keytool
将忽略除第一个证书之外的所有证书,所以我只在我的密钥库上有根证书,而不是我实际需要的root和AWS Region证书。
目前,还没有办法导入所有证书,我尝试了几种方法,包括转换为PKCS7(支持证书链),但是keytool
需要每个证书的一个别名,所以你需要导入每个证书并给它一个别名,一个当时。
你可以制作一个程序来调用keytool
并一次加载一个证书,否则你可能会像我一样懒得并使用KeyStore Explorer。您需要选择创建新的密钥库文件并使用pem
选项打开捆绑的Examine File
证书,并为其上的每个证书选择import
,这会将所选证书导入到新的密钥库。最后,您只需为密钥库文件定义密码并保存即可。
答案 1 :(得分:2)
AWS现在提供了单独的证书,而不仅仅是捆绑包,它具有您不需要的额外内容。参见Using SSL to Encrypt a Connection to a DB Instance。
您将需要下载两个证书:根证书和您所在地区的中间证书。如上面的链接所述,
可以在以下位置下载适用于所有区域的根证书: https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem。
和中间证书可以在页面下方找到。您必须使用适合您所在区域的一种,即数据库实例所在的区域。
您必须使用keytool将它们都导入到新的密钥库中,并告诉MySQL通过trustCertificateKeyStoreUrl
和trustCertificateKeyStorePassword
参数使用该密钥库。
我还有进一步的任务,使所有这些都可以与Tomcat一起使用。我无法通过连接URL进行设置。有效的方法是将连接池中的connectionProperties
设置为useSSL=true;requireSSL=true;verifyServerCertificate=true;trustCertificateKeyStoreUrl=file://[absolute path to keystore file];trustCertificateKeyStorePassword=[keystore password]
答案 2 :(得分:1)
几个小时前,当我搬到5.1.45
时,我得到了完全相同的错误。
现在尝试使用5.1.42
查看问题是否消失。
答案 3 :(得分:1)
另一个问题是MySQL documentation似乎不正确。
它描述了以下连接属性:
var array = GetValues();
var age = array.First(x => x.Name == "John Doe").Age;
正确的连接参数是:
clientCertificateKeyStoreUrl=file:path_to_truststore_file
clientCertificateKeyStorePassword=mypassword
在页面的“用户评论”部分中有对此效果的注释。