gpt4 book ai didi

wcf - 消息安全异常 : The HTTP request was forbidden with client authentication scheme 'Anonymous' "when accessing credential secured WCF service

转载 作者:行者123 更新时间:2023-12-04 21:37:39 27 4
gpt4 key购买 nike

我试图了解基于证书的传输安全认证过程。假设我正在使用以下配置创建一个服务,并在 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 证书绑定(bind)到 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: The HTTP request was forbidden with client authentication scheme 'Anonymous'" when accessing credential secured WCF service from remote computer

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

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

  2. 我是否必须将 MyAuthority.cer 添加到每台客户端计算机上的可信发布目录,以便我的客户端无需创建个人验证处理程序即可解密消息?

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

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

  5. 为什么会出现错误?

提前致谢

最佳答案

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

是的,确实如此。

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

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

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 项中指定的证书相符的证书?

关于wcf - 消息安全异常 : The HTTP request was forbidden with client authentication scheme 'Anonymous' "when accessing credential secured WCF service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com