关于java中ssl握手和行为的问题

关于java中ssl握手和行为的问题,java,security,apache,iis,ssl,Java,Security,Apache,Iis,Ssl,我正在使用https连接到https服务器。 具体来说,我使用的是apache httpclient,我配置ssl上下文以使用我的密钥库和信任库。 我使用的https服务器是IIS7,配置为需要客户机身份验证。 我想我已经设置好了。 无论如何,如果我使用对IIS有效的密钥库(即客户端证书)配置httpClent的ssl上下文,则连接没有问题 现在我的问题如下: 如果我使用任何客户端证书配置ssl上下文以发送到IIS,则与服务器没有连接。然而,让我想到的是,由于hanshake故障警报,我希望在代

我正在使用https连接到https服务器。
具体来说,我使用的是apache httpclient,我配置ssl上下文以使用我的密钥库和信任库。
我使用的https服务器是IIS7,配置为需要客户机身份验证。
我想我已经设置好了。
无论如何,如果我使用对IIS有效的密钥库(即客户端证书)配置httpClent的ssl上下文,则连接没有问题

现在我的问题如下: 如果我使用任何客户端证书配置ssl上下文以发送到IIS,则与服务器没有连接。然而,让我想到的是,由于hanshake故障警报,我希望在代码中看到一些java异常。
在监视wireshark的情况时,我看不到IIS向我的应用程序发出的证书请求,但我注意到在ServerHelloDone之后,所有内容都被加密了。
我没有料到。我认为握手通常是明文的。
我使用私钥对跟踪进行解密,我看到一个来自IIS的证书请求,但在多次启动和打开新连接之后。
我的应用程序将长度为0的证书作为响应发送回,IIS以TLSv1完成的方式进行响应
在此之后,数据包停止(即,通信似乎结束)。
我在等一个握手提醒

我的问题是,它应该是这样工作的还是至少IIS是这样工作的?
或者,如果我没有看到警报,我的用例是否有问题


谢谢

听起来IIS只需要特定URL的客户端证书(例如,example.com/foo,但不需要example.com/bar)

在初始握手中,它不知道您正在请求哪个url,因此不需要证书。当它看到您正在请求受限资源(/foo)时,它会重新处理shake,需要证书


但是,我仍然希望发生握手失败。

未能提供证书以响应CertificateRequest不是SSL协议错误,因此不存在握手错误。”SSL库添加了“需要”而不是“需要”客户端证书,如果您不发送证书,它们所能做的就是关闭连接。

正如我在中所说的,据我所知,IIS使用重新协商来获取客户端证书。您应该能够使用
netsh
clientcertnegotiate=enable
更改此行为(取决于您使用的IIS版本)


您可能也对此感兴趣。

我认为您所说的有关IIS的内容是有意义的。我不确定TLSv1完成的消息是什么。它似乎用于关闭ssl连接,而不是警报,并且重新握手(也就是下面Bruno的回答中的重新协商)是加密的。