客户端证书通过ARR和AuthorizationContext有不同thumprint

问题描述:

我目前正在使用客户端证书身份验证的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; 
    } 

当同事同行审查再次设置测试,看来我的问题已经消失。我不知道我是否犯了一个错误(可能),或者是否重启了我的机器,但无论如何,Thumbprint现在在两种身份验证方法上都是可靠的。

不知道您的具体情况是什么,但我一直很喜欢章鱼部署的方式,以确保服务器< - >触手(客户端)通讯。它们在其Octopus Tentacle communication article中描述。他们基本上使用SslStream类,自签名的X.509证书和在服务器和触角上配置的可信赖的指纹。

-Marco-

+0

嗨Marco, 感谢您的建议,我会在进入部署场景时再考虑一下Octopus。 这个问题的场景是我们想要使用证书来验证服务使用者(TLS相互验证)。虽然部署是一个值得关注的领域,但它与这个特定问题无关:) – Erik