Web Api中自签名证书始终为空

时间:2017-04-06 05:41:09

标签: c# ssl asp.net-web-api ssl-certificate x509certificate

我花了一整天的时间来看这个,除了在这里问我的同伴之外别无他法。

我们有一个接受X509证书的web api,但是下面的代码总是在localhost和dev服务器上都为null。

下面是获取证书的代码:

var certificate = actionContext.Request.GetClientCertificate();

我创建了ActionFilterAttribute,其中OnActionExecuting我正在尝试获取上述客户证书。

在此之前,我按照this link上的说明使用Windows PowerShell创建了证书:

我使用的命令就是:

New-SelfSignedCertificate -DnsName "localhost", "atp api" -CertStoreLocation "cert:\LocalMachine\My"

证书已创建,我确保它在受信任的证书中。 然后从我的示例客户端App,我使用以下代码将证书发送到我的Web API:

            X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
            var certCollection = store.Certificates.Find(X509FindType.FindByIssuerName, "localhost", false);
            var cert = certCollection[0];
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://localhost:44308/dk");
            request.ClientCertificates.Add(cert);
            request.Method = "POST";
            string postData = "<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'>sample string 1</string>";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            //request.ContentType = "application/xml";
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            store.Close();

但是当我的Web API证书中执行此代码时为null。我认为可能是因为localhost,我在开发服务器上部署了web api,证书仍为null。

我还尝试从指定的Windows位置而不是从商店获取证书,结果是相同的。

我用谷歌搜索和谷歌搜索了很多,但没有任何帮助我。

4 个答案:

答案 0 :(得分:0)

您需要在web.config中添加这些行,以强制IIS启动SSL证书协商:

<system.webServer>
    <!-- things ... -->
    <security>
        <access sslFlags="SslNegotiateCert" />
    </security>
    <!-- things -->
</system.webServer>

答案 1 :(得分:0)

ServerCertificateValidationCallback设置request属性:

request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

ServerCertificateValidationCallback是一种验证服务器证书的方法。因此request将忽略证书错误。 如果使用的.NET Framework低于v4.5,则可以为其设置相同的回调 ServicePointManager.ServerCertificateValidationCallback。如果需要,您可以检查证书的自定义验证。

答案 2 :(得分:0)

您可以在iis中更改SSL设置以接受证书而不是忽略它。 enter image description here

答案 3 :(得分:0)

您需要将<security><access sslFlags="SslNegotiateCert" /></security>添加到您的Web配置文件(如Spilarix所述)并从服务器证书中导出证书并安装它并将其用于客户端,以便客户端拥有基于服务器证书的证书(并且可以验证)但是单独的证书(我知道它们都在同一台机器上)。这应该可以解决你的问题