1

我有一个连接到许多外部服务的工作应用程序。我正在添加一个需要客户端身份验证的新 SOAP 客户端。我能够让它工作,但不能不破坏应用程序中的其他东西,所以我真的很困惑发生了什么。一些快速背景:

  1. 我们使用默认的 cacerts 文件,并在那里导入了许多受信任的证书。
  2. 我们创建了一个私钥,从中生成了一个证书请求,取回了一个证书,并创建了一个 p12 文件,其中包含用于客户端身份验证的证书和私钥。
  3. 如果我们将该 p12 文件指定为应用程序的密钥库,那么 SOAP 客户端可以工作:

-Djavax.net.ssl.keyStore="keystore.p12" -Djavax.net.ssl.keyStorePassword="password" -Djavax.net.ssl.keyStoreType="pkcs12"

  1. 如果我们不执行上述操作,而是将其导入 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:无法恢复密钥

有人可以向我解释造成这种冲突的原因以及如何解决它吗?非常感谢您的帮助!

杰夫

4

1 回答 1

0

不确定但很可能:

JKS 格式的私钥条目上的密码与包含存储(文件)上的密码不同,但许多应用程序(包括所有使用javax.net.ssl.keyStore*属性)都无法处理。

确保 p12 上的预导入密码(这是一个涵盖商店和密钥的单一密码)与目标 jks 上的商店密码(cacerts安装时为changeit)相同,或者使用相同的值指定两者-deststorepass -destkeypass

于 2016-05-25T19:50:08.167 回答