在 Ubuntu 服务器上保存 SSL 证书和私钥的最佳位置是哪里?

在 Ubuntu 服务器上保存 SSL 证书和私钥的最佳位置是哪里?

在 Ubuntu 上,用于签署证书(供 nginx 使用)的私钥的最佳位置似乎是/etc/ssl/private/

回答补充说证书应该放进去,/etc/ssl/certs/但那似乎是一个不安全的地方。.crt文件是否需要安全保存,还是被视为公开文件?

答案1

.crt 文件被发送到所有连接的设备;它是公开的。(chown root:rootchmod 644

要添加到私钥位置;请确保您正确地保护它并将其放在那里。(chown root:ssl-certchmod 640

答案2

只要你妥善保护你的私钥文件。公共证书是公开的;不需要保护 - 服务器特权或其他。

为了扩展答案,我不使用默认位置/etc/ssl
由于备份+其他原因,将所有文件保存在单独的区域对我来说更容易。

对于 Apache SSL,我将其保存在/etc/apache2/ssl/private或类似的“根区域”中/etc/apache2

示例设置

这篇文章针对的是 Ubuntu (Debian) + Apache,但应该适用于大多数系统。
只需应用权限并更新给定配置(apache/nginx/etc)中的位置/路径即可。

此答案还假设您未使用 LetsEncrypt/Certbot 或某些自动 SSL 服务。您已购买或创建 SSL 证书并已获取文件包。

如果 SSL密钥文件得到正确保护(目录和文件),您将无事可做。请注意注释!

创建目录:

sudo mkdir /etc/apache2/ssl
sudo mkdir /etc/apache2/ssl/private
sudo chmod 755 /etc/apache2/ssl
sudo chmod 710 /etc/apache2/ssl/private

注:
chmod 710支持ssl-certUbuntu下的群组。
(看评论)
将权限设置为700开启/etc/apache2/ssl/private也可以正常工作。

放置 SSL 文件:

放在民众SSL 证书和中级证书位于:(
/etc/apache2/ssl这些*.crt通常是文件)

将相应的私人的SSL 密钥位于:(
/etc/apache2/ssl/private这些是*.key文件,通常没有扩展名)

注意:LetsEncrypt/Certbot 对所有 SSL 文件(公有、中间链和私有)使用“.pem”扩展名。但是,您不需要移动(或保护)这些文件。它们已经就位并受到保护。只需在您的 Apache“.conf”中直接调用它们即可。

设置所有者:

注意 - 如果您没有SSL 证书组,只需跳过第二行:

sudo chown -R root:root /etc/apache2/ssl/
sudo chown -R root:ssl-cert /etc/apache2/ssl/private/

设置权限:

公共证书

sudo chmod 644 /etc/apache2/ssl/*.crt

私钥

sudo chmod 640 /etc/apache2/ssl/private/*.key

注意:
由于 Ubuntu ssl-cert 组的原因,私钥的组权限设置为读取 (640)。使用“600”(仅所有者控制)是私钥的正常权限,同样可以正常工作。

启用 Apache SSL 模块

sudo a2enmod ssl

编辑任何 Apache 站点文件并启用

(见最后一段)*

sudo nano /etc/apache/sites-available/mysiteexample-ssl.conf
sudo a2ensite mysiteexample-ssl
#             ^^^^^^^^^^^^^^^^^ <-Substitute your ".conf" filename(s)

重启 Apache2 服务

sudo service apache2 restart

或者

sudo systemctl restart apache2.service

完成。测试您的新 SSL 站点。

* 这再次超出了问题的范围,但您可以复制默认的 Apache SSL 站点配置文件 ( sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/mysiteexample-ssl.conf) 作为通常在简单 (Ubuntu/Debian) Apache/SSL“conf”文件下使用的默认指令/目录的良好起点/示例。它通常指向自签名 SSL 证书+密钥 (snakeoil)、CA 捆绑包以及常见的指令用于给定的 SSL 站点。

复制后,只需编辑新的 .conf 文件并根据需要使用上述新信息/路径添加/删除/更新它,然后执行sudo a2ensite mysiteexample-ssl以启用它。重新加载/重新启动 apache2。测试。

答案3

这里的所有答案似乎都还可以,但我想提一下我发现的一个问题...如果您必须将您的证书与中间件或根连接起来以形成链文件,将其放入/etc/ssl/certs,因为在c_rehash运行时,它可能会根据其中的根或中间体创建指向您的证书的哈希符号链接。

然后,如果您的证书已过期,并且您删除了它们,并且不知道重新运行c_rehash,则您的/etc/ssl/certs目录中的哈希符号链接可能已损坏,并且当您的本地计算机尝试通过 SSL 连接到自身时,奇怪的事情开始发生,它找不到要验证的根。例如,使用 curl 我突然开始收到:

curl: (60) SSL certificate problem: unable to get issuer certificate

在我清理了一些旧的 .crt 和连接的 .pem 文件后不久/etc/ssl/certs

至少将您的证书链存储在其他地方可以避免此问题。我最终制作了一个/etc/ssl/local_certs来保存我的证书和证书链,这样它们就不会在混乱的 CA 证书中丢失,您会发现/etc/ssl/certs

答案4

如果将单个文件/目录的权限设置为只有 root 可以读取,那么实际上并不存在不安全的地方chown root :0 private.keychmod 600 private.key正如您所说,CSR 和证书文件不太敏感。

有了这些权限,您提到的路径和 /usr/local/ssl 应该没问题。

相关内容