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

时间:2011-05-21 09:14:16

标签: java security apache iis ssl

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

现在我的问题如下: 如果我配置ssl上下文以及要发送到IIS的任何客户端证书,则与服务器没有任何关联。是什么让我想到的是,我希望在代码中看到一些由于hanshake故障警告而导致的异常。
通过wireshark监控正在发生的事情,我看不到从IIS到我的应用程序的证书请求,但我注意到在ServerHelloDone之后所有内容都被加密了。
我没想到的是。我认为握手通常是明文的 我使用私钥来解密跟踪,我看到了IIS的证书请求,但是在多次启动和打开新连接之后 我的应用程序作为响应发送回长度为0的证书,IIS回复TLSv1 已完成
之后,数据包停止(即通信结束) 我期待握手警报。

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

由于

3 个答案:

答案 0 :(得分:1)

听起来IIS只需要某些URL的客户端证书(例如,例如http://www.foo,但不是example.com/bar)。

在初始握手中,它不知道您要求的URL,因此它不需要证书。当它发现您正在请求受限资源(/ foo)时,它会重新发送,需要证书。

但是,我仍然希望发生handshake_failure。

答案 1 :(得分:0)

无法提供证书以响应CertificateRequest不是SSL协议错误,因此没有handshake_error。 SSL库会添加“需要”而不仅仅是“需要”客户端证书,如果您不发送一个就可以执行的只是关闭连接。

答案 2 :(得分:0)

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

您可能也对此similar question感兴趣。