Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Анонс

  • Далее развернем собственный удостоверяющий центр Smallstep и будем получать сертификаты, подписанные им.

Схема PKI остаётся той же, только изменяются компоненты:

  • В качестве CA вместо Let’s Encrypt, будет использоваться OpenSSL и CA Smallstep.

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Практика Self-signed certificate

OpenSSL 

Начнем с классики криптографии OpenSSL. Сейчас широко используется версия 1.1.1, но ее поддержка заканчивается в 2023. Следующая версия 3.0 будет поддерживаться до 2026 года. Проверка установленной версии:

OpenSSL 1.1.1k FIPS 25 Mar 2021

Если OpenSSL не установлен, то его можно установить на всех востребованных платформах.

Реализация TLS

  • Для нашего CA генерируем приватный ключ 2048-бит RSA. Администратор CA должен хранить его в секрете от всех: 

openssl genrsa -out root_ca.key 2048

  • Далее для нашего CA генерируем X.509 сертификат на 365 дней (root_ca.crt) и подписываем его приватным ключом (root_ca.key). Получается самоподписанный сертификат, его можно и нужно будет скопировать на все компьютеры, между которыми необходимо организовать TLS соединение. При ответах на вопросы, которые будет задавать OpenSSL, можно указывать произвольные данные, CA я назвал «My CN»: 

openssl req -x509 -new -key root_ca.key -days 365 -out root_ca.crt

  • Смотрим получившийся сертификат, убеждаемся, что данные в нем корректные:

openssl x509 -text -in root_ca.crt

openssl genrsa -out server.key 2048

openssl req -new -key server.key -subj "/CN=xx.xx.xx.xx/CN=server/CN=server.example.com" -out server.csr

  • Можно посмотреть получившийся запрос на сертификат и убедиться в его корректности:

openssl req -text -in server.csr

openssl x509 -req -in server.csr -CA root_ca.crt -CAkey root_ca.key -CAcreateserial -out server.crt -days 365 -extensions SAN -extfile openssl.cnf

  • Файл openssl.cnf должен содержать список SAN (Subject Alternative Name) идентичный тому, что был в CSR запросе на сертификат:

[SAN]
subjectAltName = @alt_names
[alt_names]
IP.1 = xx.xx.xx.xx
DNS.1 = server
DNS.2 = server.example.com
  • Можно посмотреть на получившийся сертификат и убедиться в его корректности:

openssl x509 -text -in root_ca.crt

const fs = require('fs');
const https = require('https');
 
https
  .createServer(
    {
      requestCert: false,
      rejectUnauthorized: false,
      ca: fs.readFileSync('root_ca.crt'),
      cert: fs.readFileSync('server.crt'),
      key: fs.readFileSync('server.key')
    },
    (req, res) => {
      console.log("req.client.authorized: ", req.client.authorized)
      if (req.client.authorized) {
        const cert = req.socket.getPeerCertificate(false) // true - получить все сертификаты, false - последний
        console.log("cert: ", cert)
    }
      res.end('Hello, world!');
    }
  )
  .listen(9443);
  • Запускать данный скрипт будем с помощью Node.js. Если Node.js не установлен, то устанавливаем:

sudo yum groupinstall 'Development Tools'

sudo yum install nodejs

  • Проверяем, что Node и Npm установились успешно:

  • Проверяем сервер curl-ом:

При первом запросе возникнет ошибка: 

curl: (60) SSL certificate problem: self signed certificate in certificate chain

Это значит, что самоподписанный корневой сертификат нашего CA (root_ca.crt) не находится в хранилище доверительных сертификатов. Процесс загрузки сертификатов в это хранилище специфичен для операционной системы. Приведу алгоритм для RH Linux:

  • Если сертификат не в PEM (текстовом) формате, то его надо сконвертировать в текстовой формат:

openssl x509 -in root_ca.crt -out root_ca.pem -outform PEM

  • Копируем сертификат в определенный каталог на сервере. ДляRH 7 и выше это каталог:

  • Выполняем команду обновления хранилища сертификатов:

  • Теперь curl проходит 

  • на Windows есть специфика — в curl необходимо добавлять параметр «ssl-no-revoke», чтобы не проверялся список отозванных сертификатов:

  • При этом сервер выведет в консоль строку:

Это значит, что мы установили TLS соединение только с проверкой сертификата сервера, а не клиента. Переходим к mTLS.

Реализация mTLS 

{
requestCert: true,
rejectUnauthorized: true,
}

Алгоритм генерации клиентских сертификатов аналогичен серверным.

  • Генерируем приватный ключ для клиента:

openssl genrsa -out client.key 2048

  • Генерируем запрос на сертификат CSR со списком CN:

openssl req -new -key client.key -subj "/CN=xx.xx.xx.xx/CN=client/CN=client.example.com" -out client.csr

  • Генерируем сертификат для клиента и подписываем его приватным ключом CA:

openssl x509 -req -in client.csr -CA root_ca.crt -CAkey root_ca.key -CAcreateserial -out client.crt -days 365 -extensions SAN -extfile openssl.cnf

Файл openssl.cnf — такой же как и для сервера, только вместо «server» пишем «client». 

  • Копируем следующие файлы на компьютер, на котором будет работать клиент: 

  • Теперь если просто вызвать curl:

  • То произойдет ошибка авторизации

curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

  • Поэтому вызываем curl с дополнительными параметрами, в которых указываем ключ клиента и сертификаты клиента и СА: 

  • Теперь запрос проходит, при этом сервер выведет в консоль следующую строку и далее содержимое полученного от клиента сертификата:

Это значит, что мы установили mTLS соединение с проверкой сертификата как сервера, так и клиента. Теперь установим mTLS из браузера.

Реализация mTLS в браузере 

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Для загрузки в браузер клиентский сертификат и приватный ключ надо сконвертировать в формат p12. Этот формат определяется стандартом PKCS #12 и является архивом для хранения нескольких объектов. В нашем случае файл будет хранить клиентский сертификат и его приватный ключ. Понятно, что приватный ключ — это чувствительная к разглашению информация и ее владелец не должен выкладывать p12 сертификат в открытый доступ. Для конвертации тоже используем OpenSSL:

openssl pkcs12 -inkey client.key -in client.crt -export -out client.p12

