如何使用HttpWebRequest和IISExpress调试发送客户端证书(How to send

2019-07-31 16:52发布

我有网页请求拉客户证书一些代码。 这是在“MyPage.aspx”的代码。

string someparam = this.Request.Params["someparam"];
if (!String.IsNullOrWhiteSpace(someparam) && this.Page.Request.ClientCertificate.IsPresent)
{
    try
    {
        X509Certificate2 x509Cert2 = new X509Certificate2(this.Page.Request.ClientCertificate.Certificate);
        //
        // Code for verifying the x509Cert2
        //
    }
    catch (Exception) { }
}

现在我想测试在Visual Studio中的代码在我的本地环境。 为此,我安装IISExpress获得通过https值得信赖的通信。 到现在为止还挺好。 问题是,我发送客户端证书的测试代码似乎并没有工作。 ClientCertificate.IsPresent = false的服务器。

下面是测试代码。 该证书是一个.pfx文件。

var request = (HttpWebRequest)WebRequest.Create("https://localhost:44300/MyPage.aspx?someparam=222");
request.Method = "POST";

X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySerialNumber, "XXXTHESERIALNUMBERXXX", true);
certFromStore = col[0];
store.Close();
request.ClientCertificates.Add(certFromStore);

HttpWebResponse reqWebResponse = (HttpWebResponse)request.GetResponse();
StreamReader reqResponseStream = new StreamReader(reqWebResponse.GetResponseStream(), Encoding.UTF8);

String resultHtml = reqResponseStream.ReadToEnd();

reqWebResponse.Close();
reqResponseStream.Close();

运行测试代码时,我没有得到任何错误。 该证书是从存储中加载正确和成功添加到收藏request.ClientCertificates。 但在MyPage.aspx没有证书可以从页面请求被拉出。

有没有人有我失去了我的想法?

Answer 1:

您需要在IIS Express实例配置文件中指定的参数,位于
C:\Users\[username]\Documents\IISExpress\config\applicationhost.config

你应该寻找安全元件。

元素控制IIS服务器是否接受客户端证书。 启用设置为true的属性做到这一点:

iisClientCertificateMappingAuthentication enabled="true"

访问元素控制如何处理访问。 该sslFlags属性控制客户端证书将如何处理。 出于某种原因,我已经得到了IIS实际的证书传递给请求的唯一方法是通过sslFlags的值设置为SslNegotiateCert为:

access sslFlags="SslNegotiateCert"



文章来源: How to send client certificate using HttpWebRequest and IISExpress for debugging