2011-05-21 74 views
2

我正在使用https连接到https服务器。
具体而言,我使用apache httpclient,并配置ssl上下文以使用我的密钥库和信任库。
我使用的https服务器是IIS7,并且配置为需要客户端身份验证。
我想我已经正确设置了它。
无论如何,如果我将一个密钥库(即客户端证书)的httpClent的ssl上下文配置为对IIS有效,那么连接就没有问题。现在关于ssl握手和java行为的问题

我的问题是这样的: 如果我做配置与任何客户端证书的SSL上下文发送给IIS,没有与服务器连接。是什么让我觉得,是因为我希望在代码中看到由于hanshake失败警报而导致的一些java异常。
监测wireshark发生了什么,我看不到从IIS到我的应用程序的证书请求,但我注意到ServerHelloDone后,所有内容都被加密了。
我没想到。我认为握手通常是明文的。
我用私人密钥来解密跟踪,我看到了来自IIS的证书请求,但在多次启动和打开新连接之后。
我的应用程序将长度为0的证书作为响应发送回来,IIS回复TLSv1 完成
之后,数据包停止(即似乎通信结束)。
我期待握手警报。

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

感谢

回答

0

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

您可能也对此感兴趣similar question

1

这听起来像IIS只要求对某些URL的客户端证书(即用于example.com/foo,但不example.com/bar)。

在最初的握手过程中,它不知道你正在请求哪个url,所以它不需要证书。当它看到您正在请求受限资源(/ foo)时,它会重新进行请求,需要证书。

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

+0

我认为你说的话对IIS有意义。我不确定TLSv1 Finished消息是什么。它似乎用于关闭ssl连接而不是提示 – Cratylus 2011-05-21 18:32:25

+0

然后重新握手,也就是下面Bruno的回答中的重新协商,被加密。 – 2011-05-27 01:46:56

0

无法提供证书以响应证书请求不是SSL协议错误,因此没有handshake_error。 '需要'而不是'需要'客户证书是由SSL库添加的,如果你不发送一个客户证书,他们所能做的只是关闭连接。