如何在 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.keyStorejavax.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 证书?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascripts forge 从 p12 证书中获取证书信息?

mac下 空密码P12证书如何安装

如何保护 iOS p12 分发证书?

在 C# 中使用 p12 证书从 SFTP 下载文件

使用 PHP 从 p12 证书文件中获取信息

如何发送 iOS - 带有 P12 证书的 APN 通知 - C# 示例