Wcf 根据验证过程,远程证书无效

Wcf 根据验证过程,远程证书无效,wcf,validation,certificate,Wcf,Validation,Certificate,我正在开发一个WCF服务(NetTcpBinding),它在没有安全性的情况下工作得很好。我们从DigiCert购买了一个证书,并将其安装在服务器上,并使用DigicertUtil.exe进行了配置。也安装在测试客户端计算机上 打开安全设置后,我可以从我的开发PC上毫无问题地连接到它 服务器配置: binding.Security.Mode = SecurityMode.Transport; binding.Security.Transport.ClientCredentialTyp

我正在开发一个WCF服务(NetTcpBinding),它在没有安全性的情况下工作得很好。我们从DigiCert购买了一个证书,并将其安装在服务器上,并使用DigicertUtil.exe进行了配置。也安装在测试客户端计算机上

打开安全设置后,我可以从我的开发PC上毫无问题地连接到它

服务器配置:

   binding.Security.Mode = SecurityMode.Transport;
   binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
   binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
   ServerHost.Credentials.ServiceCertificate.SetCertificate(
              StoreLocation.LocalMachine,
              StoreName.My,
              X509FindType.FindBySubjectName,
              Properties.Settings.Default.CertificateName);
客户端配置:

 <binding name="EndPointTCP" closeTimeout="00:01:00" openTimeout="00:01:00"
              receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
              hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="1610612736"
              maxReceivedMessageSize="1610612736">
              <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
                maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <reliableSession ordered="false" inactivityTimeout="00:10:00" enabled="false" />
              <security mode="Transport">
                <transport clientCredentialType="Certificate"  protectionLevel="EncryptAndSign"/>
              </security>
            </binding>

    <behaviors>
          <endpointBehaviors>
            <behavior name="behavior_ServerService">
              <clientCredentials>
                <clientCertificate findValue="*.domain.com"
                          storeLocation="LocalMachine"
                          storeName="My"
                          x509FindType="FindBySubjectName" />
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>

<client>
  <endpoint address="net.tcp://clients.domain.com:10001/Server/ServerService"
    binding="netTcpBinding" bindingConfiguration="EndPointTCP" contract="ServerServiceReference.IServerWS"
    name="EndPointTCP" behaviorConfiguration="behavior_ServerService">
    <identity>
      <dns value="*.domain.com" />
    </identity>
  </endpoint>
</client>  
在服务器和

ServiceClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
在客户机上

谁能告诉我怎么做才对吗?当然,我不想使用诸如验证回调返回always true或上述非验证模式之类的变通方法

任何帮助都将不胜感激。只有解决这个“小”问题才能发布…:(

提前多谢


Hudgi

听起来您试图使用与服务器和客户端证书相同的证书,并且您的客户端没有与颁发证书的主机名相同的主机名。即使您设置了X509CertificateValidationMode。无,主机名也必须匹配。如果您的开发计算机与服务器相同,则主机名最有可能匹配当然成功了

您是有意让客户机通过SSL向服务器进行身份验证,还是只是试图建立客户机对证书颁发机构的信任


我还怀疑您的证书可能不是真正的通配符证书,如果您在使用该证书进行客户端身份验证时运气不佳。

如果您想忽略自签名或无效证书,请在客户端调用请求之前尝试此代码片段

ServicePointManager.ServerCertificateValidationCallback = delegate
(object s, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors) { return true; };

我希望它能有所帮助。

嗨,平淡,我怎么能检查证书是否是通配符?在Subject Alternative Name字段中,我有一个与此类似的值:DNS Name=clients.domain.com DNS Name=domain.com DNS Name=*.domain.com开发人员机器是我的笔记本电脑,服务器是VPN中与其他测试PC类似的另一台。我需要一种方法不要强制主机名与服务器相同,因为我们希望以后在世界上的许多计算机上运行客户端。我在服务器和客户端配置文件中的端点中都添加了一个子句。这还不够吗?Thx。如果您没有证书来备份,仅更改identity元素是不够的。您说您有*.domain.com..这包括myClient.domain.com,但我认为通配符不支持像myClient.clients.domain.com这样的子域。您的客户端在子域中吗?我们计划允许客户端访问世界各地的服务,因此我们不能期望他们拥有相同的域。我们希望在远程计算机上安装客户端软件呃,并将其作为服务自动运行。我们只想加快客户端和服务器之间的通信,因为它通过internet发送敏感数据。服务器的地址是clients.domain.com(当然不是真实地址,但显示子域深度)我们根本不知道客户端地址。可以这样做吗?更多信息-我设置了一个详细的System.Net跟踪,我得到了以下错误:远程证书有错误:远程服务器没有提供证书。远程证书被用户验证为无效。亲爱的平淡无奇,它终于可以工作了。感谢您的参与g、 我标记为接受您的答案。--Hudgi copy paste 1行和kaboom:)这有助于我绕过错误。无论如何,这不应用于产品环境。是。我同意这意味着您需要确保在服务器上正确应用了所有根证书和链证书,您可以在浏览器中验证您的应用程序URL没有证书例外
ServicePointManager.ServerCertificateValidationCallback = delegate
(object s, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors) { return true; };