当前位置:  开发笔记 > 编程语言 > 正文

如何使用Java中的SSL和pkcs12文件连接到安全的网站?

如何解决《如何使用Java中的SSL和pkcs12文件连接到安全的网站?》经验,为你挑选了2个好方法。

我有一个pkcs12文件.我需要使用它来使用https协议连接到网页.我遇到了一些代码,为了连接到安全的网页,我需要设置以下系统属性:

System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStore", "new_cert.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "newpass");

我有p12(pkcs12)文件.我只需要一个信任库文件.

我使用以下方法提取证书:

openssl.exe pkcs12 -in c:/mykey.p12 -out c:/cert.txt -nokeys -clcerts

现在将证书PEM文件转换为der

openssl.exe x509 -in c:/cert.txt -outform DER -out c:/CAcert.der 

现在将der文件添加到密钥库

keytool -import -file C:/Cacert.der -keystore mytruststore

现在我有了信任库,但是当我使用它时,我收到以下错误

Exception in thread "main" java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)

更新:删除某些属性并仅设置"trustStore","trustStorePassword"和"trustStoreType"属性后,我得到以下异常

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

请帮忙.



1> user27221..:

对于遇到类似情况的任何人,我能够解决上面的问题,如下所示:

    重新生成pkcs12文件,如下所示:

    openssl pkcs12 -in oldpkcs.p12 -out keys -passout pass:tmp
    openssl pkcs12 -in keys -export -out new.p12 -passin pass:tmp -passout pass:newpasswd
    

    从导入服务器的CA证书导入信任库(无论是你自己,还是在Java密钥库$JAVA_HOME/jre/lib/security/cacerts,密码:changeit).

    设置以下系统属性:

    System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
    System.setProperty("javax.net.ssl.keyStore", "new.p12");
    System.setProperty("javax.net.ssl.keyStorePassword", "newpasswd");
    

    测试你的网址.

礼貌@ http://forums.sun.com/thread.jspa?threadID=5296333


@Fredrik--对我来说似乎完全合情合理.我认为在FAQ中可能还有一些东西.

2> 小智..:

由于50ps阈值,我无法评论,但我不认为/sf/ask/17360801/中提供的答案是正确的.您实际描述的是如何将服务器证书插入系统默认信任库:

$JAVA_HOME/jre/lib/security/cacerts, password: changeit)

这确实有效,但这意味着您没有真正指定项目本地的信任存储,而是在系统中普遍接受该证书.

您实际上从未使用您在此处定义的自己的信任库:

System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有