Java上的SSL异常:Path不与任何信任锚链接

时间:2018-01-16 17:06:44

标签: java amazon-web-services ssl amazon-rds mysql-connector

我正在尝试使用MySQL(版本database)和此JavaMySQL 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.javaline 297

CertPathValidatorResult result = this.validator.validate(certPath, this.validatorParams);

然后我无法继续下去,因为这会进入JRE安全类,例如CertPathValidator

由于我使用MySQL Connector/J来完成整个SSL法术,我的双手并列,我不知道发生了什么或如何解决这个问题。证书在MySQL WorkbenchIntelli J IDEA Database上正常工作,所以我不知道为什么它现在被拒绝了。

如何解决此问题?

4 个答案:

答案 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通过trustCertificateKeyStoreUrltrustCertificateKeyStorePassword参数使用该密钥库。

我还有进一步的任务,使所有这些都可以与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

在页面的“用户评论”部分中有对此效果的注释。