MessageSecurityException:客户端身份验证方案禁止HTTP请求';匿名'&引用;访问凭据安全的WCF服务时

MessageSecurityException:客户端身份验证方案禁止HTTP请求';匿名'&引用;访问凭据安全的WCF服务时,wcf,wcf-security,x509certificate,Wcf,Wcf Security,X509certificate,我试图了解基于证书的传输安全身份验证过程。假设我正在使用在8732端口上打开https的以下配置创建一个服务: <wsHttpBinding> <binding name="SecurityTest"> <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security>

我试图了解基于证书的传输安全身份验证过程。假设我正在使用在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>
netsh http add sslcert ipport=0.0.0.0:8732 certhash=02b751d7f71423c27141c9c385fc3d3976 d7 aa b5 appid={C4BFC5DC-2636-495B-9803-8DD8257C92C3} 
然后我将我的
MyAuthority.cer
添加到本地机器的“根”目录中。在此之后,我使用MyAuthority证书创建另一个证书,并将其放置在本地计算机的“我的”目录中:

然后,我使用netsh将本地.cer证书绑定到8732端口:

<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>
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服务时,客户端身份验证方案“匿名”禁止HTTP请求

如果我很好地理解了这个计划中的每一件事,我应该问什么,也许我可以得到建议,如何解决这个错误

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

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

  • 在当前示例中,我的客户端是否使用local.cer作为其凭据,并且该证书将被发送到服务端

  • 服务器端如何处理客户端证书?它是检查它是否由MyAuthority.cer签名,还是使用ssl证书进行检查?如何查看检查的证书

  • 为什么我会出错

  • 提前感谢。我的服务是否使用local.cer在传输级别加密邮件

    是的

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

    是的,因为您使用的是自签名证书(由您创建的权威机构/CA签名)——客户端需要信任权威机构/CA,或者您需要在客户端编写代码/配置以实现“异常”

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

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

    <clientCertificate findValue="localhost" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
    
    
    
    因此,如果您在CurrentUser/My存储中有一个subject name=“localhost”的证书,并且运行客户端程序的身份可以访问它(及其私钥),它将作为客户端证书呈现给服务器

    4) .服务器端如何处理客户端证书?它是否检查它是否由MyAuthority.cer签名,或者它是否使用ssl证书进行检查?如何查看检查证书的内容

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

    5) .为什么我会出错


    有几个原因可以说明(相当隐晦)错误消息。首先,您的存储中是否有与第3项中指定的内容相匹配的证书?

    谢谢您的回答。假设我将其标记为正确:)我正在准备70-513,这些证书有些糟糕。它们在本地主机、域和internet上的行为不同。IIS托管带来了新的问题。因此我来到questi在上,如果我自己理解正确的话。这个例子我在一台计算机中使用(它在域中-假设它会产生某种影响)。至于第3点-服务器ssl和客户端都使用相同的证书local.cer(有一个错误,我编辑过:在客户端配置中将localhost更改为local)这在LOCALMACHINE我的目录中。我应该注意的另一件事是——您在服务器上设置的证书应该有一个“通用名”/“CN”,它与您用来访问服务的URL相匹配。例如,如果您通过访问服务,则通用名为“localhost”“。如果您是通过访问它,那么通用名称应该是“www.google.com”等。这有一些例外,如通配符证书,但它们不适用于您的概念验证案例。这是一个相当不错的资源,描述您正在尝试做的事。诀窍是确保您的证书是可信的,并且私钥是可访问的(这对于提供客户端证书的客户端尤其重要)——您可以通过在浏览器中加载URL并查找警告/错误来测试服务器。Hi@mikey:你能更具体地解释一下你所说的自定义代码吗?@Matthias-我进一步细化我接受哪些证书和拒绝哪些证书的一种方法是检查客户端提供的证书(我在服务器端检查它)。以下是指向某些属性的链接:。我使用的一种配置是将OS/IIS设置为信任来自给定源/CA的所有证书(“第一扇门”),但随后我检查应用程序逻辑中的每个证书(例如,我查看主题)