MessageSecurityException:访问凭据安全的WCF服务时禁止使用客户端身份验证方案“Anonymous”的HTTP请求

时间:2013-08-09 15:02:58

标签: wcf wcf-security x509certificate

我正在尝试了解基于证书的传输安全身份验证过程。假设我正在使用以下配置进行服务,并在8732端口上打开https:

<wsHttpBinding>
    <binding name="SecurityTest">
        <security mode="Transport">
            <transport clientCredentialType="Certificate"/>
        </security>
    </binding>
</wsHttpBinding>

<service name="MyNamespace.MyService">
    <host>
        <baseAddresses>
            <add baseAddress="https://localhost:8732/MyService/" />
        </baseAddresses>
    </host>
    <endpoint 
        address="" 
        binding="wsHttpBinding" bindingConfiguration="SecurityTest"
        contract="MyNamespace.IContract" >
    </endpoint>      
</service>

然后我为Root Authority创建一个自签名证书,以便我可以创建新证书:

makecert -n "CN=MyAuthority" -r -sv MyAuthority.pvk MyAuthority.cer -sky exchange

然后我将MyAuthority.cer添加到本地计算机“Root”目录中。在此之后,我使用MyAuthority证书创建另一个证书并将其放在本地计算机的“我的”目录中:

makecert -sky exchange -sk local -iv MyAuthority.pvk -n "CN=local" -ic MyAuthority.cer local.cer -sr Localmachine -ss My

然后我使用netsh将我的local.cer证书绑定到8732端口:

netsh http add sslcert ipport=0.0.0.0:8732 certhash=02b751d7f71423c27141c9c385fc3d3976 d7 aa b5 appid={C4BFC5DC-2636-495B-9803-8DD8257C92C3} 

服务器服务端已完成,它启动并运行。现在我创建了一个客户端:

<bindings>
    <wsHttpBinding>
        <binding name="SecurityTest" >
            <security mode="Transport">
                <transport clientCredentialType="Certificate"  />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
<client>
    <endpoint name="testPoint"
        address="https://localhost:8732/MyService/" 
        binding="wsHttpBinding" bindingConfiguration="SecurityTest"  
        behaviorConfiguration="ep" 
        contract="MyNamespace.IContract">
    </endpoint>
</client>
<behaviors>
    <endpointBehaviors>
        <behavior name="ep" >
            <clientCredentials>
                <clientCertificate findValue="local" 
                       storeLocation="CurrentUser" storeName="My" 
                       x509FindType="FindBySubjectName" />
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>

当我启动它并使用服务方法时,我收到一个错误:

  

MessageSecurityException:从远程计算机访问凭据安全WCF服务时,禁止使用客户端身份验证方案“Anonymous”的HTTP请求

如果我理解这个方案中的一切,并且可能得到建议,如何解决这个错误,我该问什么。

  1. 我的服务是否使用local.cer加密传输级别的邮件?

  2. 我是否必须在每台客户端计算机上将MyAuthority.cer添加到受信任的已发布目录,以便我的客户端可以在不创建个人验证处理程序的情况下解密邮件?

  3. 我当前示例中的客户端是否使用local.cer作为其凭据,此证书是否会发送到服务端?

  4. 服务器端如何处理客户端证书?它是否检查它是由MyAuthority.cer签名还是用ssl证书检查?如何查看证书的核对内容?

  5. 为什么我会收到错误?

  6. 提前致谢

1 个答案:

答案 0 :(得分:2)

1)。我的服务是否使用local.cer来加密传输级别的消息?

是的,确实如此。

2)。我是否必须在每台客户端计算机上将MyAuthority.cer添加到受信任的已发布目录,以便我的客户端可以在不创建个人验证处理程序的情况下解密邮件?

是的,因为您使用的是自签名证书(由您创建的权限/ CA签名) - 客户端需要信任权限/ CA,或者您需要在客户端编写代码/配置对于“例外”。

3)。我当前示例中的客户端是否使用local.cer作为其凭据,此证书是否会发送到服务端?

可能没问题,但是您不应该为客户端和服务器使用相同的证书 - 您应该为客户端使用不同的证书。目前,您正在根据您的配置指示它使用以下证书:

<clientCertificate findValue="localhost" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />

因此,如果您的 CurrentUser / My 商店中有主题名称=“ localhost ”的证书,并且运行客户端程序的身份可以访问它(及其私钥),它将作为客户端证书呈现给服务器。

4)。服务器端如何处理客户端证书?它是否检查它是由MyAuthority.cer签名还是用ssl证书检查?如何查看证书的核对内容?

服务器端的框架检查提供的客户端证书是否有效且可信,即全部。如果客户提供由例如签名的证书VeriSign和您的计算机/可信CAs商店中有VeriSign CA,这将被视为有效的客户端证书。如果要将接受的证书限制为仅由特定CA签名的证书,则需要为其添加其他代码(或从存储中删除所有其他可信CA)。

5)。为什么我会收到错误?

有几个原因你可以看到(相当神秘的)错误信息。首先,您的商店是否有符合第3项规定的证书?