Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SSL错误证书错误_Java_Ssl_Ssl Certificate - Fatal编程技术网

Java SSL错误证书错误

Java SSL错误证书错误,java,ssl,ssl-certificate,Java,Ssl,Ssl Certificate,我无法使用Java程序连接到安全站点。我已经从我将要连接的服务器导入了3个证书;公共、内部和根证书。我已将3个证书正确导入java cacerts。并在使用以下参数调用Java类时指定: java -Djavax.net.debug=ssl Djavax.net.ssl.keystore=JAVACACERTS -Djavax.net.ssl.keystorePassword=changeit -server -cp $CLASSPTH -Xmx500m SendOrderResponse 但

我无法使用Java程序连接到安全站点。我已经从我将要连接的服务器导入了3个证书;公共、内部和根证书。我已将3个证书正确导入java cacerts。并在使用以下参数调用Java类时指定:

java -Djavax.net.debug=ssl
Djavax.net.ssl.keystore=JAVACACERTS -Djavax.net.ssl.keystorePassword=changeit -server -cp $CLASSPTH -Xmx500m SendOrderResponse
但是,我得到了一个“坏证书”错误。我查看了日志的详细信息,似乎根证书不在证书链中


知道为什么会这样吗?我什么时候在Java cacerts中导入了3个证书?我假设由于证书链错误而抛出了错误的证书。

看起来您没有使用客户端证书

在这种情况下,不要在客户端应用程序中设置
javax.net.ssl.keystore
参数。仅导入信任库中的根(可能是中间)证书(默认情况下,
cacerts
)也应该足够了


关于keystore/truststore的更多详细信息,请参见此答案:

看起来您没有使用客户端证书

在这种情况下,不要在客户端应用程序中设置
javax.net.ssl.keystore
参数。仅导入信任库中的根(可能是中间)证书(默认情况下,
cacerts
)也应该足够了


有关密钥库/信任库的更多详细信息,请在此回答中回答:

如果已导入证书,请尝试此操作

Set PATH=<YOUR JRE/BIN>;%PATH%
设置路径=;%路径%

然后运行java客户端

如果已导入证书,请尝试以下操作

Set PATH=<YOUR JRE/BIN>;%PATH%
设置路径=;%路径%
然后运行java客户端

我建议您运行:

openssl s_client -connect remoteserver:443
假设远程服务器需要或请求客户端证书身份验证,它应该向您发送可接受CA的列表

您应该发送最终由这些CA之一签名的证书。 ssl规范不要求您发送CA,但是您应该向该CA发送证书和完整的中间链。 我的经验是,两个CA证书可能看起来非常相似。在这方面,迁移到2048位没有帮助。仔细检查

作为补充说明,您的客户端收到了坏证书警报。问题在于客户端发送的证书,而不是服务器证书的验证

(编辑) 我有没有提到你发送的证书必须是有效的?特别是,

  • 未过期的结束日期和合理的开始日期
  • 与您连接的计算机的公共DNS服务器名称相匹配的CN:服务器可能正在客户端IP上执行反向DNS查找,并将其与发送的证书的CN相匹配
我建议你跑步:

openssl s_client -connect remoteserver:443
假设远程服务器需要或请求客户端证书身份验证,它应该向您发送可接受CA的列表

您应该发送最终由这些CA之一签名的证书。 ssl规范不要求您发送CA,但是您应该向该CA发送证书和完整的中间链。 我的经验是,两个CA证书可能看起来非常相似。在这方面,迁移到2048位没有帮助。仔细检查

作为补充说明,您的客户端收到了坏证书警报。问题在于客户端发送的证书,而不是服务器证书的验证

(编辑) 我有没有提到你发送的证书必须是有效的?特别是,

  • 未过期的结束日期和合理的开始日期
  • 与您连接的计算机的公共DNS服务器名称相匹配的CN:服务器可能正在客户端IP上执行反向DNS查找,并将其与发送的证书的CN相匹配

是否有“坏证书”错误后的其他详细信息?hi@ringbearer,这是Java引发的唯一异常:javax.net.ssl.SSLHandshakeException:收到致命警报:坏证书是否有“坏证书”错误后的其他详细信息?hi@ringbearer,这是Java引发的唯一异常:javax.net.ssl.SSLHandshakeException:Received fatal alert:bad_certificateHi@Bruno,感谢您提供的信息。我已经尝试了您所说的,删除了客户端应用程序中的javax.net.ssl.keystore参数,只导入了根,还尝试了javacacerts中的中间证书,但是我仍然得到了坏的证书错误。顺便说一下,我也尝试过使用
openssl s\u connect-connect SERVERHOST:443
,它返回了以下错误:
CONNECTED(00000003)depth=1/C=US/O=trust,Inc./OU=www.trust.net/rpa通过引用合并/OU=(C)2009委托,Inc./CN=委托证书颁发机构-L1C验证错误:num=20:无法获取本地颁发者证书验证返回:0 3110:错误:14094412:SSL例程:SSL3_读取_字节:sslv3警报错误证书:s3_pkt.c:1052:SSL警报编号42 3110:错误:140790E5:SSL例程:SSL23_写入:SSL握手失败:s23_lib.c:226:
您遇到的OpenSSL错误获取是正常的:默认情况下,它没有可信证书列表,您应该检查它的
-CApath
/
-CAfile
选项。您好@Bruno,谢谢您提供的信息。我已经尝试了您所说的,删除了客户端应用程序中的javax.net.ssl.keystore参数,只导入了根,还尝试了javacacerts中的中间证书,但是我仍然得到了坏的证书错误。顺便说一下,我也尝试过使用
openssl s\u connect-connect SERVERHOST:443
,它返回了以下错误:
CONNECTED(00000003)depth=1/C=US/O=trust,Inc./OU=www.trust.net/rpa通过引用合并/OU=(C)2009委托,Inc./CN=委托证书颁发机构-L1C验证错误:num=20:无法获取本地颁发者证书验证返回:0 3110:错误:14094412:SSL例程:SSL3\u读取字节:sslv3警报