Java客户端证书冲突

时间:2016-05-25 16:24:38

标签: java security client-certificates certificate-store

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

  1. 我们正在使用默认的cacerts文件,并在那里导入了许多可信证书。
  2. 我们创建了一个私钥,从中生成了一个cert req,获得了一个证书,并创建了一个p12文件,其中包含用于客户端身份验证的证书和私钥。
  3. 如果我们将p12文件指定为SOAP客户端工作的应用程序的密钥库:
  4. -Djavax.net.ssl.keyStore =“keystore.p12”-Djavax.net.ssl.keyStorePassword =“password”-Djavax.net.ssl.keyStoreType =“pkcs12”

    1. 如果我们不这样做,而是将其导入到cacerts文件中:
    2. keytool -importkeystore -srckeystore keystore.p12 -destkeystore cacerts -srcstoretype pkcs12

      它不起作用!如果我们这样做并且将cacerts指定为每个步骤3的密钥库(不包括最后一个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:无法恢复密钥

      有人可以向我解释造成这场冲突的原因以及解决方法吗?非常感谢你的帮助!

      杰夫

1 个答案:

答案 0 :(得分:0)

不确定但很可能:

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

确保p12上的导入前密码(包含商店和密钥的单个密码)与目标jks上的商店密码相同(安装的cacerts为{ {1}})或指定两个changeit具有相同的值。