Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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握手中,如果服务器发送带有空'的CertificateRequest,我们可以让客户端发送证书吗;认证机构';列表_Java_Ssl_Authentication - Fatal编程技术网

Java 在SSL握手中,如果服务器发送带有空'的CertificateRequest,我们可以让客户端发送证书吗;认证机构';列表

Java 在SSL握手中,如果服务器发送带有空'的CertificateRequest,我们可以让客户端发送证书吗;认证机构';列表,java,ssl,authentication,Java,Ssl,Authentication,我目前正在使用Java开发SSL客户端,需要与需要客户端身份验证的第三方服务器建立https连接。服务器人员给了我一个可信的根CA证书,用于签署客户端和服务器证书。我已将此证书放在我这边的托管库中。服务器人员还拥有根CA证书,用于验证客户端证书 当我尝试在服务器上建立SSL连接时,我看到当服务器发送证书时,握手进行得很顺利,并且我的客户端能够成功地验证它。但作为“证书请求”消息的一部分,服务器不会在“cert Authorities”参数中返回任何根CA证书。因此,我的客户端没有将客户端证书发送

我目前正在使用Java开发SSL客户端,需要与需要客户端身份验证的第三方服务器建立https连接。服务器人员给了我一个可信的根CA证书,用于签署客户端和服务器证书。我已将此证书放在我这边的托管库中。服务器人员还拥有根CA证书,用于验证客户端证书

当我尝试在服务器上建立SSL连接时,我看到当服务器发送证书时,握手进行得很顺利,并且我的客户端能够成功地验证它。但作为“证书请求”消息的一部分,服务器不会在“cert Authorities”参数中返回任何根CA证书。因此,我的客户端没有将客户端证书发送回服务器,握手失败

我正在用WSDL存根编写标准Java代码。我正在利用wsdl2Java ant任务生成的wsdl存根


因此,我的问题是:即使服务器在请求客户端身份验证时发送空的“Cert Authority”列表,我是否可以让java客户端将预先设置的客户端证书发送回服务器。(我阅读了TLS RFC,我发现服务器发送这样的空列表是合法的,在这种情况下,客户端可以发回它认为合适的任何证书。我正试图实现完全相同的行为)。

这没有意义。服务器仍然不会接受它。至少它不应该接受它,如果它正在使用任何常用的SSL实现,它也不会接受它。而且他们根本不可能调整自己的SSL实现

问题出在服务器端。这是错误的配置。您无法在客户端修复它。它应该在
CertificateRequest
消息中向您发送根CA证书或其签名者之一


编辑此答案适用于TLS 1.0。它已被和继任者淘汰。

很抱歉回复这篇古老的帖子,但我无法抗拒

我见过这种握手很有效:

根据javax.net.debug=all

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, Unknown (hash:0x4, signature:0x2), SHA256withECDSA, SHA224withRSA, Unknown (hash:0x3, signature:0x2), SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA
Cert Authorities:
<Empty>
*** ServerHelloDone
matching alias: our_client_cert_alias
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=
***认证请求
证书类型:RSA、DSS、ECDSA
支持的签名算法:SHA512 WithRSA,Unknown(散列:0x6,签名:0x2),SHA512 WithECDSA,SH384WithRSA,Unknown(散列:0x5,签名:0x2),SHA384 WithECDSA,SHA256 WithRSA,Unknown(散列:0x3,签名:0x2),SHA224 WithECDSA,SHA1 WithRSA,SHA1 WithDSA,SHA1 WithECDSA
核证机关:
***海龙石
匹配别名:我们的客户证书别名
***证书链
链[0]=[
[
版本:V3
主题:中国=

但这可能取决于您的HTTP客户端库以及它如何处理SSL/TLS(re)协商。这是在使用Java 8和

时,我们遇到了类似的问题,有点有趣,我们使用的库是spring ws和spring ws支持,在那里您可以创建一个HttpSurlMessageSender bean来进行soap调用,通过设置自定义KeystructoryBean,您可以设置jks密钥库(客户端证书)地点。但我们这里也提到了同样的问题

但是,如果我们使用默认行为(没有HttpSurlMessageSender bean),并通过java.net.ssl.keystore传递密钥库,它会工作,证书授权列表为空,它仍然会发送客户端证书


在我看来,jvm arg触发了一些不同的行为。一些软件甚至有标志来处理这一问题

Hi EJP-感谢您的回复。我在这里处理的是Teradici虚拟化设备,这些设备承载https服务器,它们不一定返回证书身份验证列表。它们指出,如果我向它们发送客户端证书如果他们提供给我,那么服务器将能够成功地验证它(因为它是由他们自己的根CA签名的)。但不幸的是,现在我甚至无法将客户端证书发送回他们。您能告诉我是否有办法做到这一点吗?没有。您必须破解您的本地SSL实现。这是一个bug或错误配置,由他们来修复。没有如果或但是。他们似乎不太了解关于SSL,如果他们将其放回您的计算机上,他们应该这样做。谢谢EJP。我将再次与这些人交谈:)这个答案完全错误,服务器发回一个空的证书是完全正确的[]在证书请求中,许多http客户端实现将只发送您为此http客户端设置的任何密钥。我正在调试无关的ssl问题,并回答此问题,请澄清这一点,以免将来混淆更多ppl。@Leo http客户端不是TLS的实现,密钥也不是证书。请准确。