[英]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
是正确的证书。 我已经安装了.pfx
我CurrentUser\\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问题1和2对我没有任何帮助。
有关证书的其他信息
我已经创建了一个自签名CA证书,该证书安装在LocalMachine\\Trusted root CA
存储上。 我已经创建了android客户端证书 - 并使用我自签名的CA证书对其进行了签名。 然后我将其转换为pkcs12
文件。 这是客户端使用的证书 - 它也安装在我的个人商店(机器和currentUser)中并且有效(您可以看到链回到ROOT CA证书)。
所以问题确实是服务器需要在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.