在 Linux 上部署 aspnet core 应用程序时,通常通过反向代理进行。即 Kestrel 托管应用程序,Apache 处理与 Kestrel 通信的公共互联网流量。
因此 Kestrel 和 Apache 需要 https 的 SSL 证书。
该应用程序中还有一个Identity Server 4
功能也需要证书。
我以前曾为 Kestrel 和 Identity Server 使用过自签名证书。但现在我在想 - 这是正确的方法吗?
问题 -它更安全吗使用 3 个不同的证书还是可以对这 3 个证书使用一个 CA 证书?
答案1
恐怕这个问题没有简单的“是/否”答案。
如果 Kestrel 和 Apache 在同一台机器上运行,那么您实际上只是在使用证书,因为 Kestrel 需要证书。它不提供安全性,而且它更安全吗?问题不适用。
如果 Kestrel 和 Apache 位于不同的机器上,那么情况会稍微复杂一些。如果这两个机器位于受信任的网络上,您可以提出与上述相同的论点 - 证书的存在只是因为 Kestrel 需要证书。
如果网络不受信任,您现在将需要一些安全性。证书提供发起 TLS 连接所需的机器身份。无论您使用自签名证书还是 CA 签名证书,都会增加更多选择。
- 如果 Kestrel 应用程序使用内部 FQDN(例如
app.local
),并且 CA 不愿意认证此类名称(例如商业 CA 不会这样做),那么您就被迫使用自签名证书。 - 如果 CA 是内部的并且愿意认证本地名称,那么您可以考虑使用 CA 来获取 Kestrel 证书。
因此,假设现在您可以为 Kestrel 使用 CA 证书,接下来您需要问自己为什么需要这样做:
CA 签名证书通常在“一对多”场景中很有用。如果您有一台服务器和多方依赖方(客户端),那么 CA 颁发的证书可确保:
- 依赖方只需要信任CA,并且每个颁发的证书都是隐式信任的(自签名证书需要被所有客户端信任);
- 依赖方不需要审查他们希望信任的每个服务器的治理和操作流程,因为他们可以假设如果 CA 已经认证了它,那么它是值得信赖的;
- 证书续订后一切正常(相比之下,自签名证书则需要分发给全部续约后的客户)
- 撤销有效(自签名证书没有撤销的概念 - 如果服务器证书被泄露,你必须从中删除证书全部客户);
但是,如果您处于一对一场景(例如在反向代理和应用服务器之间),那么 CA 带来的好处就更少了(信任决策更容易,续订也更容易,如果服务器受到威胁,您只需从一个客户端中删除证书即可)。事实上,如果您没有可用的 CA,那么仅为应用服务器和反向代理之间的连接构建和管理 CA 的开销非常大,因此不值得。
对于后者,使用自签名证书的唯一缺点可能是缺乏集中管理。许多 CA 帮助管理颁发证书的生命周期,即使它只是一封自动电子邮件提醒您证书即将到期,或者像自动续订一样复杂。自签名证书由您管理。为了缓解这种情况,一些组织使用证书生命周期管理工具来管理他们的证书,如果该工具也可以监控自签名证书,那么就可以解决这个问题。
因此,总而言之,如果您的 CA 提供了额外的生命周期管理服务来帮助您管理证书,那么可能值得考虑;但除此之外,在一对一场景中(例如应用程序服务器和反向代理之间),使用自签名证书还是 CA 签名证书并没有区别。
如果您确实选择为应用服务器使用 CA 颁发的证书,则您需要做出更多决定:
如果应用程序和反向代理位于同一台机器上,您可以放心地考虑在它们之间使用一个证书 - 您不太可能遇到一个服务受到威胁而另一个服务仍然受信任的情况。如果一个证书受到威胁,您会(应该)假设机器上的所有证书都受到威胁,因此单独的证书通常没有真正的好处。
如果应用程序位于不同的机器上,那么您可能会遇到一个应用程序被攻陷而另一个应用程序没有被攻陷的情况。为了应对这种情况,您应该在每个机器上安装不同的证书。
请注意,虽然上面讨论了应用程序服务器和反向代理之间的通信,但您可以尝试使用身份服务器 4(无论那是什么)。