Импортируем client.p12 в браузер. Для этого, например в Chrome, идем в меню: Settings / Privacy and security / Manage certificates, в открывшемся окне нажимаем Import, выбираем наш файл client.p12 и место хранения «Personal». Видим, что клиентский сертификат, выданный нашим удостоверяющим центром «My CN», появился  в хранилище персональных сертификатов:

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Вызываем запрос заново, уже лучше, но браузер все равно пишет, что соединение не безопасно. Это из-за того, что клиентский сертификат выдан удостоверяющим центром «My CN», которого нет в списке доверительных CA (Trusted Root Certification Authorities). 

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Добавляем корневой сертификат нашего CA (root_ca.crt) в Trusted Root Certification Authorities. Делается с помощью того же вызова Import, что и для клиентского сертификата, но хранилище указываем Trusted Root Certification Authorities. Проверяем, что наш CA «My CN» появился в хранилище:

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04
Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Дальнейшие вызовы проходят без запросов на подтверждение клиентского сертификата:

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Если щелкнуть на замочке а адресной строке, то можно посмотреть сертификат сервера и убедиться, что мы взаимодействуем с правильным сервером (Issued to: server.example.com), сертификат которому выдан нашим удостоверяющим центром (Issued by: My CN) и время действия сертификата еще не прошло (Valid to: 31.05.2023):

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

Таким образом мы организовали mTLS соединение из браузера. Далее приведу для справки несколько дополнительных возможностей OpenSSL, которые могут пригодиться в процессе работы. 

Дополнительные возможности OpenSSL

Конвертация форматов сертификатов

  • Конвертируем сертификат в der (бинарный формат):

openssl x509 -outform der -in client.crt -out client.der

  • Конвертируем сертификат в PEM (текстовой формат)

openssl x509 -inform der -in client.cer -out client.pem

Отладка с помощью OpenSSL

  • Проверка, что сертификат подписан определенным (root_ca.pem) удостоверяющим центром:

openssl verify -verbose -x509_strict -CAfile root_ca.pem server.crt

openssl s_server -accept 9443 -cert server.crt -key server.key

  • Запускаем OpenSSL client

openssl s_client -connect xx.xx.xx.xx:9443 -prexit -showcerts -state -status -tlsextdebug -verify 10 

  • При вызове curl параметр:

    • -k — позволяет подсоединяться к серверу без проверки цепочки сертификатов (certificate path validation). 

    • —ssl-no-revoke  — предотвращает проверку отозванных сертификатов 

Практика CA Smallstep

Установка Smallstep и CLI step 

CA Smallstep — это open source CA, который можно развернуть локально для автоматического получения X.509 сертификатов. На официальном сайте есть ряд инструкций по его установке и настройке.  Для экспериментов я использовал вариант с docker:

  • Краткая выжимка из инструкции по установке на RH Linux. Сначала устанавливаем docker:

sudo yum -y update

sudo yum install -y yum-utils

sudo yum -y install docker-ce

sudo systemctl start docker

  • Проверяем корректность установки docker:

sudo docker run hello-world

sudo docker pull smallstep/step-ca

  • Инициализируем наш CA:

docker run -it -v step:/home/step smallstep/step-ca step ca init

должна вернуться строка:

На этом же или другом компьютере по инструкции  устанавливаем утилиту CLI step. Краткая выжимка:

tar -xf step_linux_0.19.0_386.tar.gz

  • Копируем утилиту step в /usr/bin

  • Регистрируем CLI step для использования с нашим CA. Этот процесс называется «bootstrap».  Значение параметра «ca-url» — это IP и порт, на котором запущен Smallstep CA, «fingerprint » — это сохраненное значение при инициализации CA:

  • Проверка связи с CA:

step ca health

должна вернуться строка:

Все готово для генерации ключей и сертификатов.

Генерация ключей и сертификатов 

Также как и в случае с OpenSSL, сначала генерируем ключ и сертификат для сервера и установки TLS соединения, потом для клиента и установки mTLS. 

  • В отличии от OpenSSL, CA Smallstep может одновременно сформировать приватный ключ сервера 2048-бит RSA (server.key) и запрос на сертификат (server.csr). В запросе явно указываем, что пароль должен быть пустой (no-password), xx.xx.xx.xx — это IP адрес сервера, для которого генерируется запрос: 

step certificate create --csr --no-password --insecure --kty=RSA --size=2048 "xx.xx.xx.xx" server.csr server.key

  • Подписываем сертификат на нашем CA Smallstep:

step ca sign server.csr server.crt

  • Смотрим полученный сертификат: 

step certificate inspect server.crt

  • Получаем с CA Smallstep его корневой сертификат: 

step ca root root_ca.crt

  • Смотрим корневой сертификат:

step certificate inspect root_ca.crt

  • Проверяем сервер curl-ом:

Все нормально, теперь генерируем ключ и сертификат для клиента.

  • Аналогично серверу одновременно формируем приватный ключ клиента 2048-бит RSA (client.key) и запрос на сертификат (client.csr). Явно указываем, что пароль должен быть пустой (no-password), xx.xx.xx.xx — это IP адрес клиента, для которого генерируется запрос: 

step certificate create --csr --no-password --insecure --kty=RSA --size=2048 "xx.xx.xx.xx" client.csr client.key

  • Подписываем сертификат на CA:

step ca sign client.csr client.crt

step certificate inspect client.crt

  • Получаем корневой сертификат CA:

step ca root root_ca.crt

  • Смотрим корневой сертификат:

step certificate inspect root_ca.crt

  • Копируем на клиента:

  • Для проверки вызываем curl с параметрами:

Отлично — mTLS тоже работает с выданными CA Smallstep сертификатами!

Дополнительные возможности CA Smallstep

С помощью CLI step можно проверить необходимость обновления сертификата: 

step certificate needs-renewal server.crt

  • Если обновление не требуется возвращается строка:

certificate does not need renewal

  • Если требуется, то строка пустая и тогда необходимо обновить сертификат:

step ca renew server.crt server.key

  • При необходимости сертификат можно отозвать, в этом случае его невозможно будет продлить, только получить заново:

step ca revoke --cert server.crt --key server.key

  • Посмотреть все сертификаты в цепочке: 

Читать также:  Сертификат многодетным семьям на приобретение жилья спб горжилобмен

step certificate inspect server.crt --bundle

  • Запуск CLI step в режиме отладки:

STEPDEBUG=1 step /команда/

Заключение

В данной статье мы рассмотрели две возможности генерации ключей и сертификатов для клиента и сервера:

  • С помощью OpenSSL.

  • Используя CA Smallstep.

И двумя способами установили TLS и mTLS соединения:

  • С помощью curl.

  • Из браузера, загрузив в него клиентский и корневой сертификаты.

