我目前正在使用客戶端證書身份驗證的WCF服務的原型。我們希望能夠直接將我們的應用程序發佈到IIS,但也允許使用IIS ARR(應用程序請求路由)進行SSL卸載。客戶端證書通過ARR和AuthorizationContext有不同thumprint
在仔細閱讀文檔後,我已經能夠成功測試兩種配置。我能夠檢索用於驗證的客戶端證書:
- X-Arr-ClientCert - 使用ARR時包含證書的標頭。
- X509CertificateClaimSet - 當直接發佈到IIS,這是如何檢索客戶端證書
要驗證請求被允許,我的認證匹配到某處配置的預期指紋的指紋。令我驚訝的是,當通過不同的方法獲取證書時,相同的證書具有不同的指紋。
要驗證是怎麼回事,我已經轉換了「RAWDATA」財產上的兩個證書爲Base64,發現它是相同的,只是在X509CertificateClaimSet的情況下,有空間的證書數據,而在ARR的情況下,則沒有。否則,兩個字符串是相同的:
我的問題: 有其他人碰到這個,我其實可以依靠指紋?如果不是,我的備份計劃是對主體和發行人進行檢查,但我願意接受其他建議。
我已經包括了一些(簡化)示例下面的代碼:
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;
}
嗨Marco, 感謝您的建議,我會在進入部署場景時再考慮一下Octopus。 這個問題的場景是我們想要使用證書來驗證服務使用者(TLS相互驗證)。雖然部署是一個值得關注的領域,但它與這個特定問題無關:) – Erik