2014-03-05 135 views
2

我試圖使用ServiceStack進行相互SSL身份驗證,後者使用HttpListenerSSL客戶端證書/與ServiceStack(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來驗證服務器證書?

回答

3

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; 

不知道這是推薦方法(或者確實如果有推薦的方法,但它適用於我。