WebAPI端的WebRequest客户端证书为null

时间:2015-11-18 09:53:44

标签: ssl asp.net-web-api https openssl asp.net-web-api2

我有一个用我的[x509Authorize]属性修饰的WebApi控制器动作。我在本地调试此端点 - 同时运行尝试调用此端点的控制台应用程序。

客户端

这是客户端代码 - 略微简化:

X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\\Temp\\ht-android-client.pfx");               
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://localhost:44300/api/mobile/predict");
Request.ClientCertificates.Add(Cert);
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
....

我断言Cert是正确的证书。我已将.pfx安装在我的CurrentUser\Personal商店和LocalMachine\Personal商店中 - 并进行了修改,以按照建议here从该商店获取证书,但这并不是似乎有所作为:

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var Cert = store.Certificates.Find(X509FindType.FindBySubjectName, "Android", true)[0];

服务器端

我正在使用以下代码监听WebAPI端点:

public class x509AuthorizeAttribute : AuthorizeAttribute
{
    public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        var cert = actionContext.Request.GetClientCertificate();
       // value of 'cert' is null

我首先在控制台应用中点击了断点 - 看到选择了正确的证书。然后我点击服务器上的断点,看到.GetClientCertificate()的值是null。我究竟做错了什么?其他SO问题12对我没有任何帮助。

有关证书的其他信息

我已经创建了一个安装在LocalMachine\Trusted root CA商店的自签名CA证书。我已经创建了android客户端证书 - 并使用我的自签名CA证书对其进行了签名。然后我将其转换为pkcs12文件。这是客户端使用的证书 - 它也安装在我的个人商店(机器和currentUser)中并且有效(您可以看到链回到ROOT CA证书)。

此外 - 证书的目的设置为clientAuth: enter image description here

1 个答案:

答案 0 :(得分:0)

所以问题确实是服务器需要在web.config中设置以下内容以强制IIS启动SSL证书协商:

<security>
    <access sslFlags="SslNegotiateCert" />
</security>

如果不存在 - 将忽略该证书,您将在null电话上获得GetClientCertificate()

这意味着,我的WebAPI的所有客户端现在都被迫提供有效的证书 - 所以我最初想到的只有一个需要证书的控制器方法似乎不可能。

然后,由于Azure云服务的限制,在web.config中设置此配置参数存在挑战。但是 - this答案为此提供了解决方案。

修改

另一方面,这是ASP.NET vNext(v rc-01-final)中支持yet