使用证书凭据向IIS 7中托管的WCF服务验证客户端时,邮件安全验证失败

时间:2013-10-24 15:03:46

标签: c# wcf iis ssl

我使用basicHttpBinding通过SSL在IIS 7中运行WCF服务。这就是绑定标记在客户端和服务器上的样子:

<basicHttpBinding>
    <binding name="BasicHttpBinding_IMyService"
             messageEncoding="Mtom"
             transferMode="Buffered">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
      </security>
    </binding>
</basicHttpBinding>

在服务器端,这是行为标记:

<behaviors>
  <serviceBehaviors>
    <behavior name="myServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

一切正常。

现在,我想切换到证书凭证类型来验证客户端,这就是我被困住的地方。

我做了以下事情:

  1. 在受信任的根证书颁发机构中安装了根CA. “当前用户”和“本地计算机”。
  2. 在上述根CA下创建了证书并将其安装在中     当前用户和本地计算机的个人存储。
  3. 在运行IIS的计算机上的本地用户之间创建了一个映射 (它实际上是与客户端相同的机器,这是我的 开发机器)如here
  4. 中所述
  5. 中的网站IIS配置的SSL标志 system.webServer / security / access是:SslNegotiateCert(这是 默认值)
  6. 在IIS中为网站和我的网站设置“接受”客户端证书 应用程序(这些设置是否必需?从我的理解IIS 与用于验证的证书无关 WCF的客户。)
  7. 我的应用程序的IIS中的应用程序池运行在 LocalService帐户。我授予了对LocalService的访问权限 使用安装在本地计算机商店中的证书 WinHttpCertCfg.exe工具:WinHttpCertCfg.exe -g -c LOCAL_MACHINE \ MY -s“Jackson Michael”-a“LocalService”
  8. 客户端和服务器的绑定标记现在如下所示:

    <basicHttpBinding>
        <binding name="BasicHttpBinding_IMyService"
                 messageEncoding="Mtom"
                 transferMode="Buffered">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="Certificate" />
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
          </security>
        </binding>
    </basicHttpBinding>
    

    对于客户:

    <behaviors>
        <endpointBehaviors>
            <behavior name="clientCertificateEndpointBehavior">
                <clientCredentials>
                    <clientCertificate storeName="My" storeLocation="CurrentUser" x509FindType="FindBySubjectName" findValue="Jackson Michael" />
                </clientCredentials>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    

    在服务器端:

    <behaviors>
      <serviceBehaviors>
        <behavior name="myServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
            <serviceCredentials>
                <clientCertificate>
                    <authentication mapClientCertificateToWindowsAccount="true" certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" />
                </clientCertificate>
            </serviceCredentials>
        </behavior>
    </behaviors>
    

    客户端获取System.ServiceModel.Security.MessageSecurityException:从另一方收到了一个不安全或不正确安全的故障。请参阅内部FaultException以获取故障代码和详细信息。

    使用Trace Viewer查看跟踪输出,我发现:

      

    System.IdentityModel.Tokens.SecurityTokenValidationException:The   X.509证书SN =杰克逊,G =迈克尔,OID.2.5.4.41 =杰克逊迈克尔,   E = michaeljackson5@jacksons.com,CN = Jackson Michael,C = LK chain   建筑失败了。使用的证书具有信任链   无法验证。更换证书或更改   certificateValidationMode。认证链正确处理,   但政策提供者不信任其中一个CA证书。

    如果我编辑serviceBehavior标记并设置certificateValidationMode =“None”,我会得到相同的结果。

    问题是:

    1. 为什么要忽略certificateValidationMode =“None”?
    2. 通过使用,我缺少什么才能使身份验证工作 默认certificateValidationMode =“ChainTrust”甚至是 PeerOrChainTrust?
    3. 谢谢。

0 个答案:

没有答案