Ubuntu上SSL证书和私钥的最佳位置


62

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

这个答案补充说证书应该放进去,/etc/ssl/certs/但这似乎是不安全的地方。是否.crt需要保护文件安全或将其视为公开文件?


19
.crt如果愿意,您可以在时代广场的广告牌上放上您的广告。
ceejayoz '16

Answers:


48

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

添加到私钥位置;确保将其正确固定以及存放在其中。(chown root:ssl-certchmod 640


我不知道为什么默认情况下该目录不是g + s。
Collin Anderson

2
不一定是这样。目录为0750,因此该组中的任何用户都无法遍历该目录以读取文件。
womble

2
看起来ssl-cert是ubuntu上的无效组名。也许应该用chown root:root代替
Atifm,

1
@Atifm在16.04或18.04上引入了ssl-cert证书组。我不记得是哪个。
DylanYoung

1
@DylanYoung:它肯定存在于Ubuntu 12.04上,我相信它是由软件包创建的ssl-cert,用于创建自签名的蛇油证书
MestreLion

35

只要适当地保护私钥文件,将它们放在何处都没关系。该公证书是公开的; 不需要保护-服务器特权或其他。

为了扩大答案,我不使用默认位置/etc/ssl
由于备份和其他原因,我将所有地雷都放在一个单独的区域比较容易。

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

设定范例

这篇文章是针对Ubuntu(Debian)+ Apache的,但是应该适用于大多数系统-
只需在给定的配置(apache / nginx / etc)中应用权限并更新位置/路径即可。
如果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下的组。
(请参阅评论)
将权限设置为700on /etc/apache2/ssl/private也可以正常工作。

放置SSL文件:

公共 www ssl证书以及中间证书 /etc/apache2/ssl
放入私有 ssl密钥放入/etc/apache2/ssl/private

集所有者:

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

注意:
如果您没有ssl-cert组,只需在上面的行中使用'root:root'或跳过第二行。

设置权限:

公开证书

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

私钥

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

注意:
由于Ubuntu ssl-cert组,组权限设置为READ(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以启用它。


不知道为什么您建议将710设置为/ etc / apache2 / ssl / private的权限。设置目录(对于组)的执行位而不设置目录(对于组)的读取位对我来说没有多大意义。您是要设置为750吗?
chriv

@chriv我只是根据我在Ubuntu默认SSL区域下看到的设置权限来设置权限。请参阅/ etc / ssl / certs和/ etc / ssl / private和ssl-certs组的使用。参见stackoverflow.com/a/23408897/503621
bshea 2013年

1
对具有许多可能答案的一般问题的非常详尽的解释。谢谢。只需添加几件事,您所在的<VirtualHost *:443>部分sites-available/mysite.conf应包括以下证书:SSLEngine on SSLCertificateFile /etc/apache2/ssl/mysite.crt SSLCertificateKeyFile /etc/apache2/ssl/private/mysite.key
George Dimitriadis

顺便说一句-也可以将您的:80和:443配置组合到一个Apache“ .conf”文件中。无论如何,我将重定向到:443 / SSL端口:80的任何内容。也可以将基本SSL设置放入.conf文件中,并创建一个附加的“详细” SSL设置文件(例如,设置使用的密码等),并将其包括在虚拟区域之外的所有.conf文件中。我使用这些设置来稍微“强化” SSL,并将其包含在每个虚拟站点.conf中。我可以通过这种方式在SSL Labs获得A + 。
bshea

10

这里的所有答案似乎都不错,但是我想提到一件事,我发现这是一个问题...如果您必须将证书与中间件或根目录连接起来以提供一个链文件,请不要将其放在中/etc/ssl/certs,因为当c_rehash运行时,由于其根或中间节点,可能会创建到证书的哈希符号链接。

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

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

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

至少将链条存储在其他位置可避免此问题。我最终制作了一个/etc/ssl/local_certs以容纳我的证书和链条,因此它们不会因您在其中发现的一堆CA证书而迷失/etc/ssl/certs


2

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

具有这些许可权,您提到的路径和/ usr / local / ssl应该很好。


1
通常,访问私钥的应用程序以非root用户身份运行。我建议维护ssl-cert组的访问权限。
Shane Madden

1
可以理解,但是像Apache这样的Web服务器产生了一个根“父”进程,并假设nginx也很相关。
乔纳森·罗斯

1

位置正确:

  • /etc/ssl/certs/用于.crt文件
  • /etc/ssl/private用于.key文件

所有者必须是root:root两者的所有者sudo chmod root:root <file>如有需要,请更改)。

权限

  • 644用于.crt文件
  • 600用于.key文件

这将适用于nginx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.