node.js - 用于在多家公司部署的 Intranet 应用程序的 SSL
问题描述
我有通过 https 服务的节点应用程序。该应用程序通过内部网络提供。我记得在 Linux 命令行上生成 SSL 密钥并且它们已经过期。
我有在多家公司安装这个应用程序的愿望。它将在每个公司的 int run et 上运行,但我确实希望可以远程访问该应用程序(通过在公司防火墙上设置一些端口转发器)。
SSL 密钥很痛苦。我希望对通信进行加密,但因为我自己生成 SSL 密钥,所以用户必须通过一些可怕的浏览器警告才能开始使用该应用程序。
如果我希望这些警告消失,我是否必须为应用程序运行的每个 Intranet 购买单独的 SSL 密钥以防止用户看到这些警告?我可以使这些密钥的到期时间为 3000 年(因此它们实际上永远不会过期)吗?我喜欢https,但我鄙视为官方密钥付费。原因如下:
使用自行生成的密钥,通信加密与购买的密钥一样安全。然而,如果用户接受我生成的证书,浏览器会让用户认为他会感染病毒。当有时您有其他加密原因时,浏览器会将所有内容都视为网上银行。好吧,抱怨够了。
如果您有一个主要是 Intranet 应用程序的应用程序,但确实希望允许远程访问,并且该应用程序将在许多公司中安装,并且您希望该应用程序通过 HTTPS 运行,您如何减轻 SSL 的负担密钥管理?
加密不如网上银行重要,但我想拥有它。因此,理想情况下,我想要一个我可以自己生成的密钥(以避免费用),或者我购买一个密钥,但我希望该密钥实际上永不过期,并且我希望它为多个安装服务(在不同的公司)我的应用程序。我想要不关心域名的关键。我想要加密通信,但验证我是我所说的那个人对我来说根本不重要。
如何以避免浏览器警告的方式部署这样的应用程序?
请指教。
解决方案
我已经就你的另一个问题发布了答案,但我在这里看到了一些我认为值得解决的误解。
我有在多家公司安装这个应用程序的愿望。它将在每个公司的 Intranet 上运行,但我确实希望可以远程访问该应用程序(通过在公司防火墙上设置一些端口转发器)。
请注意,在安全方面,这实际上与仅在 Internet 上运行您的应用程序相同。试图依靠隐藏在某个非标准端口上的应用程序被称为“通过默默无闻的安全”,这是一种错误的安全感。
如果我希望这些警告消失,我是否必须为应用程序运行的每个 Intranet 购买单独的 SSL 密钥以防止用户看到这些警告?
您的应用程序需要一个证书,并且您需要访问者信任您的证书。您可以通过两种方式做到这一点:
- 从 CA 获取证书,这些证书开箱即用。
- 制作您自己的证书并分发它们
- 手动
- 通过一些集中的方式自动化
在您的其他问题中更详细地回答了这些选项。
我可以使这些密钥的到期时间为 3000 年(因此它们实际上永远不会过期)吗?
如果您制作自己的证书,则可以。但你不应该。证书背后的密码学年代久远,攻击者变得更强大,机器被入侵,密钥被盗。理论上,我们对此有撤销权,实际上它是……毛茸茸的。这假设您知道存在问题。让证书在一段时间后自然过期可以稍微缓解这些问题。因此,强烈建议不要持有 3000 年的证书。
如果您从 CA 获得证书,则不能,因为他们不会给您证书,原因如上所述。证书的典型有效期为一年。事实上,浏览器正在移动以阻止长期存在的证书。
我喜欢https,但我鄙视为官方密钥付费。
然后使用免费证书。它们由多方提供。我喜欢让我们加密。
原因如下:使用自行生成的密钥,通信加密与购买的密钥一样安全。
不,这不对。至少,如果浏览器抱怨,则不会。
只有在证书可以信任的情况下,通道的加密才是安全的。如果您使用自签名证书,浏览器将无法信任该证书(因此会出现警告),这意味着可能会发生中间人攻击,就像普通 HTTP 一样。攻击者可以简单地替换他们自己的证书;您的客户无法知道证书已被伪造。
这是 CA 进来的;它们为浏览器提供了一种合理信任证书的方法。
您可以通过自己分发自签名证书来避免此问题;如果您正确执行此操作,则连接将非常安全。但这需要更多的工作,而且扩展性很差,这就是为什么我们在不平凡的情况下使用 CA。
然而,如果用户接受我生成的证书,浏览器会让用户认为他会感染病毒。当有时您有其他加密原因时,浏览器会将所有内容都视为网上银行。好吧,抱怨够了。
浏览器对此发表意见是非常正确的;盲目接受不受信任的证书会产生虚假的安全感;它几乎不比普通的 HTTP 好。这很少是正确的做法,而且几乎总是表明存在严重问题。把用户吓跑是最好的。
所以,理想情况下,我想要一把我可以自己生成的钥匙(以避免费用),或者我购买一把钥匙
您总是自己生成密钥;我认为您的意思是证书;)
无论如何,使用CA。有免费的。
但我希望该密钥几乎永不过期
不会发生
我希望它为我的应用程序提供多个安装服务(在不同的公司)。
馊主意; 您希望尽可能地将您的客户与其他客户的妥协隔离开来,尤其是当您要分发自己的证书时。
我想要不关心域名的关键。
和上面一样。
我想要加密通信,但验证我是我所说的那个人对我来说根本不重要。
验证是加密通信的组成部分;这不是可选的。
如何以避免浏览器警告的方式部署这样的应用程序?
这在你的另一个问题中得到了回答。
推荐阅读
- python-3.x - 如何使用 REST 的 put 函数替代 post 函数来保存多个数据?
- javascript - 从Angular JS中的不同应用程序加载模板
- ruby-on-rails - 在 Docker Rails 中更改 Postgres 端口
- javascript - array.filter() 删除
函数表达式中的值,而不是箭头函数中的值 - node.js - 使用nodejs从多个集合中获取mongodb集合记录
- android - 如果我的列表为空,如何显示图像?
- ios - 识别标签中显示的属性字符串中的图像点击
- sql - 来自同一个表的所有列都希望在单个查询中以表格形式获取它们
- php - 如何删除错误参数2需要是一个数组()
- swiftui - 将图像从缩略图动画到全屏