gpt4 book ai didi

wcf - 使用 WCF : no CertificateRequest and CertificateVerify in handshake phase 的相互 SSL 身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:21 26 4
gpt4 key购买 nike

我正在开发一个 WCF 服务,该服务将由不是我开发的客户端使用,也不是 .NET(可能是 Java)。

在任何情况下,服务都应该支持相互 SSL 身份验证,其中服务和客户端都在传输层使用证书 X.509 证书进行身份验证。先前已在各方之间交换了证书。

我的问题是我似乎无法获得正确的 WCF 配置,因此客户端证书身份验证无法正常工作。我期望的是,作为 TLS 握手的一部分,服务器还包括一个 Certificate Request,如下所示:

enter image description here

在此之后,客户应回答“证书验证”等问题:

enter image description here

(最新的)服务配置是这个。我正在使用自定义绑定(bind),身份验证模式设置为 MutualSslNegotiated

<bindings>
<customBinding>
<binding name="CarShareSecureHttpBindingCustom">
<textMessageEncoding messageVersion="Soap11" />
<security authenticationMode="MutualSslNegotiated"/>
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>
</bindings>

...

<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" httpHelpPageEnabled="false" />
<serviceCredentials>
<serviceCertificate findValue="..." storeLocation="LocalMachine" x509FindType="FindByIssuerName" storeName="My" />
<clientCertificate>
<certificate findValue="..." storeName="My" storeLocation="LocalMachine" x509FindType="FindByIssuerName"/>
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>

对于我尝试过的所有服务配置,握手的 Server Hello 部分看起来像这样,没有 CertificateRequest。 enter image description here

其他需要说明的:

  • 该服务是自托管的,并在非默认端口(不是 443)上监听。服务器SSL证书已绑定(bind)此端口。
  • 我还尝试了 basicHttpBindingwsHttpBidning,安全模式设置为 Transport,客户端身份验证设置为 Certificate,没有结果(实际上是相同的结果)。

如有任何想法,我们将不胜感激。

最佳答案

好的,经过多次尝试,我明白了。发布这个以防其他人遇到同样的问题。

我应该继续提到,确实需要在 MSDN 上的某个地方提及此行为,该位置对于任何寻找 WCF 安全信息的人来说都是可见的,而不是深埋在某些工具的文档中。

我能够重现并修复此问题的平台:Windows 8.1 x64 和 Windows Server 2008 R2 Standard。

正如我所提到的,我的问题是我无法配置 WCF 安全性以使该服务需要客户端证书。我在寻找解决方案时注意到的一个常见困惑是,许多人认为客户端可以发送证书(如果有),而不会受到质疑。当然,情况并非如此 - 服务器需要先请求它,此外,指定允许哪些 CA through a CertificateRequest reply .

总而言之,我的情况是:

  • 服务是自托管的。
  • 服务在非标准端口(不是 443,而是 9000)上的 HTTPS 上运行。

这意味着我必须使用 netsh.exe http add sslcert 为端口 9000 创建 SSL 证书绑定(bind)。好吧,绑定(bind)已经创建,但有一个问题。我只是在运行 netsh http show sslcert 以检查我的绑定(bind)后才发现问题:

 IP:port                      : 0.0.0.0:9000
Certificate Hash : ...
Application ID : ...
Certificate Store Name : MY
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : (null)
DS Mapper Usage : Disabled
-->Negotiate Client Certificate : Disabled

罪魁祸首是绑定(bind)的最后一个属性,“协商客户端证书”,已记录 here .显然,默认情况下,此属性是禁用的。您需要在创建绑定(bind)时明确启用它。

使用以下语句重新创建绑定(bind)解决了问题:

netsh.exe http add sslcert ipport=0.0.0.0:9000 certhash=... appid=... certstorename=MY verifyclientcertrevocation=Enable VerifyRevocationWithCachedClientCertOnly=Disable UsageCheck=Enable clientcertnegotiation=Enable

在检查绑定(bind)之前,我尝试在 IIS 中托管一个简单的 WCF 服务并从那里启用客户端证书身份验证。很好奇地看到,尽管没有 IIS 发出的 CertificateRequest,它仍然失败并返回 403.7。 .甚至 IIS 也没有使用适当的参数创建绑定(bind)。

无论如何,现在它可以正常工作了,这就是您可以修复它的方法。

不要忘记,为了允许证书协商,服务配置也发生了变化(绑定(bind)安全性):

<customBinding>
<binding name="CustomHttpBindingCustom" receiveTimeout="01:00:00">
<textMessageEncoding messageVersion="Soap11" />
<security authenticationMode="SecureConversation" requireSecurityContextCancellation="true">
<secureConversationBootstrap allowInsecureTransport="false" authenticationMode="MutualSslNegotiated" requireSecurityContextCancellation="true"></secureConversationBootstrap>
</security>
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>

关于wcf - 使用 WCF : no CertificateRequest and CertificateVerify in handshake phase 的相互 SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200348/

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