【问题标题】:How to detect Client Certificate Authentication request in HTTPWebRequest?如何在 HTTPWebRequest 中检测客户端证书身份验证请求?
【发布时间】:2012-02-15 13:37:58
【问题描述】:

我正在使用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!有什么提示吗?

我还检查了StatusCode 的 403 或 403.7,但我现在正在使用的服务器也会在缺少证书的情况下返回 200,内容说我没有被授权!

【问题讨论】:

  • 您好,您找到解决此问题的方法了吗?
  • 您好,如果您有解决方案,我也对解决方案感兴趣。
  • 我也有同样的问题。

标签: c# .net httpwebrequest http-authentication client-certificates


【解决方案1】:

为什么要检查服务器想要什么?如果请求通过 https 运行,只需请求证书即可。

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

您可以尝试在尝试创建/发送请求之前及早检测服务器是否尝试进行握手,但您必须在 TCP 层的下一层进行。尝试检查描述 HTTPS 协商或握手的可预见性的 RFC,也许这会对您有所帮助。

或者只是尝试执行一个不带 S 的 HTTP 请求,如果它失败,重做请求证书并使用 HTTPS 重试。我认为您的用户会幸存下来。

【讨论】:

  • 如果需要,服务器会请求客户端发送其证书。查看 SSL 中的相互身份验证。你的说法是错误的。
  • 听起来可能有点混乱,因为我将一般答案与有关 HttpWebRequest 类可能实现的提示混合在一起。关键是,(AFAIR)HWR 类不公开任何“I-Demand-A-Certificate”事件或可扩展点。您必须在没有证书的情况下运行请求并为失败做好准备(即使用证书重试),或者您必须在发送第一个请求之前尽早提供证书。奇怪的是,相同的 HWR 类和框架的其余部分为您提供了扩展点,允许您即时验证服务器的证书。我不明白他们的想法。
  • 我想 LocalCertificateSelectionCallback 用于 SslStream 类。但它没有在 HttpWebRequest 类中公开。 msdn.microsoft.com/en-us/library/…
  • 这是非常有用的发现!在正确的时间到达它可能并不容易,因为我们需要在连接开始之后但在它内部通过该步骤之前附加处理程序。我不知道如何从 HWReq 获取 SslStream 实例,但我猜它是在启动后懒惰地创建的。但我很确定,到RemoteCertificateValidationCallback 时,流已经启动并运行了。因此,实际上有可能附加一个虚拟的 RemCerValiCbk,然后在其中从请求实例中破解 SslStream 并连接到 LocalCertificateSelectionCallback!
猜你喜欢
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2011-04-09
  • 2013-10-07
  • 2011-04-13
  • 1970-01-01
  • 2022-06-23
  • 2018-02-12
相关资源
最近更新 更多