根据验证程序,远程证书无效

Posted

技术标签:

【中文标题】根据验证程序,远程证书无效【英文标题】:The remote certificate is invalid according to the validation procedure 【发布时间】:2011-03-28 01:22:25 【问题描述】:

我正在开发 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>  

(我修改了域名和服务名称以保护客户的隐私。)

在任何其他计算机上尝试我在客户端上收到以下错误:

套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题引起的。本地套接字超时为“00:00:59.9840000”。

现有连接被远程主机强行关闭

服务器上的跟踪日志显示:

这很奇怪,因为我在服务器和客户端上都使用相同的证书......(更不用说运行良好的开发电脑......)

即使我设置了错误信息也是一样的

ServerHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

在服务器上和

ServiceClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

在客户端。

谁能告诉我如何正确地做到这一点?当然,我不想使用验证回调总是返回 true 或上述非验证模式等变通方法。

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

提前非常感谢!

哈吉

【问题讨论】:

***.com/questions/777607/… 复制粘贴 1 行和 kaboom :) 【参考方案1】:

听起来您正在尝试使用相同的证书作为服务器和客户端证书,并且您的客户端没有证书颁发给的相同主机名。即使您设置了 X509CertificateValidationMode.None,主机名也必须匹配。如果您的开发机器与服务器相同,它肯定会成功。

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

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

【讨论】:

嗨 Insipid,我如何检查证书是否为通配符?在主题备用名称字段中,我有一个与此类似的值: DNS Name=clients.domain.com DNS Name=domain.com DNS Name=*.domain.com 开发人员机器是我的笔记本电脑,服务器是另一台*** 与其他测试 PC 类似。我需要一种不强制主机名与服务器相同的方法,因为我们希望以后在世界上的许多机器上运行客户端。我在服务器和客户端配置文件的端点中添加了一个 子句。还不够吗?谢谢。 如果您没有证书来备份它,那么仅仅更改身份元素是不够的。你说你有 *.domain.com.. 包括 myClient.domain.com,但我认为通配符不会支持像 myClient.clients.domain.com 这样的子域。您的客户在子域中吗? 我们计划允许客户访问世界各地的服务,因此我们不能期望他们拥有相同的域。我们想在远程计算机上安装客户端软件并自动将其作为服务运行。我们只想加密客户端和服务器之间的通信,因为它通过互联网发送敏感数据。服务器的地址是clients.domain.com(当然不是真实地址,而是显示子域深度),我们根本不知道客户端地址。能做到吗? 更多信息 - 我设置了详细的 System.Net 跟踪并收到此错误:远程证书有错误:远程服务器未提供证书。远程证书被用户验证为无效。 亲爱的 Insipid,终于它似乎工作了。感谢您的出席。我标记为已接受您的回答。 -- Hudgi【参考方案2】:

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

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

希望对你有帮助。

【讨论】:

这帮助我绕过了错误。无论如何,这不应该在 PROD 环境中使用。 是的。我同意这意味着您需要确保在服务器上正确应用所有根证书和链证书,您可以在浏览器中验证您的应用程序 URL 没有证书异常

以上是关于根据验证程序,远程证书无效的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer:远程证书根据验证程序无效

使用 HttpClient 的“远程证书根据验证程序无效”

ITfoxtec - ADFS SAML2 根据验证程序,远程证书无效

根据验证程序,远程证书无效

抛出异常:根据验证程序,远程证书无效

Owin Twitter登录-根据验证程序远程证书无效