2011-12-13 297 views
0

我无法使用Java程序连接到安全站点。我从服务器中导入了3个证书,我将连接到这些证书;公共,国际和根证书。我已经正确地将3个证书导入java cacerts。并且在使用以下参数调用Java类时指定:SSL错误证书错误

java -Djavax.net.debug=ssl 
Djavax.net.ssl.keystore=JAVACACERTS -Djavax.net.ssl.keystorePassword=changeit -server -cp $CLASSPTH -Xmx500m SendOrderResponse 

但是,我收到了“bad_certificate”错误。我查看了日志的详细信息,似乎根证书不在证书链中。

任何想法为什么发生?当我在Java cacerts中导入3个证书时?我认为由于证书链错误而导致错误的证书被抛出。

+0

是否有任何额外的细节后面跟着“BAD_CERTIFICATE”错误? –

+0

hi @ringbearer,这是Java抛出的唯一异常:javax.net.ssl.SSLHandshakeException:收到致命警报:bad_certificate – user981905

回答

1

它看起来像你没有使用客户端证书。

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

更多关于这个答案密钥库/信任细节:https://stackoverflow.com/a/6341566/372643

+0

嗨@Bruno,感谢您的信息。 我已经尝试了你所说的,删除了javax.net.ssl。keystore参数在我的客户端应用程序中,并且只导入了根目录,并且在javacacerts中使用了中间证书,但我仍然遇到了bad_certificate错误。 – user981905

+0

顺便说一句,我也尝试过使用 'openssl s_connect -connect SERVERHOST:443' 并返回以下错误: 'CONNECTED(00000003) depth = 1/C = US/O = Entrust,Inc./OU = www.entrust.net/rpa通过引用合并/ OU =(c)2009 Entrust,Inc./CN=Entrust证书颁发机构 - L1C 验证错误:num = 20:无法获得本地颁发者证书 验证返回值:0 3110:错误:14094412:SSL例程:SSL3_READ_BYTES:sslv3警报错误证书:s3_pkt.c:1052:SSL警报编号42 3110:错误:140790E5:SSL例程:SSL23_WRITE:ssl握手失败:s23_lib.c:226: – user981905

+1

你得到的OpenSSL错误是正常的:默认情况下,它没有可信任证书列表,你应该检查它的'-CApath' /'-CAfile'选项。 – Bruno

-1

如果导入证书不是尝试这个

Set PATH=<YOUR JRE/BIN>;%PATH% 

,比运行Java客户端

+1

这将如何解决'坏证书'异常? – EJP

2

我建议你运行:

openssl s_client -connect remoteserver:443 

假设远程服务r要求或请求客户端证书认证,它应该向您发送可接受CA的列表。

您应该发送最终由其中一个CA签名的证书。 ssl规范不要求您发送CA,但您应该将证书和完整的中间链发送到该CA. 我的经验是,两个CA证书可能看起来彼此非常相似。在这方面,转向2048位并没有帮助。再检查一遍。

作为便笺,您的客户端收到了的错误证书警报。问题在于您的客户端发送的证书,而不是服务器证书的验证。

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

  • 非过期的结束日期和明智的开始日期
  • 一个CN符合你是从连接机器的公共DNS服务器名称:服务器可能是客户端IP上进行反向DNS查找并将其与发送的证书的CN进行匹配。