4

我使用HTTPWebRequest访问需要客户端证书的页面!如何检测HTTPWebRequest中的客户端证书身份验证请求?

我使用下面的代码,一切正常!

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(textBox1.Text); 

    X509Certificate2 userCert = SelectClientCertificate(); 
    if (userCert != null) myReq.ClientCertificates.Add(userCert); 

    HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse(); 

现在,这里是我的问题,因为我的电话SelectClientCertificate()显示一个对话框,让用户选择一个证书,我不想显示对话框,如果服务器不要求客户端身份验证!其实我正在寻找Internet Explorer的行为主义。如果访问服务器需要用户客户端认证的页面,则会显示证书选择对话框,否则不显示!

我看着AuthenticationManager,但我不确定是否真的需要注册我自己的AuthenticationModule!所以对我有什么暗示?

我也检查了403或403.7的StatusCode,但现在与我一起工作的服务器在丢失证书的情况下也会返回200,内容说我没有被授权!

+0

嗨,你有没有找到解决这个问题? – Zaky 2012-10-10 12:22:54

+0

嗨,我也有兴趣在解决方案,如果你有一个。 – ianbeks 2013-04-11 11:34:56

+0

我有同样的问题。 – justcoding124 2014-04-30 21:08:32

回答

0

为什么你想检查服务器想要什么?它的请求通过https运行,只是要求提供证书。

如果我没记错的话,服务器没有义务给任何人做任何事情。开始与SSL握手的通信并且客户端/服务器在任何真正的HTTP通信发生之前交换其证书是客户的责任。您无法检测服务器是否“要求”您提供证书。如果您尝试与之交谈,并且如果您没有从证书开始,并且服务器需要证书,则服务器将断开连接并保持沉默,或者它可能会返回一些随机错误代码。

在尝试创建/发送请求之前,您可以尝试尽早检测服务器是否尝试握手,但是您必须在TCP层下面执行一层。尝试检查描述HTTPS协商的RFC或可能的握手信号,这可能会对您有所帮助。

或者只是尝试执行HTTP无需S请求,如果失败,请重新提交证书并使用HTTPS重试。我认为你的用户会存活下来。

+0

如果需要的服务器将请求客户端发送其证书。检查SSL中的相互身份验证。你的陈述是错误的。 – justcoding124 2014-04-30 21:10:35

+0

它可能听起来有点混乱,因为我混合了一般答案和关于HttpWebRequest类的可能性的提示。问题在于,(AFAIR)HWR类没有公开任何“I-Demand-A-Certificate”事件或扩展点。您必须在没有证书的情况下运行请求,并且无法准备其失败(例如,带有证书的重试),或者必须提前提供证书,然后才能发送第一个请求。奇怪的是,相同的HWR类和框架的其余部分为您提供了扩展点,使您能够即时验证服务器的证书。我不明白他们的愿景。 – quetzalcoatl 2014-04-30 22:51:42

+1

我想在SslStream类中使用LocalCertificateSelectionCallback。但它并没有在HttpWebRequest类中公开。 http://msdn.microsoft.com/en-us/library/system.net.security.localcertificateselectioncallback.aspx – justcoding124 2014-05-01 13:21:06

相关问题