3

我试图了解基于证书的传输安全身份验证过程。假设我正在使用以下配置创建服务,并在 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>

然后我为根授权创建一个自签名证书,以便我可以创建新证书:

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

然后我将我的添加MyAuthority.cer到本地机器的“根”目录中。在此之后,我使用我的 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 服务时,客户端身份验证方案“匿名”禁止 HTTP 请求

如果我理解这个方案中的所有内容,我想问什么,也许可以得到建议,如何解决这个错误。

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

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

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

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

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

提前致谢

4

1 回答 1

3

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 签名的证书,并且您的机器/受信任的 CA 存储中有 VeriSign CA,则该证书将被视为有效的客户证书。如果要将接受的证书限制为仅由特定 CA 签名的证书,则需要为此添加额外代码(或从存储中删除所有其他受信任的 CA)。

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

您可以看到该(相当神秘的)错误消息有几个原因。首先,您的商店中是否有与第 3 项中指定的证书相匹配的证书?

于 2013-08-09T15:25:14.283 回答