如何将证书颁发机构(CA)添加到Ubuntu?


166

我的工作决定发布自己的证书颁发机构(CA),以安全地处理我们工作的各个方面,而无需支付证书费用。

  • 加密签名电子邮件
  • 加密电子邮件内容
  • 可以访问基于公司IRC客户端证书的信息。
  • 自动撤消前员工的钥匙

他们给我发送了一个.pem文件,我不确定如何将其添加到我的Ubuntu安装中。发送的说明是:“在Mac上双击它应该安装它。” 

我该如何进行?我需要做的东西OpenSSL的创建.key.csr.crt文件?


1
注释“发送的指令是:\”上双击它在Mac上应该安装它\“”让我很快乐。
mzoll

Answers:


231

安装CA

将PEM格式的证书(其中包含的格式----BEGIN CERTIFICATE----)复制到文件中/usr/local/share/ca-certificates,并以.crt文件扩展名命名。

然后运行sudo update-ca-certificates

注意事项:此安装仅影响使用此证书存储的产品。有些产品可能会使用其他证书存储区;如果使用这些产品,则也需要将此CA证书添加到其他证书存储中。(Firefox指令Chrome指令Java指令

测试CA

您可以通过查找刚刚添加的证书/etc/ssl/certs/ca-certificates.crt(这只是串联在一起的所有受信任CA的一长列)来验证此方法是否有效。

您也可以通过尝试连接到您知道使用正在安装的CA签名的证书的服务器来使用OpenSSL的s_client。

$ openssl s_client -connect foo.whatever.com:443 -CApath /etc/ssl/certs

CONNECTED(00000003)
depth=1 C = US, ST = Virginia, O = "Whatever, Inc.", CN = whatever.com, emailAddress = admin@whatever.com
verify return:1
depth=0 C = US, ST = Virginia, L = Arlington, O = "Whatever, Inc.", CN = foo.whatever.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=Virginia/L=Arlington/O=Whatever, Inc./CN=foo.whatever.com
   i:/C=US/ST=Virginia/O=Whatever, Inc./CN=whatever.com/emailAddress=admin@whatever.com

... snip lots of output ...

    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1392837700
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

首先要查找的是输出顶部附近的证书链。这应将CA显示为颁发者(旁边i:)。这告诉您服务器正在提供由您要安装的CA签名的证书。

其次,寻找设置为的verify return code末尾0 (ok)


3
这实际上有效
Sabareesh Kkanan

1
感谢您注意到firefox / chrome不使用默认的证书存储。
Tim Strijdhorst 2015年

4
请注意,update-ca-certificates可能非常挑剔(可能是设计使然)。mycert.pem.crt无效,但mycert.crt无效。我也认为它需要是/ usr / local / share / ca-certificates,而不是/ usr / share / ca-certificates(尽管在/etc/ca-certificates.conf中有什么注释)。
迷宫

2
感谢您的crt扩展注释,这是为我完成这项工作的秘密,我获得了带有cert扩展证书,并且对为什么什么都不起作用感到困惑。
勒索姆·布里格斯

3
一个警告:s_client默认情况下不发送SNI,并且服务器可能需要SNI,尤其是当它支持具有不同证书的虚拟主机/站点时;对于这种情况,请添加-servername foo.whatever.com。或者,如果使用的是Web服务器(的最新版本)curlwget自动执行SNI的服务器。
dave_thompson_085 '16

65

man update-ca-certificates

update-ca-certificates  is  a  program  that  updates   the   directory
/etc/ssl/certs to hold SSL certificates and generates certificates.crt,
a concatenated single-file list of certificates.

It reads the file /etc/ca-certificates.conf. Each line gives a pathname
of  a  CA  certificate  under /usr/share/ca-certificates that should be
trusted.  Lines that begin with "#" are comment lines and thus ignored.
Lines  that  begin with "!" are deselected, causing the deactivation of
the CA certificate in question.

Furthermore   all   certificates   found   below   /usr/local/share/ca-
certificates are also included as implicitly trusted.

从以上内容可以推断出,将本地证书文件放入受信任存储区的首选方法是将其放入/usr/local/share/ca-certificates,然后运行update-ca-certificates。您无需/etc/ssl/certs直接触摸。


23
似乎也需要使用.crt扩展名命名证书。
phyzome

感谢您的注释@phyzome-否则将无法添加我的证书。
Seiyria

我必须添加--fresh才能使其正常工作。例如update-ca-certificates --fresh
Elijah Lynn

15

我遇到了同样的问题,我不得不将.pem文件复制到/usr/local/share/ca-certificates,并将其重命名为.crt。该.cer文件可以很容易地转换为.pem与OpenSSL的,例如,如果你不具备的.pem

复制文件后,必须执行sudo update-ca-certificates


openssl x509 -inform DER -in certificate.cer -out certificate.crt
webwurst

14

其他答案与update-ca-certificates从系统证书存储区读取的应用程序正确。对于Chrome和Firefox,以及其他一些可能的证书,必须将证书放在nssdb(Mozilla NSS库的后端)中。

https://code.google.com/p/chromium/wiki/LinuxCertManagement

例如,要信任用于颁发SSL服务器证书的根CA证书,请使用

certutil -d sql:$ HOME / .pki / nssdb -A -t“ C,” -n <证书昵称> -i <证书文件名>

在哪里<certificate nickname>是任意的,并且<certificate filename>是您的.pem或.crt文件。

其他有用的参考资料:


谢谢。它可在适用于Chrome 53.0.2785.143的Ubuntu 16.04上运行,但Firefox 49似乎具有单独的存储数据库,必须从about:preferences#advanced [查看证书]-> [权限]-> [导入]中添加。askubuntu.com/a/248326/535154
mauron85

顺便说一句,如果要第一次运行Chrome 之前安装证书(即,虽然.pki / dir仍然丢失),则必须首先创建nssdb:mkdir -p $HOME/.pki/nssdb && chmod -R 0700 $HOME/.pki && certutil -d sql:$HOME/.pki/nssdb -N --empty-password
akavel

有一种方法可以使Chrome和Firefox从系统证书存储中读取。看到我的答案:superuser.com/a/1312419/506107
Wheeler '18

11

对于基于Debian的较新版本,您可能需要运行:

sudo dpkg-reconfigure ca-certificates

注意:sudo dpkg-reconfigure ca-certificates会在内部调用update-ca-certificates

当然,在执行以下任何操作之前,您仍然需要将证书(.crt文件)复制到/ usr / share / ca-certificates :)


