我有一个连接到许多外部服务的工作应用程序。我正在添加一个需要客户端身份验证的新 SOAP 客户端。我能够让它工作,但不能不破坏应用程序中的其他东西,所以我真的很困惑发生了什么。一些快速背景:
- 我们使用默认的 cacerts 文件,并在那里导入了许多受信任的证书。
- 我们创建了一个私钥,从中生成了一个证书请求,取回了一个证书,并创建了一个 p12 文件,其中包含用于客户端身份验证的证书和私钥。
- 如果我们将该 p12 文件指定为应用程序的密钥库,那么 SOAP 客户端可以工作:
-Djavax.net.ssl.keyStore="keystore.p12" -Djavax.net.ssl.keyStorePassword="password" -Djavax.net.ssl.keyStoreType="pkcs12"
- 如果我们不执行上述操作,而是将其导入 cacerts 文件,则执行以下操作:
keytool -importkeystore -srckeystore keystore.p12 -destkeystore cacerts -srcstoretype pkcs12
这没用!如果我们这样做并在步骤 3 中将 cacerts 指定为密钥库(不包括最后一个 arg,因为它是不同的存储类型,对吗?),它也不起作用
因此,通过第 1-3 步,我们的新集成工作正常,但问题是应用程序中的其他内容现在坏了!之前没有指定其他密钥库(我的理解是它默认为 cacerts 无论如何)。我们现在遇到错误,例如 AWS 的 SES(电子邮件)服务抛出异常,例如:
- java.lang.RuntimeException:无法实例化 com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient 类的实例
- com.amazonaws.AmazonClientException:无法访问默认 SSL 上下文
- java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供者:SunJSSE,类:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
- java.security.UnrecoverableKeyException:无法恢复密钥
有人可以向我解释造成这种冲突的原因以及如何解决它吗?非常感谢您的帮助!
杰夫