客户端和服务器无法通信,因为它们没有共同的算法 - ASP.NET C# VB Visual Basic IIS TLS 1.0 / 1.1 / 1.2。

97
我在使用C# PayTrace Gateway时遇到了问题。以下代码在昨天之前一直正常工作,但我认为他们由于Poodle Exploit关闭了SSL3。运行下面的代码后,我们收到了以下消息:“远程服务器已强制关闭连接”。在研究了这个问题后,我们确定因为我们的IIS Server 7.5仍配置为使用SSL3,C#默认使用SSL3,导致PayTrace强制关闭连接。然后我们从服务器中删除了SSL3,但随之而来的是以下错误:
“客户端和服务器无法通信,因为它们没有共同的算法。”
我猜测现在我们需要安装其他SSL算法在服务器上,因为SSL 3已被删除。我们的IT人员声称TLS 1.1和TLS 1.2正在工作,并且ASP.NET应该现在默认使用它们。但我觉得我们仍然必须在服务器上安装其他东西,我对SSL算法一无所知,也不知道从哪里开始。
var postUrl = new StringBuilder();

//Initialize url with configuration and parameter values...
postUrl.AppendFormat("UN~{0}|", this.MerchantLoginID);
postUrl.AppendFormat("PSWD~{0}|", this.MerchantTransactionKey);
postUrl.Append("TERMS~Y|METHOD~ProcessTranx|TRANXTYPE~Sale|"); 
postUrl.AppendFormat("CC~{0}|", cardNumber);
postUrl.AppendFormat("EXPMNTH~{0}|", expirationMonth.PadLeft(2, '0'));
postUrl.AppendFormat("EXPYR~{0}|", expirationYear);
postUrl.AppendFormat("AMOUNT~{0}|", transactionAmount);
postUrl.AppendFormat("BADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("BADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("BCITY~{0}|", this.City);
postUrl.AppendFormat("BSTATE~{0}|", this.State);
postUrl.AppendFormat("BZIP~{0}|", this.Zip);
postUrl.AppendFormat("SADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("SADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("SCITY~{0}|", this.City);
postUrl.AppendFormat("SSTATE~{0}|", this.State);
postUrl.AppendFormat("SZIP~{0}|", this.Zip);
if (!String.IsNullOrEmpty(this.Country))
{
    postUrl.AppendFormat("BCOUNTRY~{0}|", this.Country);
}
if (!String.IsNullOrEmpty(this.Description))
{
    postUrl.AppendFormat("DESCRIPTION~{0}|", this.Description);
}
if (!String.IsNullOrEmpty(this.InvoiceNumber))
{
    postUrl.AppendFormat("INVOICE~{0}|", this.InvoiceNumber);
}
if (this.IsTestMode)
{
    postUrl.AppendFormat("TEST~Y|");
}

//postUrl.Append();

WebClient wClient = new WebClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
String sRequest = "PARMLIST=" + Url.Encode(postUrl.ToString());
wClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
string sResponse = "";
sResponse = wClient.UploadString(PayTraceUrl, sRequest);

另外,只是提醒一下,当我们连接到First Data E4网关时,也会出现这个问题,所以不仅仅是PayTrace的问题。我猜测随着更多的网关关闭SSL3访问权限,我们将继续在其他网关上遇到问题,直到服务器解决此问题为止。此外,我在网上找到了一些建议,有些建议在发出请求之前放置以下代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

不幸的是,那也没有起作用,出现了相同的错误。这就是为什么我认为需要在IIS7.5服务器上安装一些额外的东西。只是我不确定是什么。

16个回答

134

现在已经有几篇文章提到这个问题,它们都指出启用TLS 1.2。任何低于此版本的都不安全。

你可以使用补丁在.NET 3.5中实现此功能。
你可以在.NET 4.0和4.5中使用一行代码实现此功能:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0

.NET 4.6及以上版本会自动使用TLS 1.2。

更多细节请参见: .NET对TLS的支持.


12
把它放在你的应用程序启动的地方。这是一个全局值 - 把它放在 Global.asax 文件的 Application_Start() 事件中。 - Paul
8
即便是在4.6.1版本上,我仍需加入此行代码:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 - eat-sleep-code
3
我已经添加了上面提到的那行代码,但是还是得到了同样的错误。我将它添加到了Global.asax中Application_Start()函数内的第一行代码。 - messed-up
2
我的应用程序出现问题的原因是其中一个数据库服务器没有更新。因此,从应用服务器连接到数据库失败了。 - messed-up
1
这是否意味着,如果我将项目从 .Net 4.5 升级到 4.7,就不需要进行编码更改?只需重新部署即可? - Xiao Han
显示剩余3条评论

29

在我的情况下,尽管项目的目标框架为4.7.1,但我仍然收到相同的错误提示。解决方法是将web.config文件中system.web下的httpRuntime更改为4.7.1!


是的,我已经了解到将版本更改为4.6.X及更高版本会自动协商使用最高版本的TLS。如果您安装了TLS 1.2或TLS 1.3,则会使用该版本。因此,无需进行代码更改,这很好,如果您能够轻松升级的话。 - TroySteven
你的建议解决了我的问题.. 谢谢! - MarwaAhmad

19
在先前的回答中,建议使用此代码行来处理 .Net 4.5:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5

我建议你将该值与现有的值进行按位或操作,如下所示:

ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; // .NET 4.5

如果您查看值列表,您会发现它们是2的幂。这样,在将来当事情转移到TLS 2.0时,您的代码仍将正常工作。


这是否会使您继续使用不安全的协议呢? - Paul
1
@Paul 是的。我建议升级到 .net 4.6.2,这样你就不需要这行代码了 - 它会为你决定正确的 TLS 版本。 - Almenon
1
有点学究气,但是SecurityProtocolType.Tls12被定义为常量3072,这不是2的幂。由于某种原因,该枚举中的所有值都是这样的值,即两个连续的位被设置(192、768、3072)。 - Nick
你可能还需要删除旧版本。请参考此文章的代码示例。https://www.ryadel.com/en/asp-net-client-server-cannot-comunicate-because-they-possess-common-algorithm-how-to-fix-c-sharp/ - Johan Bergens

14
我的应用程序运行在 .net 4.7.2 上。最简单的解决方案是将以下内容添加到配置文件中:
  <system.web>
    <httpRuntime targetFramework="4.7.2"/>
  </system.web>

和pk_code的答案一样,但我总是喜欢有答案的代码,所以加1。 - TroySteven
这对我很有用。非常感谢这篇文章的发布。 - Isa

9

有两种可能的情况,我使用了第二点。

  1. 如果您在生产环境中遇到此问题,并且可以轻松部署新代码到生产环境,则可以使用以下解决方案之一。

    在调用API之前,您可以添加下面这行代码:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5

  2. 如果您无法部署新代码,并且希望使用与生产中存在的代码相同的代码解决此问题,则可以通过更改某些配置设置文件来完成此操作。 您可以在配置文件中添加以下任一项。

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
  </runtime>

或者
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
</runtime>

1
第二个设置中有一个错别字:<AppContextSwitchOverrides>没有关闭。 - Rich Moss

7
这个问题已经解决了。事实证明,我们的IT工作人员是正确的。服务器上安装了TLS 1.1和TLS 1.2。但问题在于我们的网站以ASP.NET 4.0运行,你必须使用ASP.NET 4.5才能运行TLS 1.1或TLS 1.2。因此,为了解决这个问题,我们的IT工作人员不得不重新启用TLS 1.0以允许与PayTrace建立连接。
简而言之,“客户端和服务器无法通信,因为它们没有共同的算法”错误消息是由于服务器上没有可用的SSL协议与PayTrace的服务器通信所致。
更新: 请勿在服务器上启用TLS 1.0,这只是一个临时的解决方法,因为现在有更好的解决方法来确保强大的安全性实践。请参见接受的答案以获取解决方案。

10
建议不要启用TLS 1.0,并且出于PCI符合性的原因而被禁止。 - Keith
5
这是一个危险的变化 - TLS 1.0已知在安全方面存在风险。 - Paul
1
答案https://dev59.com/cV8d5IYBdhLWcg3wgya4#42124951通过使用更新的TLS版本来解决问题。 - Anthony Shaw
3
我同意以上评论,这只是一个临时解决方案,直到我们安装了 ASP.NET 4.5。我不建议这样做,特别是因为这篇文章是3年前发布的。 - TroySteven

7
在我的情况下,我通过启用.Net Framework中的最新TLS版本来解决了问题,如本文所述:https://learn.microsoft.com/dotnet/framework/network-programming/tls
设置这些注册表键:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] " SchUseStrongCrypto"=dword:00000001

谢谢分享!这也是解决我的方法,我认为这是最好的方法。我的意思是,在操作系统上启用TLS 1.2(SecurityProviders注册表键),然后只需告诉.NET框架使用系统默认值并优先选择更强的算法。 - Victor Lopes
根据我的情况,似乎只需要设置“SystemDefaultTlsVersions”,如此处所述 - “NET35-UseSchannelDefaults.reg”和“NET4X-UseSchannelDefaults.reg”:https://techcommunity.microsoft.com/t5/exchange-team-blog/exchange-server-tls-guidance-part-2-enabling-tls-1-2-and/ba-p/607761我一直在使用“WcfClientTest”工具,但仍然遇到相同的错误。 - DennisVM-D2i

6
启用TLS 1.0也解决了我们的问题(在禁用SSL v3之后)。 (使用ASP.net 4.0网站处理PPI支付服务的Server 2012 R2)。这是我使用的RegEdit脚本,以便将所有内容设置为所需状态。我们仅为客户端禁用了SSL v3,而没有禁用服务器,因为那样会破坏其他我们尚未准备好处理的事情。在我们升级网站到.Net 4.5.2之后,我们将再次禁用TLS 1.0。

此脚本启用了所有协议,包括服务器和客户端,但不包括客户端的SSL v3。

请务必备份您的注册表!

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000

11
不过,启用TLS 1.0并不被推荐,并且违反PCI合规性要求。 - Keith
无论是否被禁止,如果您拥有只能理解TLS 1.0的旧服务器,并且需要使用安全套接字迁移到新服务器,则唯一的选择是在新服务器上暂时启用TLS 1.0。为了符合合规要求,在完成迁移后,您必须将其禁用。 - JamesHoux

4

关于此问题,有几件事情需要检查。

每当出现此类与建立安全连接有关的错误时,请尝试在PowerShell中运行以下脚本,并使用机器名称或uri(例如“www.google.com”)获取每个不同协议类型的结果:

 function Test-SocketSslProtocols {
    
    [CmdletBinding()] 
    param(
        [Parameter(Mandatory=$true)][string]$ComputerName,
        [int]$Port = 443,
        [string[]]$ProtocolNames = $null
        )

    #set results list    
    $ProtocolStatusObjArr = [System.Collections.ArrayList]@()


    if($ProtocolNames -eq $null){

        #if parameter $ProtocolNames empty get system list
        $ProtocolNames = [System.Security.Authentication.SslProtocols] | Get-Member -Static -MemberType Property | Where-Object { $_.Name -notin @("Default", "None") } | ForEach-Object { $_.Name }

    }
 
    foreach($ProtocolName in $ProtocolNames){

        #create and connect socket
        #use default port 443 unless defined otherwise
        #if the port specified is not listening it will throw in error
        #ensure listening port is a tls exposed port
        $Socket = New-Object System.Net.Sockets.Socket([System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
        $Socket.Connect($ComputerName, $Port)

        #initialize default obj
        $ProtocolStatusObj = [PSCustomObject]@{
            Computer = $ComputerName
            Port = $Port 
            ProtocolName = $ProtocolName
            IsActive = $false
            KeySize = $null
            SignatureAlgorithm = $null
            Certificate = $null
        }

        try {

            #create netstream
            $NetStream = New-Object System.Net.Sockets.NetworkStream($Socket, $true)

            #wrap stream in security sslstream
            $SslStream = New-Object System.Net.Security.SslStream($NetStream, $true)
            $SslStream.AuthenticateAsClient($ComputerName, $null, $ProtocolName, $false)
         
            $RemoteCertificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]$SslStream.RemoteCertificate
            $ProtocolStatusObj.IsActive = $true
            $ProtocolStatusObj.KeySize = $RemoteCertificate.PublicKey.Key.KeySize
            $ProtocolStatusObj.SignatureAlgorithm = $RemoteCertificate.SignatureAlgorithm.FriendlyName
            $ProtocolStatusObj.Certificate = $RemoteCertificate

        } 
        catch  {

            $ProtocolStatusObj.IsActive = $false
            Write-Error "Failure to connect to machine $ComputerName using protocol: $ProtocolName."
            Write-Error $_

        }   
        finally {
            
            $SslStream.Close()
        
        }

        [void]$ProtocolStatusObjArr.Add($ProtocolStatusObj)

    }

    Write-Output $ProtocolStatusObjArr

}

Test-SocketSslProtocols -ComputerName "www.google.com"

它将尝试建立套接字连接,并为每次尝试和成功连接返回完整的对象。

在查看返回内容后,通过regedit检查计算机注册表(在运行中输入“regedit”或查找“注册表编辑器”),放置

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

检查文件路径,并确保已启用适用于您正在尝试连接的服务器的适当TLS协议(从脚本返回的结果中)。根据需要进行调整,然后重置计算机(这是必需的)。再次尝试使用PowerShell脚本连接并查看返回的结果。如果仍然不成功,请确保需要启用的算法、哈希和密码器已经缩小范围(IISCrypto是一个很好的应用程序,可免费使用。它将为您提供实时视图,在其中列出了所有这些设置所在的SChannel注册表中启用或禁用的内容)。

还要记住您当前安装的Windows版本、DotNet版本和更新情况,因为尽管在Windows 10中默认启用许多TLS选项,但以前的版本需要补丁才能启用该选项。

最后一点:TLS是双向的(请记住这一点),其思想是服务器拥有可用的东西与客户端同样重要。如果服务器仅通过某些算法连接TLS 1.2,则任何客户端都无法使用其他任何内容连接。此外,如果客户端只能使用某个协议或密码套件连接,则连接将无法工作。浏览器也是需要考虑的东西,因为它们强制对HTTP2上的任何操作产生错误,尽管实际上并没有错误(他们抛出它以尝试让人们升级,但确实存在修改此行为的注册表设置)。


1
非常感谢您将此答案添加到列表中!这个脚本太棒了!! - JamesHoux
看起来这个脚本不兼容PowerShell版本2. :( 尝试升级遗留系统真是一件痛苦的事情。 - JamesHoux
提供一个脚本的变体链接,它更简单,并且适用于早期版本的PowerShell:https://www.sysadmins.lv/blog-en/test-web-server-ssltls-protocol-support-with-powershell.aspx - JamesHoux
我理解詹姆斯。我自己也在处理这个过程中。你的服务器版本是什么?你可以查看Windows功能和启用的PowerShell版本,并激活更高版本以进行工作。 - user10555044

2
在困扰了几天之后,我们最终解决问题的方法需要两个步骤:
1)我们在所有调用外部API的.NET库中添加了这一行代码,这些API供应商也已经禁用了他们自己的SSL v3。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; // (.Net 4 and below)

2) 这是运行ASP.Net 4.0网站时您需要的最终完整的注册表更改,升级到ASP.Net 4.5后需要进行轻微更改。

在我们重新启动服务器之后,所有问题都消失了。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000

1
不要添加一个几乎与第一个答案相同的第二个答案,你应该只是编辑你原来的答案。你应该考虑更新之前的答案,然后删除这个答案。 - David
除非你确实必须这样做,否则你真的不应该在代码中实现TLS安全处理。如果你正在进行出站调用,那么你需要确保实施注册表键,如果你担心入站安全性(比如说你希望能够调用1.0服务器,但只想接收来自1.2的呼叫),那么请相应地利用服务器和客户端注册表子键。你要避免将这些垃圾放在代码中,因为这样会让你影响到代码中的每一个改变。服从于托管环境是最好的方法。 - user10555044
客户端始终被理解为发起调用的机器,而服务器始终是接收调用机器消息的接收者。 - user10555044

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接