【问题标题】:Giving Node.js access to certificate/private key让 Node.js 访问证书/私钥
【发布时间】:2016-08-06 01:03:49
【问题描述】:

我正在尝试在我的 Node.js 应用程序上使用 HTTPS,就像它已经为其他任何东西启用一样。我已经安装了密钥和证书,但是当我试图在应用程序上指向它们时,我得到了 Error: EACCES, permission denied

密钥和证书都在/etc/pki/tls 的子文件夹中,我尝试这样指向它们:

var privateKey = fs.readFileSync('/etc/pki/tls/private/serverKey.key').toString(),
    certificate = fs.readFileSync('/etc/pki/tls/certs/2_mikewarren.me.crt').toString();

var options = {
    key: privateKey,
    cert: certificate
}

我是否需要调整密钥和证书的权限(通过chown)?如果是这样,这样做安全吗?

【问题讨论】:

  • 为什么不把文件移动到你的 node.js 代码所在的目录呢?您知道 node.js 进程有权读取该目录,并且您知道该目录受到保护,不会被外部访问,对吧?
  • @jfriend00 复制它们?
  • 它们是您操作系统中的文件。您可以将这些文件移动到适当的目录。如果您将它们用于您的 https 服务器,那么您可能不会将它们用于其他用途。或者将它们放在更好的共享位置,以便所有需要访问的东西都可以访问。
  • 我将它们用于 phpMyAdmin

标签: node.js ssl


【解决方案1】:

我获得了代码访问权限。

我做了什么

  1. 创建了名为certAccess的新用户组
  2. 通过说sudo useradd ec2-user -G certAccess将自己添加到certAccess
  3. 将 root 用户(唯一有权访问这些文件的用户)添加到 certAccess
  4. 更改了私钥的所有者:sudo chown ec2-user.certAccess /etc/pki/tls/private/serverKey.key

测试中...

为了测试,我只需在使用后将options 打印到控制台即可。确实看到了私钥和证书的内容(自己试试)。我还重新启动了httpd 服务器,并请求了静态文件。我看到了它们,用 TLS 保护,没有错误。

【讨论】:

    【解决方案2】:

    问题在于这些证书只能由 root(可能还有其他用户)读取。

    您可以使用 chmod 为所有用户授予读取权限,但这意味着……所有用户都可以访问它。所以,坏主意。

    另一种解决方案是将chown 这些文件提供给运行 node.js 的用户,但如果已经有用户使用这些文件的应用程序,它将破坏它。在这种情况下,创建一个拥有该文件的新组,向该组授予读取权限,并添加应该访问该组中文件的用户。

    【讨论】:

    • 怎么做?例如,如何创建群组?
    • 我创建了组来访问证书(在服务器的指定目录中)。现在如何更改组的访问权限?无论我的 node.js 代码是否正在运行,我都希望能够拥有 SSL/TLS
    • 使用 chown 和 chmod