簡體   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