Теперь у нас есть понимание, как организовать свою систему PKI с помощью CA любого производителя, т.к. логика взаимодействия у всех аналогичная. Более того, большинство CA используют под капотом OpenSSL, оборачивая его в свой API.

image

Некоторое время назад я задался вопросом, можно ли наладить фабрику сертификатов, не прибегая к утилите openssl. Как подвести «под кнопку» весь процесс от генерации ключей до проверки подлинности. Забегая вперед, скажу, что пространство System.Security.Cryptography в этом плане является вполне самодостаточным. В статье я рассмотрю этапы создания сертификатов, экспорт в форматы pem и pkcs12, хранение сертификатов в файловой системе, а также проверку подлинности, используя только классы из System.Security.Cryptography.

Создание

В статье я буду рассматривать простую схему взаимодействия клиент-сервер, без удостоверяющего центра. Для взаимной проверки подлинности нам понадобится корневой самоподписанный сертификат caCert и два конечных clientCert и serverCert. Клиенты обмениваются своими сертификатами, проверяют подлинность корневым, успех. Создание сертификатов состоит из тех же этапов, как и любое руководство по openssl:

  1. Генерируем ассиметричный ключ:

    var rsaKey = RSA.Create(2048);

  2. Описываем субъект сертификации:

    string subject = "CN=myauthority.ru";

    cn – “common name”, общепринятое имя организации, определяющее, какие имена хостов будет защищать сертификат. В общем случае строка может содержать дополнительные поля, разделенные косой чертой. Пример из MSDN «C = US/O = Microsoft/OU = WGA/CN = test«.

  3. Создаем запрос на сертификат:

    var certReq = new CertificateRequest(subject, rsaKey,HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);

    Режим Pkcs1 используется по умолчанию в openssl.

  4. Дополнительно настраиваем запрос:

    certReq.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true)); 
    certReq.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(certReq.PublicKey, false));

    Этими дополнениями мы указываем, что данный сертификат принадлежит центру сертификации, а также используем публичный ключ для создания SKI (идентификатора ключа субъекта).

  5. Создаем сертификат на 5 лет:

    var expirate = DateTimeOffset.Now.AddYears(5);
    var caCert  = certReq.CreateSelfSigned(DateTimeOffset.Now, expirate);

Теперь создаем конечные сертификаты.

  1. var clientKey = RSA.Create(2048);
    string subject = "CN=10.10.10.*";
    var clientReq = new CertificateRequest(subject, clientKey,HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);

    Здесь в качестве защищаемого объекта можно указать подсеть или конечный ip адрес, если доменное имя не используется.

  2. В дополнение к предыдущим настройкам мы указываем назначение ключа:

    clientReq.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false));
    clientReq.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation, false));
    clientReq.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(clientReq.PublicKey, false));

  3. Назначаем сертификату серийный номер:

    byte[] serialNumber = BitConverter.GetBytes(DateTime.Now.ToBinary());

    Serial Number – уникальный идентификатор, назначенный каждому сертификату, выданному издателем. Рекомендуется использовать общедоступный счетчик, инициализированный на основе текущего времени.

  4. Создаем сертификат на 5 лет:

    var clientCert = clientReq.Create(caCert, DateTimeOffset.Now, expirate, serialNumber):

    Время экспирации не должно выходить за границы корневого сертификата, иначе мы получим соответствующую ошибку. Теперь, если сравнить поля caCert.Subject и clientCert.Issuer, то они совпадают, как мы и ожидали.

Хранение

Теперь, когда у нас есть все сертификаты, необходимо их сохранить. В руководстве openssl обычно предлагается хранить сертификаты в формате pem, разбив их на открытую часть public.crt и private.key. Полученные на предыдущих этапах сертификаты являются экземплярами класса X509Certificate2, который имеет все необходимые для нас свойства и методы. Итак, чтобы получить открытую часть, необходимо закодировать содержимое сертификата в base64 и записать в файл:

StringBuilder builder = new StringBuilder();
builder.AppendLine("-----BEGIN CERTIFICATE-----");
builder.AppendLine(Convert.ToBase64String(clientCert.RawData, Base64FormattingOptions.InsertLineBreaks));
builder.AppendLine("-----END CERTIFICATE-----");
File.WriteAllText("public.crt", builder.ToString());

Также сохраним закрытый ключ:

string name = clientKey.SignatureAlgorithm.ToUpper();
StringBuilder builder = new StringBuilder();
builder.AppendLine($"-----BEGIN {name} PRIVATE KEY-----");
builder.AppendLine(Convert.ToBase64String(clientKey.ExportRSAPrivateKey(), Base64FormattingOptions.InsertLineBreaks));
builder.AppendLine($"-----END {name} PRIVATE KEY-----");
File.WriteAllText("private.key", builder.ToString());

Отмечу, что метод ExportRSAPrivateKey появился только в netcore 3.0, поэтому в предыдущих версиях могут возникнуть проблемы.

Еще один способ хранения сертификатов — формат pkcs12 или pfx, позволяющий уместить в одном файле открытую и закрытую часть. Класс X509Certificate2 содержит метод Export, принимающий в качестве аргумента необходимый нам ключ X509ContentType.Pkcs12 или X509ContentType.Pfx. Однако на этом этапе возникают трудности, поскольку загруженный обратно из файла сертификат неожиданно не содержит приватного ключа, о чем свидетельствует флаг cert.HasPrivateKey == false. Дело в том, что класс X509Certificate2 содержит внутреннюю метку, описывающую, куда и как экспортируется закрытый ключ. Эта метка инициализируется только с помощью конструктора и не может быть изменена после. Поэтому для создания файла p12 или pfx, необходимы дополнительные усилия:

var exportCert = new X509Certificate2(clientCert.Export(X509ContentType.Cert), (string)null, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet).CopyWithPrivateKey(clientKey);
File.WriteAllBytes("client.pfx", exportCert.Export(X509ContentType.Pfx));
File.WriteAllBytes("client.p12", exportCert.Export(X509ContentType.Pkcs12));

При желании можно использовать перегрузки метода Export с паролем.

Для работы с коллекциями сертификатов в .net core удобно использовать специализированное хранилище, реализуемого классом X509Store. Хранилище в простом случае инициализируется строковым именем:

X509Store store = new X509Store("test");
store.Open(OpenFlags.ReadWrite);
store.Add(cert);

Проверка

server {
        listen 443;
        ssl on;
        ssl_certificate /etc/nginx/ssl/public.crt;
        ssl_certificate_key /etc/nginx/ssl/private.key;
        ssl_client_certificate /etc/nginx/ssl/caCert.crt;
        ssl_verify_client on;
}

