如何使用 Svcutil.exe 和具有 Tls 1.2 的端点获取元数据

How to get metadata using Svcutil.exe with an endpoint that has Tls 1.2

有人知道如何 SvcUtil.exe 连接到使用 TLS 1.2 的端点吗?我正在使用 .Net Framework 版本 4.6.1。

当我使用 VS 2017 连接时,我可以看到使用 Fiddler 请求是通过使用 Version: 3.3 (TLS/1.2) 的 ClientHello 握手通过隧道建立的。但是,当我直接使用 svcutil.exe 时,它会尝试使用尝试使用 Version: 3.1 (TLS/1.0) 的 ClientHello 握手建立隧道并随后失败的请求。

我希望我可以像下面这样在 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>

这将在 ServicePointManager class 上镜像等效的 SecurityProtocol 属性。然而,这只会产生以下错误:

 Unrecognized element 'servicepointmanager'.

我正在使用 SvcUtil 如下:

SvcUtil https://myserver/myservice/mex

我也尝试使用 documentation 中推荐的方法,但无法正常工作。所以我假设它使用了一些自定义配置部分。相反,我目前正在使用以下控制台应用程序加载 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 });
        }
    }
}

我知道它可能无法回答您的实际问题,但我希望它仍然有用。

解决方案是遵循并添加以下 link 中提供的 HKEY 以允许通过 svcutil 仅提供 TLS 1.2 服务:
https://blogs.msdn.microsoft.com/dsnotes/2015/09/23/wcf-ssltls-failure-during-add-service-reference-system-net-security-sslstate-processauthentication/

总之解决方法如下:

  • 添加以下注册表设置DWORD值为1并重启 盒子: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto

  • 如果应用程序是32bit 运行 on x64 windows,我们需要修改相同的键下:
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\ SchUseStrongCrypto

我在添加相同的并重新启动机器后尝试过并且它有效。