Tom*_*her 6 wcf svcutil.exe tls1.2
有没有人知道如何使SvcUtil.exe连接到使用TLS 1.2的端点?我正在使用.Net Framework版本4.6.1.
当我使用VS 2017进行连接时,我可以看到使用Fiddler,使用ClientHello握手在隧道上建立请求Version: 3.3 (TLS/1.2).但是,当我直接使用svcutil.exe时,它会尝试使用尝试使用ClientHello握手建立隧道的请求,Version: 3.1 (TLS/1.0)然后失败.
我希望我能够在SvcUtil.exe.config中设置如下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<generatePublisherEvidence enabled="false" />
</runtime>
<system.net>
<settings>
<servicepointmanager securityprotocol="tls12">
</servicepointmanager>
</settings>
</system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这将镜像ServicePointManager类上的等效SecurityProtocol属性.但是,这只会产生以下错误:
Unrecognized element 'servicepointmanager'.
Run Code Online (Sandbox Code Playgroud)
我使用SvcUtil如下:
SvcUtil https://myserver/myservice/mex
Run Code Online (Sandbox Code Playgroud)
小智 5
我也尝试使用文档中推荐的方式,但我无法让它工作。所以我假设它使用了一些自定义配置部分。相反,我目前正在使用以下控制台应用程序svcutil.exe手动加载和设置所需的属性:
using System.Net;
using System.Reflection;
namespace SvcUtil2
{
class Program
{
static void Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Your SvcUtil path here
var svcUtilPath = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.1 Tools\SvcUtil.exe";
var svcUtilAssembly = Assembly.LoadFile(svcUtilPath);
svcUtilAssembly.EntryPoint.Invoke(null, new object[] { args });
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道它可能无法回答您的实际问题,但我希望它仍然有用。
小智 4
解决方案是遵循并添加以下链接中提供的 HKEY,以通过以下方式仅允许 TLS 1.2 服务svcutil: https:
//blogs.msdn.microsoft.com/dsnotes/2015/09/23/wcf-ssltls-failure-during-添加服务引用系统网络安全 sslstate-processauthentication/
简而言之,解决方案如下:
将以下注册表设置 DWORD 值添加为 1 并重新启动盒子:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto
如果应用程序是在 x64 windows 上运行的 32 位,我们需要修改以下相同的键:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\ SchUseStrongCrypto
我在添加相同内容并重新启动机器后尝试过,它可以工作。