.net 如何解决;无法为具有权限的SSL/TLS安全通道建立信任关系;
我在IIS7中使用HTTPS托管了一个WCF服务。当我在Internet Explorer中浏览到这个站点时,它就像一个符咒,这是因为我已将证书添加到本地根证书颁发机构存储中 我在一台机器上开发,所以客户端和服务器是同一台机器。证书是直接从IIS 7管理单元进行自签名的 我现在不断地犯这个错误 无法为具有权限的SSL/TLS安全通道建立信任关系 。。。从客户端控制台调用时 我使用.net 如何解决;无法为具有权限的SSL/TLS安全通道建立信任关系;,.net,wcf,iis,certificate,.net,Wcf,Iis,Certificate,我在IIS7中使用HTTPS托管了一个WCF服务。当我在Internet Explorer中浏览到这个站点时,它就像一个符咒,这是因为我已将证书添加到本地根证书颁发机构存储中 我在一台机器上开发,所以客户端和服务器是同一台机器。证书是直接从IIS 7管理单元进行自签名的 我现在不断地犯这个错误 无法为具有权限的SSL/TLS安全通道建立信任关系 。。。从客户端控制台调用时 我使用findprivatekey和cacls.exe手动授予自己证书的权限和网络服务 我尝试使用SOAPUI连接到服务,这
findprivatekey
和cacls.exe
手动授予自己证书的权限和网络服务
我尝试使用SOAPUI连接到服务,这是可行的,因此这在我的客户机应用程序中一定是个问题,它是基于http的代码
我还可以去哪里查看我似乎已经用尽了所有可能的方法来解释为什么我无法连接?作为一种解决方法,您可以在客户端的
ServicePointManager
服务器CertificateValidationCallback中添加一个处理程序:
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) =>
{
return true;
};
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
但是请注意,这不是一个好的做法,因为它完全忽略服务器证书,并告诉服务点管理器,任何证书都可以,这会严重危害客户端安全。您可以对此进行优化,并进行一些自定义检查(如证书名称、哈希等)。
使用测试证书时,至少可以避免开发过程中出现的问题。问题的出现是因为您使用的是自签名密钥。客户端不信任此密钥,密钥本身也不提供验证链或证书吊销列表 你有几个选择——你可以
将此添加到您的客户端代码:
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
delegate
{
return true;
});
我遇到了同样的问题,我能够用两种解决方案来解决它: 首先,我为“计算机帐户”使用MMC管理单元“证书”,并将自签名证书拖到“受信任的根证书颁发机构”文件夹中。这意味着本地计算机(生成证书的计算机)现在将信任该证书。 其次,我注意到证书是为某个内部计算机名生成的,但web服务是使用另一个名称访问的。这导致验证证书时不匹配。我们为computer.operations.local生成了证书,但使用访问了web服务。当我们将URL切换到用于生成证书的URL时,我们没有收到更多错误
也许只是切换URL就行了,但是通过使证书受信任,您也可以避免Internet Explorer中的红色屏幕,它会告诉您它不信任证书。我对自签名证书也有类似的问题。 我可以使用与服务器的FQDN相同的证书名称来解析它
理想情况下,SSL部分应该在服务器端进行管理。客户端不需要为SSL安装任何证书。另外,一些帖子提到了绕过客户端代码中的SSL。但我完全不同意。前两个使用lambda,第三个使用常规代码。。。希望对您有所帮助
//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);
// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
= ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));
// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
bool result = false;
if (cert.Subject.ToUpper().Contains("YourServerName"))
{
result = true;
}
return result;
}
出现此问题是因为client.config的端点如下所示:
https://myserver/myservice.svc
但是证书是预期的
https://myserver.mydomain.com/myservice.svc
更改端点以匹配服务器的FQDN可以解决我的问题。我知道这不是这个问题的唯一原因。我只是将证书拖到“受信任的根证书颁发机构”文件夹中,瞧,一切都很顺利 哦。我首先在管理员命令提示符下添加了以下内容:
netsh http add urlacl url=https://+:8732/Servicename user=NT-MYNDIGHET\INTERAKTIV
我不确定您需要的用户名称(您可以看到,我的名称是挪威语!):
user=NT-AUTHORITY/INTERACTIVE
您可以通过发出命令查看所有现有的urlacl:
netsh http show urlacl
尝试通过连接到WCF服务时发生此情况。IP地址,例如https://111.11.111.1:port/MyService.svc
使用绑定到名称(例如mysite.com)的证书时
切换到
https://mysite.com:port/MyService.svc
已解决。请执行以下步骤:
到https://INL-126166-.groupinfra.com:203/SampleService.svc我遇到了同样的问题。我还在本地商店中添加了CA证书,但我用了错误的方法 使用mmc控制台(开始->运行->mmc),您应该添加证书管理单元作为服务帐户(选择IIS的服务帐户)或计算机帐户(它为机器上的每个帐户添加) 这是我所说的图像
从现在开始,您可以添加CA的证书(受信任的根CA和中间CA),一切都会正常运行这是在尝试仅使用主机名连接到WCF服务时发生的,例如在使用绑定到名称的证书时,例如host.mysite.com。
// tested in .NET 4.5:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
new X509ServiceCertificateAuthentication()
{
CertificateValidationMode = X509CertificateValidationMode.None,
RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
};
#if (DEBUG)
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
new X509ServiceCertificateAuthentication()
{
CertificateValidationMode = X509CertificateValidationMode.None,
RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
}; #endif
<system.web>
<compilation targetFramework="4.7" />
<httpRuntime targetFramework="4.7" />
</system.web>
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11;
System.Net.ServicePointManager.SecurityProtocol &= ~System.Net.SecurityProtocolType.Ssl3;
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001