3

基于dwmw2的答案,您实际上可以告诉使用NSS进行证书管理的应用程序使用系统信任库。

libnss3默认情况下,它附带一组只读的根CA证书(libnssckbi.so),因此大多数时候您需要自己将其手动添加到位于的本地用户信任存储中$HOME/.pki/nssdbp11-kit提供了一个替代产品,libnssckbi.so可作为安装在中的系统范围内根证书的适配器/etc/ssl/certs

编辑:

libnssckbi.so外面似乎有更多的版本,而不仅仅是libnss3。以下是一个脚本,用于查找所有这些脚本,对其进行备份,并用指向p11-kit以下位置的链接替换它们:

sudo apt-get update && sudo apt-get install -y p11-kit libnss3
find / -type f -name "libnssckbi.so" 2>/dev/null | while read line; do
    sudo mv $line ${line}.bak
    sudo ln -s /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so $line
done

原始说明:

为此,请安装p11-kitlibnss3(如果尚未安装):

sudo apt-get update && sudo apt-get install -y p11-kit libnss3

然后备份现有libnssckbi.so提供libnss3

sudo mv /usr/lib/x86_64-linux-gnu/nss/libnssckbi.so /usr/lib/x86_64-linux-gnu/nss/libnssckbi.so.bak

最后,创建符号链接:

sudo ln -s /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so /usr/lib/x86_64-linux-gnu/nss/libnssckbi.so

为了确认它是否有效,您可以运行ll /usr/lib/x86_64-linux-gnu/nss/libnssckbi.so它并显示以下链接:

lrwxrwxrwx 1 root root 49 Apr  9 20:28 /usr/lib/x86_64-linux-gnu/nss/libnssckbi.so -> /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so

现在,如果您使用将该证书添加到CA存储中update-ca-certificates,则这些证书现在可用于使用NSS(libnss3)的应用程序,例如Chrome。


1

如前所述,使用NSS的各种应用程序都有自己的证书存储。就Ubuntu而言,您必须手动certutil为每个用户为每个应用程序添加CA。

在其他发行版(例如Fedora)中,Just Works™这类事情,您应该针对不自动信任您使用CA安装的所有应用程序提交错误update-ca-trust

您也可以在Ubuntu中修复此问题,方法是安装该p11-kit-modules软件包,然后使用进行符号链接(例如,从到)替换NSS 内置的信任根模块。p11-kit-trust.so/usr/lib/firefox/libnssckbi.so/usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so

然后,您获得系统配置的信任根,而不是一些硬编码的信任根。请注意,Ubuntu附带了带有硬编码信任根的libnssckbi.so库的多个不同副本,您必须替换所有这些副本!

cf. https://bugs.launchpad.net/ubuntu/+source/nss/+bug/1647285


当我做sudo find / -type f -name "libnssckbi.so",它发现libnssckbi.so在三个地方:/usr/lib/thunderbird//usr/lib/firefox/,和/usr/lib/x86_64-linux-gnu/nss/。所以您是说我应该libnssckbi.so将这三个文件夹中的都链接到p11-kit-trust.so
惠勒

1
好的,只需确认链接/usr/lib/x86_64-linux-gnu/nss/libnssckbi.so-> /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so就像CHARM一样起作用。我能够在/usr/local/share/ca-certificates,run sudo update-ca-certificates和PRESTO中添加证书,Chrome开始接受自签名证书。
惠勒

0

在这里添加的答案非常愚蠢,但是我花了2个小时来回在linux中使用certutils ...我确定一切都正确:

hutber@hutber-mint /var/www/asos-mvt-framework $ certutil -L -d sql:${HOME}/.pki/nssdb

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

anyproxy                                                     CT,, 
rootCA                                                       CT,, 
myasos                                                       CT,, 

但是,在chrome中,什么都没有起作用。最后,我尝试了一切。

Restarting Chrome

以下是我成功的关键:史蒂文·星期一的建议

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.