Как добавить центр сертификации (CA) в Ubuntu?

166

Моя работа решила выпустить свой собственный центр сертификации (CA) для безопасной обработки различных аспектов нашей работы без оплаты сертификатов.

  • Криптографически подписывать письма
  • Шифровать содержимое электронной почты
  • Сделайте доступ к таким вещам, как клиентские сертификаты IRC компании .
  • Отзывать ключи бывших сотрудников автоматически

Они прислали мне .pemфайл, и я не уверен, как добавить его в мою установку Ubuntu. Были отправлены следующие инструкции: «Двойной щелчок по нему на Mac должен установить его». 

Как мне продолжить? Нужно ли мне что - то делать с OpenSSL , чтобы создать .key, .csrили .crtфайл?

Xeoncross
источник
2
комментарий "Отправленные инструкции были: \" Двойной щелчок по нему на Mac должен установить его. "" сделал мой день
mzoll

Ответы:

231

Установка ЦС

Скопируйте свой сертификат в формате PEM (в том формате, ----BEGIN CERTIFICATE----в котором он есть) /usr/local/share/ca-certificatesи назовите его с .crtрасширением файла.

Тогда беги sudo update-ca-certificates.

Предупреждения: эта установка влияет только на продукты, которые используют это хранилище сертификатов. Некоторые продукты могут использовать другие магазины сертификатов; Если вы используете эти продукты, вам необходимо добавить этот сертификат CA и в другие хранилища сертификатов. ( Firefox Инструкция , Chrome Инструкция , Java Инструкция )

Тестирование CA

Вы можете проверить, сработало ли это, посмотрев сертификат, который вы только что добавили /etc/ssl/certs/ca-certificates.crt(который представляет собой длинный список всех соединенных вместе доверенных ЦС).

Вы также можете использовать s_client OpenSSL, пытаясь подключиться к серверу, который, как вы знаете, использует сертификат, подписанный только что установленным ЦС.

$ 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:). Это говорит о том, что сервер представляет сертификат, подписанный устанавливаемым центром сертификации.

Во-вторых, ищите verify return codeв конце, чтобы быть установленным 0 (ok).

Марк Э. Хаас
источник
3
этот действительно работает
Sabareesh Kkanan
1
Спасибо, что отметили, что Firefox / Chrome не используют хранилище сертификатов по умолчанию.
Тим Страйдхорст
4
Обратите внимание, что update-ca-сертификаты могут быть очень привередливы (вероятно, по замыслу). mycert.pem.crt НЕ работал, но mycert.crt работал. Я также думаю, что это должны быть / usr / local / share / ca-сертификаты, а не / usr / share / ca-сертификаты (несмотря на то, что в комментариях говорится в /etc/ca-certificates.conf).
Лабиринт
2
Спасибо за crtкомментарий к расширению, который был секретом для получения этой работы для меня, я получил сертификат с certрасширением и был смущен тем, почему ничего не работает.
Рэнсом Бриггс
3
Одно предостережение: s_clientне отправлять SNI по умолчанию, и серверу может потребоваться SNI, особенно если он поддерживает виртуальные хосты / сайты с разными сертификатами; для этого случая добавить -servername foo.whatever.com. Или если это веб- сервер (современные версии) curlили wgetкоторый делает SNI автоматически.
dave_thompson_085
66

man update-ca-сертификаты :

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 - не смог бы добавить мой сертификат в противном случае.
Сейрия
1
Я должен был добавить, --freshчтобы заставить его работать. напримерupdate-ca-certificates --fresh
Илия 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, бэкэнд для библиотеки NSS Mozilla.

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

Например, чтобы доверять сертификату корневого ЦС для выдачи сертификатов сервера SSL, используйте

certutil -d sql: $ HOME / .pki / nssdb -A -t "C ,," -n <псевдоним сертификата> -i <имя файла сертификата>

Где <certificate nickname>произвольно, и <certificate filename>ваш файл .pem или .crt.

Другие полезные ссылки:

Johann
источник
Благодарю. Он работает в Ubuntu 16.04 для Chrome 53.0.2785.143, но Firefox 49, кажется, имеет отдельную базу данных хранилища и должен быть добавлен из примерно: предпочтения # расширенный [Просмотр сертификатов] -> [Полномочия] -> [Импорт] Подробнее о хранилище сертификатов Firefox. 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
Уилер
11

Для новых сборок, основанных на Debian, вам может потребоваться выполнить:

sudo dpkg-reconfigure ca-certificates

ПРИМЕЧАНИЕ: sudo dpkg-переконфигурирует ca-Certificates внутренне, вызывает update-ca-Certificates

Вам, конечно, все еще нужно будет скопировать сертификат (файл .crt) в / usr / share / ca-сертификаты, прежде чем делать что-либо из этого :)

missmah
источник
4

Опираясь на dwmw2 в ответ , вы можете сказать , приложения , которые используют NSS для его управления сертификатами использовать систему доверия магазин.

libnss3по умолчанию поставляется с набором корневых сертификатов CA (только для чтения libnssckbi.so), поэтому большую часть времени вам нужно вручную добавлять их в локальное хранилище доверенных сертификатов пользователя, расположенное в $HOME/.pki/nssdb. p11-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-kitи libnss3(если они еще не установлены):

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, такого рода вещи просто работает ™ и вы должны сообщить об ошибке против каких - либо приложений , которые автоматически не доверяют УЦ установке с 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 с жестко заданными доверительными корнями, и вам необходимо заменить их все!

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

dwmw2
источник
Когда я сделал 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работает как ШАРМ. Я смог добавить сертификат /usr/local/share/ca-certificates, запустить sudo update-ca-certificatesи PRESTO, Chrome начал принимать самоподписанные сертификаты.
Уилер
0

Серьезно глупый ответ, чтобы добавить сюда, но я потратил 2 часа туда-сюда с certutils в Linux ... Я был уверен, что все было правильно:

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,, 

Но все равно в хроме ничего не получалось. Я перепробовал все, в конце концов ....

Restarting Chrome

Был ключ к моему успеху после следующего: совет Стивена понедельника

Джейми Хатбер
источник