【发布时间】:2019-10-07 08:15:28
【问题描述】:
我正在 Azure Service Fabric 中创建一个 Web 服务,并在 .net Core 2.0 上的 Docker 容器上运行。该服务旨在由无法为相互 TLS 身份验证握手提供客户端证书的客户端调用,但是,我的服务正在提示输入此证书,这导致客户端重置连接并且没有得到响应来自服务。
在我的设置代码中,我正在运行这个 netsh 命令来将 SSL 证书绑定到端口 443:
netsh.exe http add sslcert ipport=0.0.0.0:443 certhash=E362F4AB1FC4227F3010952876B505D510B0F6AA appid={8e6ea06d-b92f-4d99-911a-3c68de243eb4} verifyclientcertrevocation=enable clientcertnegotiation=disable'
成功完成并建立了绑定,但是当客户端调用服务时(或者当我尝试从浏览器或 Fiddler/Postman 调用时)我仍然收到客户端证书的请求。通过查看文档,“clientcertnegotiation”参数是这里的相关部分,据我了解,应该禁用它以删除客户端证书提示。
客户端通过 Fiddler 使用重定向调用时,无需重置连接即可成功调用服务。
我不确定 SF 集群端是否有错误配置,所以我也查看了那里的配置。我发现一个名为“ProtectionLevel”的安全属性被设置为“EncryptAndSign”。在搜索这方面的一些信息时,我在 Microsoft 的文档中找到了这个页面:Understanding Protection Level。
我不确定我是否正确解析了该页面上的信息,但我认为它可能是相关的,所以我在开发环境中进行了测试,看看如果我设置“ProtectionLevel”是否会得到提示为“无”,但仍提示我输入证书。
我也在使用 CORS,但我怀疑这与双向 TLS 配置有什么关系,而且无论是否启用了 CORS,我都会得到相同的行为。
是否有任何其他 Service Fabric 或应用程序级设置会覆盖我的 SSL 绑定配置? Service Fabric 是否通过另一个将请求客户端证书的服务进行路由?
【问题讨论】:
-
添加一些可能相关的附加信息:服务器托管在跨不同数据中心的多个 SF 集群中,并且前面有一个 DNS 网关(可能不是正确的术语),然后路由传入不同数据中心的流量。 SSL证书CN在所有数据中心之间都是一样的,证书上的CN就是网关的名字。我不确定 SSL 在这样的设置下的工作方式是否有任何变化。
标签: c# .net ssl azure-service-fabric