SocketsHttpHandler handler = new SocketsHttpHandler();
handler.SslOptions.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
 {
    X509Chain chain = new X509Chain(false);
    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;
    chain.ChainPolicy.ExtraStore.Add(caCert);
    var serverСert = new X509Certificate2(certificate);
    return chain.Build(serverСert);
};
handler.SslOptions.ClientCertificates = new X509CertificateCollection() { clientCert };
HttpClient client = new HttpClient(handler);
var resp = await client.GetAsync…

Настройка построения цепочки заключается в отключении поиска сертификата в списке «отозванных» и допустимости «недоверенных» сертификатов.

Итог

В реализациях .net core для ОС Linux криптографические функции выполняются через взаимодействие с библиотеками OpenSSL. Поэтому принципиальной разницы между создаваемыми сертификатами нет. Есть библиотеки, такие как BouncyCastle, которые умеют гораздо больше и, возможно, удобнее, но лично мне не хочется использовать дополнительные зависимости ради 10 процентов функционала. Надеюсь, статья хоть немного упростит поиски информации для тех, кому предстоит разбираться в сложностях работы с X.509.

Введение:

Потребовалось мне тут как-то написать небольшой API, в котором необходимо было помимо обычных запросов принимать запросы с «высокой степенью секретности».
Не я первый с этим столкнулся и мир давно уже использует для таких вещей SSL.

Поскольку на моём сервере используется nginx, то был установлен модуль SSL
Гугл не выдал ни одного работоспособного howto, но информация в сети есть по частям.

Итак, пошаговое руководство по настройке nginx на авторизацию клиентов через SSL-сертификаты.

Внимание! В статье для примера используются самоподписанные сертификаты!

Перед стартом создадим папку в конфиге nginx, где будут плоды наших трудов:

cd /path/to/nginx/config/
mkdir ssl && cd ssl

Шаг 1. Создание собственного самоподписанного доверенного сертификата.

Собственный доверенный сертификат (Certificate Authority или CA) необходим для подписи клиентских сертификатов и для их проверки при авторизации клиента веб-сервером.
С помощью приведенной ниже команды создается закрытый ключ и самоподписанный сертификат.

openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 500 -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/emailAddress=support@site.com -out ca.crt

Шаг 2. Сертификат сервера

Создадим сертификат для nginx и запрос для него

openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr

Подпишем сертификат нашей же собственной подписью

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

Чтобы nginx при перезагрузке не спрашивал пароль, сделаем для него беспарольную копию сертификата

openssl rsa -in server.key -out server.nopass.key
Конфиг nginx

listen *:443;
ssl on;
ssl_certificate /path/to/nginx/ssl/server.crt;
ssl_certificate_key /path/to/nginx/ssl/server.nopass.key;
ssl_client_certificate /path/to/nginx/ssl/ca.crt;
ssl_verify_client on;

keepalive_timeout 70;
fastcgi_param SSL_VERIFIED $ssl_client_verify;
fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial;
fastcgi_param SSL_CLIENT_CERT $ssl_client_cert;
fastcgi_param SSL_DN $ssl_client_s_dn;

Однако если вы попытаетесь зайти на сайт, он выдаст ошибку:

400 Bad Request
No required SSL certificate was sent

Что ж, логично, в этом-то и вся соль!

Шаг 3. Создание клиентских сертификатов

3.1 Подготовка CA

Создадим конфиг
nano ca.config

со следующим содержимым:

[ ca ]
default_ca = CA_CLIENT # При подписи сертификатов # использовать секцию CA_CLIENT

[ CA_CLIENT ]
dir = ./db # Каталог для служебных файлов
certs = $dir/certs # Каталог для сертификатов
new_certs_dir = $dir/newcerts # Каталог для новых сертификатов

database = $dir/index.txt # Файл с базой данных подписанных сертификатов
serial = $dir/serial # Файл содержащий серийный номер сертификата (в шестнадцатеричном формате)
certificate = ./ca.crt # Файл сертификата CA
private_key = ./ca.key # Файл закрытого ключа CA

default_days = 365 # Срок действия подписываемого сертификата
default_crl_days = 7 # Срок действия CRL
default_md = md5 # Алгоритм подписи

policy = policy_anything # Название секции с описанием политики в отношении данных сертификата

[ policy_anything ]
countryName = optional # Поля optional - не обязательны, supplied - обязательны
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional

Далее надо подготовить структуру каталогов и файлов, соответствующую описанной в конфигурационном файле

mkdir db
mkdir db/certs
mkdir db/newcerts
touch db/index.txt
echo "01" > db/serial
3.2. Создание клиентского закрытого ключа и запроса на сертификат (CSR)

Для создания подписанного клиентского сертификата предварительно необходимо создать запрос на сертификат, для его последующей подписи. Аргументы команды полностью аналогичны аргументам использовавшимся при создании самоподписанного доверенного сертификата, но отсутствует параметр -x509.

openssl req -new -newkey rsa:1024 -nodes -keyout client01.key -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/emailAddress=support@site.com -out client01.csr

В результате выполнения команды появятся два файла client01.key и client01.csr.

3.3. Подпись запроса на сертификат (CSR) с помощью доверенного сертификата (CA).

При подписи запроса используются параметры заданные в файле ca.config

openssl ca -config ca.config -in client01.csr -out client01.crt -batch

В результате выполнения команды появится файл клиентского сертификата client01.crt.

Для создания следующих сертификатов нужно повторять эти два шага.

3.4. Создание сертификата в формате PKCS#12 для браузера клиента

Это на тот случай, если к вашему серверу подключаются не бездушные машины, как в моём случае, а живые люди через браузер.
Запароленный файл PKCS#12 надо скормить браузеру, чтобы он смог посещать ваш сайт.

openssl pkcs12 -export -in client01.crt -inkey client01.key -certfile ca.crt -out client01.p12 -passout pass:q1w2e3
3.5 Подключение к полученному ssl cерверу с помощью curl

curl -k --key client.key --cert client1.crt --url "https://site.com"

Использована опция -k, потому что сертификат в примере самоподписанный

Использованное ПО

Ubuntu Server 10.10 (Linux 2.6.35-22-server #35-Ubuntu SMP x86_64 GNU/Linux)
nginx 0.9.3
OpenSSL 0.9.8o 01 Jun 2010

Полезные ссылки

Надеюсь, был кому-то полезен.

P.S. Этот пост был моей первой публикацией 16 января 2011 года, старая копия удалена (по желанию администрации сайта и потому, что она не была привязана к моему аккаунту).

Примеры использования OpenSSL в Unix/Linux

При работе с SSL, нужно уметь работать с утилитой OpenSSL чтобы создавать, конвертировать, управляют SSL-сертификатами. В этой статье «Примеры использования OpenSSL в Unix/Linux» я буду говорить о примерах использования OpenSSL.

Некоторые из сокращений, связанных с сертификатами:

  • SSL – Secure Socket Layer (Безопасный уровень сокета).
  • CSR – Certificate Signing Request (Запрос на подпись сертификата).
  • TLS – Transport Layer Security (Транспортный уровень безопастности).
  • PEM – Privacy Enhanced Mail
  • DER – Distinguished Encoding Rules
  • SHA – Secure Hash Algorithm (Безопасный hash алгорит).
  • PKCS – Public-Key Cryptography Standards (Стандарты шифрования публичных ключей).

Создание нового приватного ключа (Private Key) и Certificate Signing Request (CSR).

# openssl req -out linux-notes.org.csr -newkey rsa:2048 -nodes -keyout linux-notes.org.key

Команда выше будет генерировать CSR и 2048-битный RSA ключ. Если вы собираетесь использовать этот сертификат в Apache или Nginx, то вам необходимо отправить этот CSR файл в службу сертификации и они дадут вам подписанный сертификат в «der» или «pem» формате. После чего вы настроите его на веб-сервере Apache или Nginx.

Так же, можно использовать такой вариант:

$ openssl req -new -newkey rsa:2048 -nodes -out linux-notes.org.csr -keyout linux-notes.org.key -subj "/C=US/ST=Wisconsin/L=Waukesha/O=IT Dept/OU=Linux Notes/CN=linux-notes.org"

Создание самоподписанного сертификата (Self-Signed Certificate).

# openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout LN-selfsigned.key -out LN-cert.pem

Команда выше будет генерировать самоподписанный сертификат (self-signed) и 2048-битный RSA ключ. Я также использую алгорит шифрования — SHA256. Так как он считается наиболее безопасным в данный момент.

Замечание: По умолчанию, будет сгенерирован ключ толкьо на 1 месяц, если нужно создать на более длительное время — используйте опцию «–days», пример использования ниже.

Пример: Чтобы создать self-signed сертификат на 2 год, используйте:

# openssl req -x509 -sha256 -nodes -days 730 -newkey rsa:2048 -keyout LN-selfsigned.key -out LN-cert.pem

Проверка CSR файла.

# openssl req -noout -text -in linux-notes.org.csr

и вы получите информацию.

Проверка подписи (signature):

$ openssl req -in linux-notes.org.csr -noout -verify

Кем(кому) был выдан сертификат:

$ openssl req -inlinux-notes.org.csr -noout -subject

Показать открытый ключ (public key):

$ openssl req -inlinux-notes.org.csr -noout -pubkey

Создать приватный RSA  ключ (Private Key).

Чтобы это сделать, выполните:

# openssl genrsa -out my_private_rsa.key 2048

Если вам просто нужно генерировать RSA закрытый ключ, вы можете использовать команду что выше. Я включил 2048 шифрование, для безопастности.

Удалить ключевую фразу (Passphrase) с ключа.

# openssl rsa -in linux-notes.org.key -check -out nopassphrase.key

Если вы установили ключевую фразу для ключа, то при каждом старте веб-сервера (Apache/Nginx) вы должны будите вводить пароль. Если это вас злит, вы можете с легкостью удалить  passphrase с RSA ключа.

Проверка приватного ключа (Private Key)

# openssl rsa -in my_private.key -check

Если вы сомневаетесь в ключевом файле, вы можете использовать команду что выше для проверки.

Проверка сертификата (Certificate).

Если вы хотите проверить данные сертификата( CN, OU, и т.д.), то вы можете использовать команду, которая даст вам сведения о сертификате:

# openssl x509 -in certfile.pem -text –noout

Команда довольна простая в использовании.

Проверка подписанного сертификата (Certificate Signer Authority).

# openssl x509 -in some_cert.pem -noout -issuer -issuer_hash

Можно узнать много полезного.

Создать тестовый SSL сервер.

Команда OpenSSL s_server реализует общий SSL/TLS-сервер. Она должна использоваться только для целей тестирования. В приведенном ниже примере данный сервер прослушивает соединения на порту 8080 и возвращает отформатированную HTML страницу статуса, который включает много информации о ciphers:

$ openssl s_server -key key.pem -cert cert.pem -accept 8080 -www

Проверить хеш вашего сертификата.

# openssl x509 -noout -hash -in my_cert.pem

Конвертирование сертификатов с DER в PEM формат.

# openssl x509 -inform der -in LN.der -out LN.pem

Как правило, при покупке SSL сертификатов, его отдают вам в формате .der и если вам нужно использовать его в веб-сервере или .pem формате, вы можете использовать команду выше, чтобы преобразовать такие сертификаты.

Конвертирование сертификатов с PEM в DER формат.

В случае, если вам необходимо изменить .pem формат в .der:

# openssl x509 -outform der -in linux-notes.pem -out linux-notes.der

Конвертирование CSR c DER в PEM формат.

$ openssl req -in csr.der -inform DER -out csr.pem -outform PEM

Конвертирование сертификата и приватного ключа  в PKCS#12 фотмат.

# openssl pkcs12 –export –out sslcert.pfx –inkey key.pem –in sslcert.pem

Если вам необходимо использовать сертификат с приложением Java или с любым другим, кто принимает формат PKCS# 12.

Совет: Вы можете включить «chain certificate» используя «-chain» опцию:

# openssl pkcs12 -export -out my_cert.pfx -inkey my_key.pem -in your_cert.pem -chain the_cert.pem

Создание CSR используя  приватный ключ (private key).

# openssl req -out some_cert.csr -key exists.key -new

Если вы не хотите создать новый секретный ключ, а хотите используя вместо существующего, вы можете с предыдущей командой.

Проверьте содержимое сертификата в PKCS12 формате.

# openssl pkcs12 -info -nodes -in my_certificate.p12

PKCS12 — это двоичный формат, так что вы не сможете просматривать содержимое в блокноте или другом редакторе. Таким образом, вы должны использовать команду что выше, для просмотра содержимого файла формата PKCS12.

Конвертирование PKCS12 формата в PEM сертификат.

# openssl pkcs12 -in my_certificat.p12 -out the_certificat.pem

Получить SHA-1 отпечаток сертификата или CSR

Чтобы получить отпечаток SHA1 сертификата с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -sha1 my_cert.der

Чтобы получить SHA1 отпечаток пальца CSR с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -sha1 the_csr.der

Получить MD5 отпечаток сертификата или CSR

Чтобы получить отпечаток MD5 сертификата с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -md5 cert.der

Чтобы получить MD5 отпечаток пальца CSR с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -md5 my_csr.der

Тестирование SSL сертификата по URL.

# openssl s_client -connect linux-notes.org:443 -showcerts

Я использую это довольно часто для проверки SSL-сертификатов по URL с сервера. Это очень удобно для проверки некоторых деталей протокола, шифров и CERT.

Узнать версию OpenSSL

 # openssl version

Поверка PEM сертификата на завершение (Expiration Date).

# openssl x509 -noout -in cert.pem -dates
# openssl x509 -noout -in bestflare.pem -dates
notBefore=Jul 4 14:02:45 2015 GMT
notAfter=Aug 4 09:46:42 2015 GMT

Проверка завершения SSL сертификата (Expiration Date) по URL.

# openssl s_client -connect linux-notes.org:443 2>/dev/null | openssl x509 -noout -enddate

Проверить поддержку SSL версии V2/V3  по URL.

Проверка SSL версии V2:

# openssl s_client -connect linux-notes.org:443 -ssl2

Проверка SSL версии V3:

# openssl s_client -connect linux-notes.org:443 -ssl3

Проверка TLS 1.0:

# openssl s_client -connect linux-notes.org:443 -tls1

Проверка TLS 1.1:

# openssl s_client -connect linux-notes.org:443 -tls1_1

Проверка TLS 1.2:

# openssl s_client -connect linux-notes.org:443 -tls1_2

Проверка поддержки cipher для сайта по URL.

# openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect linux-notes.org:443

Какой алгоритм используется в сертификате (проверка).

$ openssl req -noout -text -in mycert.csr | grep 'Signature Algorithm'

Или, используя URL:

openssl s_client -connect linux-notes.org:443 < /dev/null 2>/dev/null | openssl x509 -text -in /dev/stdin | grep "Signature Algorithm"

Получить сертификат по URL

Команда что ниже, сохранит сертификат в файл прямо по URL сайта:

$ echo -n | openssl s_client -connect linux-notes.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > pem.cert
$ echo -n | openssl s_client -connect linux-notes.org:443 -servername linux-notes.org | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > pem.cert

Вот и все, много полезностей и все в одной статье «Примеры использования OpenSSL в Unix/Linux».

Настройка SSL сертификата для Apache

Зачем же нужен SSL сертификат?

С помощью SSL сертификата можно зашифровать вашу информацию на сайте сайта для защиты соединений. Так же, он может давать посетителям сайта информацию о идентификации на виртуального сервера.

Как и где можно получить SSL сертификат?

SSL сертификат можно купить или создать самим. Я именно буду использовать самоподписанный сертификат для своего сайта.

В своей статье «Настройка SSL сертификата для Apache», я расскажу как можно установить и настроить SSL сертификат для Apache. На готовых примерах, я покажу как это сделать. Я использую ОС: Debian 8 и CentOS 6/7.

Установка SSL сертификата для Apache

Для начала нужно установить Apache и модуль для него — mod_ssl. Если не знаете как установить apache, то можно ознакомится с материалом тут:

Установка Apache, PHP с suPHP на CentOS/RedHat/Fedora

Установка Apache mpm-itk на Unix/Linux

Установка Apache,PHP 5.5.11, MariaDB 5.5.37 на CentOS 6.5

Установка apache из исходников для FreeBSD (руководство по установке)

И так, apache уже установлен, но нужно еще установить и модуль для работы с SSL сертификатами.

Для CentOS/RHEL/Fedora, выполните команду: 

# yum install mod_ssl

Для Debian/Ubuntu, выполните команду: 

Данный модуль, уже идет с пакетом Apache, по этому, нужно его включить:

# a2enmod ssl

После включения SSL, необходимо перезапустить веб-сервер чтобы изменения вступили в силу, для этого, выполните команду:

# service apache2 restart

Создание нового каталога

# mkdir /etc/httpd/ssl

Т.к в Debian’s apache устанавливается в /etc/apache2, то для хранения сертификатов, я создам новую папку:

# mkdir /etc/apache2/ssl

После чего, можно приступать к генерации сертификата.

Создание самоподписанного сертификата

Сейчас, я создам самоподписанный сертификат который будет работать 365 дней ( 1 год). Все параметры, я опишу немного ниже.

Для CentOS/Fedora/RedHat, выполните команду:

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/httpd/ssl/apache.key -out /etc/httpd/ssl/apache.crt

Для Ubuntu/Debian, выполните команду:

# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/linux-notes.key -out /etc/apache2/ssl/linux-notes.crt

Теперь, рассмотрим что же выполняют некоторые опции:

  • openssl: Это утилита для создания и управления сертификатами, ключами и т.д.
  • req: Это субкоманда, которая создает подпись X.509 (CSR) для управления сертификатом. X.509 является открытым ключом, с помощью которого, можно создать свой самоподписанный сертификат.
  • -x509: Эта опция указывает, что мы хотим сгенерировать файл сертификата с собственной подписью вместо генерации запроса на сертификат.
  • -nodes: С этой опцией я создам ключ который будет  зашифрован с помощью парольной фразы. Имея защищенный паролем ключ, я должен буду вводить вводить пароль каждый раз при перезапуске службы. Я нажну «ENETR» и оставлю пустой пароль.
  • -days 365: Это указывает, что сертификат будет действителен в течение одного года.
  • -newkey rsa:2048: Эта опция служит для создания сертификата и нового закрытого ключа. Это необходимо, так как я не создал секретный ключ заранее. RSA: 2048 сгенерирует ключ RSA с 2048 битным шифрованием.
  • -keyout: Этот параметр задаст выходной файла для файла секретного ключа, который создается.
  • -out: Этот параметр задаст выходной файла для сертификата, который я генерирую.

Входе генерации сертификата, нужно ввести некоторые данные:

Country Name (2 letter code) [XX]:UA
State or Province Name (full name) []:nvs
Locality Name (eg, city) [Default City]:Lugansk
Organization Name (eg, company) [Default Company Ltd]:linux-notes
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:linux-notes.org
Email Address []:solo.metal@bigmir.net

Чтобы не вводить это, можно задать нужные параметры при вводе команды, например:

# openssl req -nodes -newkey rsa:2048 -nodes -keyout /etc/apache2/ssl/linux-notes.key -out /etc/apache2/ssl/linux-notes.crt -subj "/C=UA/ST=Lugansk/L=Lugansk/O=linux-notes Ltd./OU=IT/CN=linux-notes.org"

Настройка SSL сертификата для Apache

И так, уже все есть, сертификат создан и можно приступать к настройке. Для этого, открываем виртуальный хост (если нет, можно создать новый):

Конфигурационный  файл(ы) в RedHat’s можно создать:

# vim /etc/httpd/conf.d/linux-notes.org.conf

Конфигурационный  файл(ы) в Debian’s можно создать:

# vim /etc/apache2/conf.d/linux-notes.org.conf

Мой конфиг выглядит следующим образом:

<IfModule mod_ssl.c>
 <VirtualHost linux-notes.local:443>
    ServerName linux-notes.local
    ServerAlias www.linux-notes.local
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error-linux-notes.local.log
    CustomLog ${APACHE_LOG_DIR}/access-linux-notes.local.log combined
    SSLEngine on
    SSLCertificateFile /etc/ssl/apache.pem
    SSLCertificateKeyFile /etc/ssl/apache.crt
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
       SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
       SSLOptions +StdEnvVars
    </Directory>
    BrowserMatch "MSIE [2-6]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 </VirtualHost>
</IfModule>

Конфиг готов и осталось совсем немногое.

Можно создать перенаправление с 80-порта на 443-й, для этого, нужно прописать перенаправление:

<VirtualHost *:80>
  ServerName linux-notes.org
  RewriteEngine On
  RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>
<VirtualHost *:443>
  ServerName linux-notes.org
  DocumentRoot /var/www/linux-notes.org
  SSLEngine on
  SSLCertificateFile /etc/ssl/apache.pem
  SSLCertificateKeyFile /etc/ssl/apache.crt
  ErrorLog ${APACHE_LOG_DIR}/error-linux-notes.local.log
  CustomLog ${APACHE_LOG_DIR}/access-linux-notes.local.log combined
</VirtualHost>

Настройка вашего брандмауэра

После всех изменений, необходимо так же, пробросить порт (443) для работы веб-сервера (apache), для этого я добавн правило в IPtables:

# iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Перед перезапуском апача, стоит проверить правильный ли синтаксис, можно сделать это с помощью следующей команды:

# httpd -t

Это команда для RPM’s систем, для DEB’s систем найдите сами.

Теперь, когда я настроил SSL в виртуальном хосте, необходимо включить его:

# a2ensite linux-notes.org.conf

и после этого можно перезапускать апач:

# /etc/init.d/httpd restart
# service httpd restart

Открываем сайт, и смотрим что получилось:

 https://IP_or_HOST

Вот и все, все настроено и готово к использованию. Моя тема «Настройка SSL сертификата для Apache» завершена.

Для того чтобы настроить WEB-сервер с SSL шифрованием вам необходимо установить OpenSSL и mod_ssl. Для этого мы сделаем следующее:

# yum install mod_ssl openssl

Создадим самоподписанный сертификат

Нужно использовать OpenSSL для создания самоподписанного сертификата.
Чтобы создать ключ который будет использоваться в сертификате, мне понадобится права root:

Создим приватный ключ

# openssl genrsa -out ca.key 1024

Создим CSR (Certificate signing request)

# openssl req -new -key ca.key -out ca.csr

Создим самоподписанный ключ (допустим на 1 год — 365 дней)

# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

После того как ключик(и) был сгенерирован, необходимо скопировать (положить в нужное место) его/их:

# cp ca.crt /etc/pki/tls/certs
# cp ca.key /etc/pki/tls/private/ca.key
# cp ca.csr /etc/pki/tls/private/ca.csr

Если Вы фанат текстового редактора «vi»:

# vi +/SSLCertificateFile /etc/httpd/conf.d/ssl.conf

Но я использую текстовый редактор «ee», по этому:

# ee /etc/httpd/conf.d/ssl.conf

В этом файлике нужно раскомментировать необходимые строки, в моем случае это:

SSLCertificateFile /etc/pki/tls/certs/ca.crt # путь к файлу ключа (Certificate Key File)
SSLCertificateKeyFile /etc/pki/tls/private/ca.key # путь к файлу приватных ключей

Сохраняемся и ребутнул Apache:

# /etc/init.d/httpd restart

У вас будет другой адрес, адрес(ServerName) который Вы прописывали в конфиге апача. После того как перейдете по своему адресу вам будет показано сообщение чтобы Вы подтвердили данный сертификат.

Если вы используете виртуальные хосты, то необходимо прописать сертификаты в них:

<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
# Установка сертификата SSL в CentOS
<Directory /var/www/vhosts/test.com/httpsdocs>
AllowOverride All
</Directory>
DocumentRoot /var/www/vhosts/test.com/httpsdocs
ServerName test.com
</VirtualHost>

После чего нужно ребутнуть апачик:

# /etc/init.d/httpd restart
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# /sbin/service iptables save
# iptables -L -v

Установка сертификата SSL в CentOS выполнена. Коротко и понятно.

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04 Некоторые службы и приложения в Linux могут использовать в своей работе сетевые соединения, защищаемые с помощью SSL/TLS. Иногда требуется, чтобы цифровой сертификат, используемый для защиты соединений и предоставляемый каким-то удалённым сервером из локальной сети, принимался локальной Linux-системой как доверенный. Для этого в Linux-систему может потребоваться добавить корневой сертификат Центра сертификации (ЦС), которым были выданы сертификаты, используемые для защиты соединений. Типичный пример, когда локальная Linux-система для механизмов аутентификации и авторизации подключается с помощью ldap-клиента (например OpenLDAP) к контроллеру домена Active Directory (AD) и контроллер домена предоставляет ldap-клиенту для защиты соединения сертификат, выданным локальным корпоративным ЦС.

Здесь мы рассмотрим простой пример того, как в Linux-систему добавить корневые сертификаты локального корпоративного ЦС.

О том, как «выуживать» корневые сертификаты ЦС, которыми подписаны сертификаты контроллеров домена AD, я приводил пример ранее. Если под руками есть доменная Windows-машина, то можно выгрузить корневой сертификат из оснастки управления сертификатами из раздела корневых сертификатов доверенных ЦС. Если корневой сертификат не один, а несколько (цепочка), то каждый корневой сертификат цепочки выгрузим в файл в кодировке Base-64, сразу присвоив им расширение PEM вместо CER

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04

В результате такой выгрузки в нашем примере получится пара файлов AD-RootCA.pem (корневой сертификат ЦС верхнего уровня) и AD-SubCA.pem (корневой сертификат подчинённого ЦС). Скопируем полученные pem-файлы на наш Linux-сервер, например с помощью утилиты pscp, во временный каталог.

С:\Tools\PuTTy>pscp.exe С:\Temp\AD-*.pem linux-user@LINUX-SERVER:/tmp

Перейдём на консоль Linux-сервера и переместим файлы коневых сертификатов из временного каталога в каталог, который мы создадим специально для хранения наших корневых сертификатов и подправим на эти сертификаты права (если требуется)

# mkdir /etc/ssl/certs-corp-ca
# mv /tmp/AD-*.pem /etc/ssl/certs-corp-ca
# chown root:root /etc/ssl/certs-corp-ca/AD-*.pem
# ls -la /etc/ssl/certs-corp-ca

Теперь обработаем содержимое каталога с нашими сертификатами утилитой OpenSSLc_rehash:

# c_rehash /etc/ssl/certs-corp-ca

Doing /etc/ssl/certs-corp-ca AD-RootCA.pem => 36865f67.0 AD-RootCA.pem => bb8428b0.0 AD-SubCA.pem => e740e31e.0 AD-SubCA.pem => 536fc63e.0

В результате выполнения этой команды в этом же каталоге будут созданы специальные хеш-ссылки на файлы сертификатов.

# ls -la /etc/ssl/certs-corp-ca

Помните про то, что если в дальнейшем в данный каталог потребуется снова добавить дополнительный сертификат, то команду c_rehash нужно будет выполнить для каталога заново, чтобы сгенерировались хеш-ссылки для добавленных сертификатов. И напротив, если из каталога будут удаляться какие-то сертификаты, то нужно будет выполнить команду, которая вычистит все хеш-ссылки на уже несуществующие файлы сертификатов:

# find -L /etc/ssl/certs-corp-ca -type l -exec rm {} +

Итак, каталог с сертификатами подготовлен, теперь можно его указывать в качестве источника доверенных корневых сертификатов для разных служб и приложений в нашей Linux-системе.

В качестве примера рассмотрим клиента OpenLDAP, для которого можно указать созданный нами каталог в конфигурационном файле ldap.conf (/etc/ldap/ldap.conf) в дополнительной опции TLS_CACERTDIR, таким образом, чтобы эта опция шла после имеющейся по умолчанию опции TLS_CACERT (подробнее об этих опциях можно найти в man ldap.conf):

ldap.conf
...
# TLS certificates (needed for GnuTLS)
TLS_CACERT      etcsslcertsca-certificates.crt
 
# Corp CA root certificates storage
TLS_CACERTDIR   etcsslcerts-corp-ca

Примечание.

В Debian GNU/Linux параметр TLS_CACERTDIR может игнорироваться, о чём сказано в man ldap.conf.

В таком случае используйте для хранения доверенных корневых сертификатов отдельный файл (бандл, в который собраны все доверенные корневые сертификаты) и указывайте его расположение через параметр TLS_CACERT.

Собрать все нужные доверенные корневые сертификаты Центров сертификации в бандл можно простой склейкой содерживого PAM-файлов в колировке Base-64:

# mkdir /etc/ssl/certs-corp-ca-chain
# cd /etc/ssl/certs-corp-ca
# cat ./AD-RootCA.pem  ./AD-SubCA.pem > /etc/ssl/certs-corp-ca-chain/AD-Chain.pem
# cat /etc/ssl/certs-corp-ca-chain/AD-Chain.pem

Соответственно, применительно к ранее упомянутому клиенту OpenLDAP в Debian GNU/Linux настройка конфигурации будет такой:

ldap.conf
...
# TLS certificates (needed for GnuTLS)
TLS_CACERT      etcsslcerts-corp-ca-chainAD-Chain.pem
 
# Corp CA root certificates storage
#TLS_CACERTDIR   /etc/ssl/certs-corp-ca

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04 Автор первичной редакции:
Алексей Максимов
Время публикации: 25.03.2017 17:36

Оглавление

1. OpenSSL: инструкция по использованию и аудит безопасности

2. Что такое OpenSSL и для чего используется

3. Как работают SSL сертификаты

4. Как генерировать сертификаты в OpenSSL

5. Какую команду использовать, genpkey или genrsa

6. Как пользоваться OpenSSL (команды OpenSSL)

7. Как создать сертификаты SSL (TLS) для сайтов

8. Рецепты и советы по генерации SSL сертификатов

8.1 Создание запроса на подпись (CSR) из существующих сертификатов

8.2 Автоматическая генерация CSR

8.3 Создание сертификатов, действительных для нескольких имён хостов

8.5 Как получить бесплатный валидный сертификат для сайта

9. Просмотр содержимого ключей и сертификатов

10. Форматы ключей и сертификатов

11. Конвертация ключей и сертификатов

11.1 PEM и DER преобразование

11.2 Конвертация PKCS#12 (PFX)

12. Где хранятся корневые сертификаты Центров Сертификации (CA) в операционной системе

12.1 Корневые сертификаты Центров Сертификации (CA) в Linux

12.1.1 Общесистемные корневые CA сертификаты

12.1.2 Mozilla Network Security Services (NSS)

12.1.3 Google Chrome / Chromium

12.2 Корневые сертификаты Центров Сертификации (CA) в Windows

12.2.1 Общесистемные корневые CA сертификаты

12.2.2 Google Chrome

13. Как добавить корневой сертификат в доверенные

13.1 Как добавить корневой сертификат в доверенные в Linux

13.1.1 Как добавить корневой сертификат в доверенные в Linux на уровне системы

13.1.2 Как добавить корневой сертификат в доверенные в Linux в веб браузеры

13.2 Как добавить корневой сертификат в доверенные в Windows

13.2.1 Как добавить корневой сертификат в доверенные в Windows на уровне системы

13.2.2 Как добавить корневой сертификат в доверенные в Windows в веб браузеры

14. Цепи сертификатов

15. Верификация (проверка) сертификатов

17. Как создать Корневой Центр Сертификации (Root CA)

18. Шифрование файлов в OpenSSL

18.1 Симметричное шифрование файлов в OpenSSL

18.2 Как зашифровать строки в OpenSSL (симметричное шифрование)

18.3 Асимметричное шифрование файлов в OpenSSL

19. Пининг сертификатов (pinning)

20. Словарь основных терминов OpenSSL

21. Программы для проверки настроек SSL и сбора информации


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *