繁体   English   中英

WebAPI端的WebRequest客户端证书为null

[英]WebRequest client certificate null on WebAPI side

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

客户端

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

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是正确的证书。 我已经安装了.pfxCurrentUser\\Personal存储和在LocalMachine\\Personal商店-和修改,以从店里拿证书,如建议在这里 ,但似乎不有所作为:

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对我没有任何帮助。

有关证书的其他信息

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

此外 - 证书的用途设置为clientAuth: 在此输入图像描述

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

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

如果不存在 - 将忽略证书,并且您将在GetClientCertificate()调用上获得null

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

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

编辑

另外,在ASP.NET vNext(v rc-01-final)中尚不支持此功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM