[英]SSL client certificates / mutual authentication with ServiceStack (HttpListener)
我正在嘗試與ServiceStack一起使用相互SSL身份驗證,該技術在HttpListener
使用HttpListener
。
我在服務器上使用此命令將服務器證書綁定到所需的端口,並啟用客戶端證書:
netsh http add sslcert ipport=0.0.0.0:1234 certhash=5d51087438cbea33f2a4d86214b11a866876b9c5 appid={00000000-1111-2222-3333-444444444444} clientcertnegotiation=enable
如果我運行此命令,則可以確認它顯示“ Negotiate Client Certificate : Enabled
:
netsh http show sslcert
然后,使用以下命令為名稱空間添加保留:
netsh http add urlacl url=https://+:1234/ user="NT AUTHORITY\\NETWORK SERVICE"
“普通”服務器身份驗證似乎可以正常工作; 客戶端正在接收服務器的證書,我可以使用ServicePointManager.ServerCertificateValidationCallback
覆蓋受信任的內容。
但是,如果客戶端未發送任何客戶端證書,則它將正常運行。 如果客戶端發送客戶端證書(服務器信任或不信任),則它仍然可以正常工作。 這當然是不對的!
我正在使用HttpWebRequest.ClientCertificates.Add(X509Certificate)
添加客戶端證書。
我查看了網絡上的流量,並且AFAICS服務器正在發送受信任的CA列表並請求客戶端證書。
我是否需要在服務器上重寫某些內容以執行客戶端發送的證書的驗證,類似於客戶端如何使用ServicePointManager.ServerCertificateValidationCallback
來驗證服務器證書?
ServiceStack允許您配置“全局篩選器”,它可以攔截所有請求。
我使用全局過濾器解決了我的問題:
public static void Validate(IRequest request, IResponse response, object message)
{
var httpRequest = ((ListenerRequest)request).HttpRequest;
var consoleCert = httpRequest.GetClientCertificate();
...
如果客戶端證書不存在或無效,我可以發送403:
response.StatusCode = 403;
response.EndRequest();
return;
不知道這是推薦的方法(或實際上,如果有一個推薦的做法,但它為我工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.