Java 如何在Eclipse中使用p12证书?

Java 如何在Eclipse中使用p12证书?,java,ssl,Java,Ssl,我在访问我们的服务器时遇到以下错误 javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败 I have a .p12 certificate.. 当我在Soap UI中给出ssl证书和密码的路径时。它工作得很好。。我想在Java/Eclipse中实现它 在eclipse配置文件中添加了以下内容 -Djavax.net.ssl.trustStore="C:/Program Files/Java/jdk1.8.0_261/jre/lib/se

我在访问我们的服务器时遇到以下错误

javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败

I have a .p12 certificate..
当我在Soap UI中给出ssl证书和密码的路径时。它工作得很好。。我想在Java/Eclipse中实现它

在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
另一方面,我也试过了

从浏览器导出的证书


仍然出现相同的错误。

我认为您的问题在于未正确配置信任存储

您需要使用创建的密钥库配置
javax.net.ssl.trustStore
,如下所示:

-Djavax.net.ssl.trustStore=/path/to/mykeystore.jks
如果从
C:\Program Files\Java\jdk1.8.0\u 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没有看到正确的密钥存储库,但请同时考虑下面的堆栈溢出问题:如果可以帮助的话,

更新

尽管非常适合SSL客户端身份验证,但在此特定用例中,配置
javax.net.SSL.keyStore
javax.net.SSL.keystrepassword
解决了以下问题:

-Djavax.net.ssl.keyStore="C:\Users\3020722\OneDrive - FIS\Desktop\certificate\newjks.jks" \
-Djavax.net.ssl.keyStorePassword=changeit

非常感谢您的反馈@长安

>P>在进行前应考虑的几个要点。我不确定是否所有这些问题都在你的背景下得到了解决。因此,在继续之前,需要检查以下几点

假设有两个应用程序App1和App2,这两个应用程序正在相互通信

如果两者都禁用了ssl,则没有问题。但如果我们想确保它们之间的通信是加密的,我们需要SSL

因此,为了让他们彼此交谈,应适当检查以下内容

单向SSL: App2的证书必须存在于App1的信任存储中。 App1的证书必须存在于App2的信任存储中

请注意,信任存储不同于密钥存储。密钥库包含与应用程序相关的文件。 在这个App1、App2上下文中,C1是App1的证书,C2是App2的证书

因此,密钥存储和信任存储将如下所示:

App1的密钥库:C1

App1的信任库:C2

App2的密钥库:C2

App2的信任存储区:C1

为了更好地理解,让我们介绍带有证书C3的App3,所有人都在相互交谈

现在,新的情况将是: App1的密钥库:C1

App1的信任存储区:C2,C3

App2的密钥库:C2

App2的信任存储区:C1、C3

App3的密钥库: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您的.jar,您将证书导入了
mykeystore
,但是
mykeystore
是否驻留在
C:/Program Files/Java/jdk1.8.0_261/jre/lib/security/cacerts
中?我已经导入了,但是如何检查cacerts中是否存在mykeystore?文章中jks的创建和导入过程是否正确?是的,我想是的,看起来很好。事实上,它在SoapUI中工作正常。请尝试使用指定的
javax.net.ssl.trustStore
配置启动Eclipse,我认为它可能会正常工作。在导入C:\Program Files\Java\jdk1.8.0\U 261\jre\lib\security>“C:\Program Files\Java\jdk1.8.0\U 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
。拜托,你能试试吗?不知道出了什么问题。它显示再次添加时已添加证书,但显示握手错误..谢谢回答。。我会经历这一切当然。。。如果需要帮助,请告诉我
-Djavax.net.ssl.keyStore="C:\Users\3020722\OneDrive - FIS\Desktop\certificate\newjks.jks" \
-Djavax.net.ssl.keyStorePassword=changeit