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