我们的一位客户公开了一项具有自签名证书保护的服务。
我将该证书安装在本地计算机的“个人证书”和“受信任的根证书颁发机构”下。我编写了一个测试控制台应用程序来连接它。当我在管理模式下运行Visual Studio时,它起作用了。当我在没有管理员模式的情况下运行它时,出现以下错误:
Could not establish secure channel for SSL/TLS with authority 'www.theirhostname.com'.
我将相同的代码复制到Web应用程序中,并将应用程序池的标识更改为LocalSystem
,并成功连接。使用ApplicationPoolIdentity
时遇到了同样的错误。
现在,我使用在本地PC上以管理模式运行Visual Studio时所用的相同代码,并将其复制到Windows Server 2008 R2上IIS托管的网站中。当网站尝试连接到同一服务时,出现错误消息:
Could not establish secure channel for SSL/TLS with authority 'www.theirhostname.com'.
为解决此问题,我尝试更改网站在服务器上运行的应用程序池的服务帐户。这些帐户均无效:
LocalService
LocalSystem
NetworkService
ApplicationPoolIdentity
这是设置获取证书的代码段,该证书可以在控制台应用程序以及本地IIS上的Windows应用程序中的Windows 10框中使用。
Public Class ServiceCall
Private _binding As BasicHttpBinding
Private _endPoint As EndpointAddress
Public Sub New()
_binding = New BasicHttpBinding()
_binding.Security.Mode = BasicHttpSecurityMode.Transport
_binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate
End Sub
Public Sub Connect()
_endPoint = New EndpointAddress("https://www.theirhostname.com/WebServices/Test")
Dim client As New TestServiceClient(_binding, _endPoint)
client.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
"ServiceEndPoint- Testing")
本地PC上的控制台应用程序和Web应用程序中的所有设置和代码都与服务器上Web应用程序中的设置相匹配。控制台应用程序在服务器上运行时,还可以使用服务器上安装的同一证书连接到服务。 IIS本地主机上托管的同一Web应用程序也可以连接到第三方服务。无法在服务器上的IIS上托管相同的网站应用程序。请帮忙。