【发布时间】:2017-06-26 00:05:06
【问题描述】:
我的集群中有两个 WebAPI 应用程序。两个应用程序都在每个节点上运行。他们都使用 asp.net core 和 Weblistener。按照here 的建议,我已将它们设置为分别在端口 80 和 443 上侦听 http 和 https。
Https 使用相同的证书进行保护,并使用 er 端点绑定 (?) 进行设置,如 here 所讨论的。我使用自签名证书可以正常工作,但是在将证书更改为适当的证书时出现了问题。有效模拟证书翻转。
我将新证书添加到密钥保管库并将其部署到集群。当使用新证书引用重新发布我的应用程序时,它会失败并出现this 错误ConfigurePortCertificate: httpsPort=443, certStoreName My, certfindvalue {SSLCertFingerPrint}, error AlreadyExists。现在哪种有意义..
由于两个应用程序都在每个节点上运行,并且我们尝试更新其中一个,因此会发生以下情况:
- WebAPI1 将 Cert_A 绑定到 https:443。
- WebAPI2 将 Cert_A 绑定到 https:443(这很好,它们是相同的证书)
- 尝试使用 Cert_B 更新 WebAPI1。
- 发布到集群,尝试将 Cert_B 绑定到 https:443
- 错误,因为不同的证书 (Cert_A) 已绑定到 https:443
我找到的唯一解决方法是让每个在 https:443 上使用 Cert_A 的系统脱机,并使用新的 Cert_B 重新发布所有应用程序。
不得不关闭系统的主要部分来更改证书是非常不可接受的(例如,我显然做错了什么)。
我有什么选择?
Kestrel 管理 https 的方式不同吗?我是否会通过执行类似...而不是在本地托管证书(即通过 VM 配置)来遇到类似问题,我可以从 keyvault 请求最新的证书。我可以为 Kestrel 提供一个证书,该证书由一个未版本化的 URL 提供给密钥库(它获取最新的证书)。然后我想我需要做的就是让服务重新启动(例如发布升级)并且他们将开始使用最新的证书。不过,我知道 Kestrel 是 not currently "supported" 用于面向外部的 Web 服务器。
我会不会是最好的呢
- 使用网关(例如应用程序网关)并将我的所有 WebListener 服务托管在不同的端口上,并使用 HTTPS 进行保护
- 使用网关并使用 Kestrel,端口不同或相同
- 使用 https 安全网关,让我的服务在不同的端口上运行,不用担心内部的 https。
或者是否有一个我没有意识到的简单解决方案?
提前致谢!
对于任何不正确的术语,我深表歉意,请纠正我。
【问题讨论】:
标签: asp.net-web-api azure-service-fabric