[英]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.