2017-10-10 124 views
2

我目前正在使用客戶端證書身份驗證的WCF服務的原型。我們希望能夠直接將我們的應用程序發佈到IIS,但也允許使用IIS ARR(應用程序請求路由)進行SSL卸載。客戶端證書通過ARR和AuthorizationContext有不同thumprint

在仔細閱讀文檔後,我已經能夠成功測試兩種配置。我能夠檢索用於驗證的客戶端證書:

  1. X-Arr-ClientCert - 使用ARR時包含證書的標頭。
  2. X509CertificateClaimSet - 當直接發佈到IIS,這是如何檢索客戶端證書

要驗證請求被允許,我的認證匹配到某處配置的預期指紋的指紋。令我驚訝的是,當通過不同的方法獲取證書時,相同的證書具有不同的指紋。

要驗證是怎麼回事,我已經轉換了「RAWDATA」財產上的兩個證書爲Base64,發現它是相同的,只是在X509CertificateClaimSet的情況下,有空間的證書數據,而在ARR的情況下,則沒有。否則,兩個字符串是相同的:

comparison of base64 strings

我的問題: 有其他人碰到這個,我其實可以依靠指紋?如果不是,我的備份計劃是對主體和發行人進行檢查,但我願意接受其他建議。

我已經包括了一些(簡化)示例下面的代碼:

string expectedThumbprint = "..."; 
    if (OperationContext.Current.ServiceSecurityContext == null || 
    OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets == null || 
    OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets.Count <= 0) 
    { 
    // Claimsets not found, assume that we are reverse proxied by ARR (Application Request Routing). If this is the case, we expect the certificate to be in the X-ARR-CLIENTCERT header 
    IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest; 
    string certBase64 = request.Headers["X-Arr-ClientCert"]; 
    if (certBase64 == null) return false; 
    byte[] bytes = Convert.FromBase64String(certBase64); 
    var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(bytes); 
    return cert.Thumbprint == expectedThumbprint; 
    } 
    // In this case, we are directly published to IIS with Certificate authentication. 
    else 
    { 
    bool correctCertificateFound = false; 
    foreach (var claimSet in OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets) 
    { 
     if (!(claimSet is X509CertificateClaimSet)) continue; 
     var cert = ((X509CertificateClaimSet)claimSet).X509Certificate; 
     // Match certificate thumbprint to expected value 
     if (cert.Thumbprint == expectedThumbprint) 
     { 
     correctCertificateFound = true; 
     break; 
     } 
    } 
    return correctCertificateFound; 
    } 

回答

0

當同事同行審查再次設置測試,看來我的問題已經消失。我不知道我是否犯了一個錯誤(可能),或者是否重啓了我的機器,但無論如何,Thumbprint現在在兩種身份驗證方法上都是可靠的。

0

不知道您的具體情況是什麼,但我一直很喜歡章魚部署的方式,以確保服務器< - >觸手(客戶端)通訊。它們在其Octopus Tentacle communication article中描述。他們基本上使用SslStream類,自簽名的X.509證書和在服務器和觸角上配置的可信賴的指紋。

-Marco-

+0

嗨Marco, 感謝您的建議,我會在進入部署場景時再考慮一下Octopus。 這個問題的場景是我們想要使用證書來驗證服務使用者(TLS相互驗證)。雖然部署是一個值得關注的領域,但它與這個特定問題無關:) – Erik