如何在 Eclipse 中使用 p12 证书?
Posted
技术标签:
【中文标题】如何在 Eclipse 中使用 p12 证书?【英文标题】:How to use p12 certificate in Eclipse? 【发布时间】:2021-02-22 02:41:51 【问题描述】:访问我们的服务器时出现以下错误..
javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
I have a .p12 certificate..
当我在 Soap UI 中给出 ssl 证书和密码的路径时。它工作得很好..我想在 Java/Eclipse 中做到这一点
https://jackstromberg.com/2013/05/importing-a-ssl-certificate-into-a-java-keystore-via-a-pkcs12-file/
Followed the step 1, 2 and 4 to create keystore and import it..
placed mykeystore and mycertificate in C:\Program Files\Java\jdk1.8.0_261\jre\bin
while importing I am getting following message..
C:\Program Files\Java\jdk1.8.0_261\jre\bin>keytool -v -importkeystore -srckeystore mycertificate.p12 -srcstoretype PKCS12 -destkeystore mykeystore -deststoretype JKS
Importing keystore mycertificate.p12 to mykeystore...
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias fcs certificate successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
[Storing mykeystore]
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore mykeystore -destkeystore mykeystore -deststoretype pkcs12".
在 eclipse 配置文件中添加以下内容
-Djavax.net.ssl.trustStore="C:/Program Files/Java/jdk1.8.0_261/jre/lib/security/cacerts"
-Djavax.net.ssl.trustStorePassword=changeit
Restarted the eclipse and trying to run that but still getting handshake failure..
我的所有程序都正确吗?
启用调试时.. 出现以下错误
javax.net.ssl|ALL|01|main|2020-11-09 18:28:51.118 IST|null:-1|No X.509 cert selected for RSA
javax.net.ssl|WARNING|01|main|2020-11-09 18:28:51.118 IST|null:-1|Unavailable authentication scheme: rsa_pkcs1_sha512
javax.net.ssl|ALL|01|main|2020-11-09 18:28:51.118 IST|null:-1|No X.509 cert selected for EC
另外一个方法,我也试过了。
从浏览器导出的证书..
https://www.javasavvy.com/import-ssl-certificate-into-java-keystore/
仍然出现同样的错误。
【问题讨论】:
那么,您将证书导入mykeystore
,但mykeystore
是否驻留在C:/Program Files/Java/jdk1.8.0_261/jre/lib/security/cacerts
中?
我已经导入了,但是如何检查 mykeystore 是否存在于 cacerts 中?
【参考方案1】:
我认为您的问题是您没有正确配置信任库。
您需要使用创建的密钥库配置javax.net.ssl.trustStore
,例如:
-Djavax.net.ssl.trustStore=/path/to/mykeystore.jks
如果您从C:\Program Files\Java\jdk1.8.0_261\jre\bin
运行keytool
,则密钥库可能在该目录中。尝试类似的方法:
-Djavax.net.ssl.trustStore="/Program Files/Java/jdk1.8.0_261/jre/bin/mykeystore.jks" -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStorePassword=changeit
您还可以指明密钥库类型:
-Djavax.net.ssl.trustStore="/Program Files/Java/jdk1.8.0_261/jre/bin/mykeystore.jks" -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStorePassword=changeit
查看您在设置中遵循的文章,我认为您的密钥非常适合使用安全通信,实际问题是 Eclipse 没有看到正确的密钥库,但请同时考虑以下堆栈溢出问题:Java 11 and 12 SSL sockets fail on a handshake_failure error with TLSv1.3 enabled,也许能帮上忙。
更新
虽然非常适合 SSL 客户端身份验证,但在此特定用例中,配置 javax.net.ssl.keyStore
和 javax.net.ssl.keyStorePassword
解决了问题:
-Djavax.net.ssl.keyStore="C:\Users\3020722\OneDrive - FIS\Desktop\certificate\newjks.jks" \
-Djavax.net.ssl.keyStorePassword=changeit
非常感谢@ChanGan 的反馈!!
【讨论】:
在帖子中创建jks和导入过程是否正确? 是的,我想是的,它看起来找到了。事实上,它在 SoapUI 中工作正常。请尝试使用指定的javax.net.ssl.trustStore
配置启动 Eclipse,我认为它可能会正常工作。
我在导入 C:\Program Files\Java\jdk1.8.0_261\jre\lib\security>"C:\Program Files\Java\jdk1.8.0_261\jre\ bin\keytool" -importkeystore -srckeystore myclientkeystore.jks -destkeystore myclientkeystore.jks -deststoretype pkcs12 输入源密钥库密码:别名 mycertificate.p12 的条目成功导入。导入命令已完成:1 个条目成功导入,0 个条目失败或取消警告:已将“myclientkeystore.jks”迁移到非 JKS/JCEKS。 JKS 密钥库备份为“myclientkeystore.jks.old”。
对不起@ChanGan,恐怕我没有很好地解释自己。您已经很好地创建了密钥库,无需再次创建它。我修改了我的答案:我想说如果你从目录中运行keytool
,而不是你需要再次运行keytool
。请问,你可以试试吗?
不知道出了什么问题。再次添加时显示证书已添加但显示握手错误..【参考方案2】:
在继续之前需要考虑的几个要点。我不确定是否所有这些都在您的上下文中得到解决。所以这些是在继续之前要检查的以下几点。
假设有两个应用程序 App1 和 App2,这两个应用程序正在相互通信。
如果两者都禁用了 ssl,则没有问题。但是如果我们想确保它们之间的流量是加密的,我们需要 SSL。
所以为了让他们两个互相交谈,应该正确检查以下内容。
单向 SSL: App2 的证书必须存在于 App1 的信任库中。 App1 的证书必须存在于 App2 的信任库中。
请注意,信任库与密钥库不同。密钥库包含与应用程序相关的文件。 在这个 App1 中,App2 上下文可以说 C1 是 App1 的证书,C2 是 App2 的证书。
所以密钥库和信任库如下:
App1的KeyStore:C1
App1 的 TrustStore:C2
App2的KeyStore:C2
App2 的信任库:C1
为了更好地理解,让我们介绍带有证书 C3 的 App3,并且所有人都在相互交谈。
现在新场景将是: App1的KeyStore:C1
App1 的信任库:C2、C3
App2的KeyStore:C2
App2 的信任库:C1、C3
App3的KeyStore:C3
App3 的信任库:C1、C2
确保您正确理解这些概念。
所以现在您正尝试从本地应用程序与某些服务器通信。因此,您需要将服务器的证书添加到本地 java cacerts(充当本地信任库)(您提到的是正确的),如果您使用的是 java cacerts,则无需单独提及信任库。
只需尝试检查您是否在 eclipse 中配置了正确的 java 环境。例如,我的机器上有三个版本的 java。 1.8_201、1.8_181 和 java 11。
eclipse 有可能使用最新版本。因此,在这种情况下,请检查项目设置并检查您是否使用了正确的 jdk(您已向其中添加了证书)
要将证书添加到 cacerts,您可以使用以下内容:
$JAVA_HOME/jre/bin/keytool -v -alias -import -file -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass -noprompt
首先尝试确保您能够从命令行启动服务。
$JAVA_HOME/bin/java -jar your.jar
【讨论】:
感谢您的回答.. 我会通过这个 当然...如果需要任何帮助,请告诉我以上是关于如何在 Eclipse 中使用 p12 证书?的主要内容,如果未能解决你的问题,请参考以下文章