5

我有一些用于从页面请求中提取客户端证书的代码。这是“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 中,无法从页面请求中提取任何证书。

有人知道我缺少什么吗?

4

1 回答 1

1

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

您应该寻找安全元素。

该元素控制 IIS 服务器是否接受客户端证书。将属性 enabled 设置为 true 执行以下操作:

iisClientCertificateMappingAuthentication enabled="true"

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

access sslFlags="SslNegotiateCert"

于 2012-09-21T03:44:32.927 回答