2016-05-25 68 views
1

我有一个连接到很多外部服务的工作应用程序。我正在添加一个需要客户端身份验证的新SOAP客户端。我可以让它工作,但不是在不打破应用程序中的其他事情的情况下,所以我对于发生的事情感到非常困惑。一些快速背景:Java客户端证书冲突

  1. 我们使用默认的cacerts文件,并在那里导入了很多可信任的证书。
  2. 我们创建了一个私钥,生成了一个证书请求,获得了证书,并创建了一个包含用于客户端身份验证的证书和私钥的p12文件。
  3. 如果我们指定P12文件作为密钥存储的应用程序的SOAP客户端的工作原理:

-Djavax.net.ssl.keyStore = “keystore.p12” -Djavax.net.ssl.keyStorePassword =”密码” -Djavax.net.ssl.keyStoreType = “PKCS12”

  • 如果我们不这样做上述情况,而是导入到cacerts文件这个做:
  • 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:无法恢复密钥

    有人可以向我解释什么是造成这种冲突和如何解决它?非常感谢您的帮助!

    杰夫

    +0

    您是否检查过您是否拥有访问jre安全库/文件夹的管理员权限。有时如果你没有管理权限,你可能会遇到这种例外情况。 –

    +0

    Cacerts是信任商店而不是关键商店。 – beny23

    +0

    我有权访问cacerts - 我已经添加了证书以信任那里,这工作得很好。我对关键和信任商店之间的区别感到困惑。从概念上讲,我明白了,但是当我指定一个特定的密钥存储区时,其他东西就会中断,而没有其他配置。对于每个java文档和我的文件,它看起来应该放到keystore的cacerts中。 – Jeff057

    回答

    0

    不能肯定,但可能:

    JKS格式可以对包括所有使用javax.net.ssl.keyStore*性质从含有店(文件)的密码,但许多应用程序不同的一个专用密钥条目的密码不能处理那个。

    要么确保在P12上的进口预密码(这是覆盖存储和密钥的单一密码)是相同的目标JKS的存储密码(这为cacerts的安装是changeit)或指定两个-deststorepass -destkeypass具有相同的值。

    +0

    谢谢戴夫。我厌倦了重新生成密码为“changeit”的p12,再次导入cacerts(覆盖相同的别名)并得到相同的结果。任何其他想法? – Jeff057

    +0

    @ Jeff057:令人惊讶。请尝试'keytool -keystore cacerts -certreq -alias $ name'并查看它提示的内容:仅密钥库密码或密钥密码。 (我知道我们不需要另一个CSR;丢弃任何输出,这只是一个测试。)如果'keytool'只能使用存储密码访问,那么JSSE也应该。 –

    +0

    再次感谢戴夫的回应!我运行了命令,它只提示密钥库密码(changeit),然后打印证书。所以它*应该*工作,但不... – Jeff057