Я не слышал о файлах .pfx, пока не пришлось использовать их для настройки SSL-сертификатов для среды Docker.
Оказалось, что:
Файлы .pfx — это защищенные паролем файлы, содержащие как публичные, так и приватные пары сертификатов.
Таким образом, вместо получения файлов .crt, .pem или .key от вашего поставщика сертификатов SSL вы можете получить файл .pfx.
В этом руководстве я хотел бы показать вам процесс извлечения сертификата и ключей из файла .pfx и их использования в вашей среде Docker.
Предпосылки
- Файл .pfx
- Приложение Docker-compose с сервисом Nginx для обработки всех входящих запросов
Этот урок состоит из двух основных частей:
- Первая часть посвящена извлечению сертификата и закрытого ключа из файла .pfx.
- а второй связан с настройкой среды docker-compose для использования извлеченного сертификата и ключа.
Вы готовы? Давайте начнем.
Извлечение сертификата и закрытого ключа из файла .pfx
Это двухэтапный процесс. Сначала нам нужно будет извлечь … закрытый ключ. На самом деле, это не совсем закрытый ключ, и я расскажу вам почему через несколько секунд.
Затем мы извлечем настоящий закрытый ключ, прежде чем извлекать сам сертификат, чтобы использовать его для настройки нашего SSL-сертификата.
Так что держись, чувак.
Извлечение зашифрованной версии ключа сертификата
Выполните следующую команду, чтобы получить зашифрованную версию закрытого ключа.
openssl pkcs12 -in yourfile.pfx -nocerts -out [encrypted_ssl_certificate_secret.key]
Вам будет предложено ввести пароль, который использовался для создания файла .pfx, который у вас есть, это первый шаг. Затем вам будет предложено ввести второй пароль: этот последний пароль предназначен для защиты настоящего ключа, который содержится в файле .pfx.
Извлечение фактического ключ сертификата
Теперь у нас есть все, что нужно для извлечения настоящего закрытого ключа. Запускаем:
openssl rsa -in encrypted_ssl_certificate_secret.key -out ssl_certificate_secret.key
Введите второй пароль, который вы установили для защиты файла закрытого ключа на предыдущем шаге.
Вы можете увидеть ssl_certificate_secret.key в текущем каталоге.
Извлечение сертификата
Мы закончили с извлечением закрытого ключа. Нам нужно сделать то же самое для сертификата. Выполните следующую команду:
openssl pkcs12 -in yourfile.pfx -clcerts -nokeys -out my_certificate.crt
Да, мы извлекли наш SSL-сертификат, но это еще не все. Нам нужно добавить в my_certificate.crt , Certificate Authority (CA).
Чтобы сгенерировать сертификат CA, давайте выполним:
openssl pkcs12 -in yourfile.pfx -cacerts -out ca_certificate.crt
Теперь мы сложим эти сертификаты, чтобы получить нужный нам итоговый сертификат:
cat domain.tld.crt my_certificate.crt > ssl_certificate.crt
Вуаля!!!
Но погоди, погоди…, чувак. Мы в шаге от финиша.
Настройка Nginx в вашей среде Docker для использования сертификата
Ну, мы только что закончили первую основную часть всего нашего ремесла. Давайте посмотрим, как мы можем использовать файлы ssl_certificate.crt
и ssl_certificate_secret.crt
.
Настройка Nginx
Если вы когда-либо использовали контейнер Nginx в своей настройке Docker, вы знаете, что мы часто загружаем его конфигурацию из локального хранилища, и это именно то, что мы собираемся сделать.
Итак, ваш текущий файл конфигурации Nginx должен выглядеть так:
server {
listen 80;
root /var/www/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php index.html;
charset utf-8;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location / {
...
}
...
}
Добавьте в него файлы сертификатов. В итоге это должно выглядеть так:
server {
listen 443 ssl;
root /var/www/public;
ssl_certificate /etc/ssl/private/ssl_certificate.crt;
ssl_certificate_key /etc/ssl/private/ssl_certificate_secret.key;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php index.html;
charset utf-8;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location / {
...
}
...
}
Но эти изменения не будут работать сами по себе. Это подводит нас к следующему шагу.
Обновите файл docker-compose
Ваш файл Docker-Compose на данный момент должен выглядеть следующим образом:
version: '3.7'
services:
proxy:
image: nginx:<tag>
volumes:
- ...
- ./nginx.conf:/etc/nginx/nginx.conf:ro
Чтобы сделать сертификаты доступными внутри контейнера, нам следует отредактировать раздел тома нашего сервиса. Ваш файл должен выглядеть следующим образом в конце процесса:
version: '3.7'
services:
proxy:
image: nginx:<tag>
volumes:
- ...
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs/ssl_certificate.crt: /etc/ssl/private/ssl_certificate.crt:ro
- ./certs/ssl_certificate_secret.key: /etc/ssl/private/ssl_certificate_secret.key:ro
Да, да, я вижу, как кто-то качает головой 😲: Это неэффективно. Да, я полностью согласен. Мы сделали это для упрощения концепции в первую очередь.
Вот как это правильно сделать:
version: '3.7'
services:
proxy:
image: nginx:<tag>
volumes:
- ...
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/ssl/private:ro
🎉 Конечно, здорово, просто и приятно, не так ли? Но не забудьте скопировать ssl_certificate.crt
и в папку ./certs. ssl_certificate_secret.key
Заключение
Чтобы защитить ваше взаимодействие с API, сторонний поставщик API может потребовать, чтобы вы включили SSL-сертификацию для ваших контейнеров Docker.
Существуют различные форматы сертификатов, которые они могут вам предоставить. В этом уроке мы сосредоточились на одном из менее известных, но очень полезных: файлах .pfx.
Мы увидели, как действовать дальше: от извлечения сертификата и его секрета до его использования в нашей среде docker-compose.
Спасибо за чтение. Мне бы хотелось узнать ваш опыт настройки SSL-сертификата для вашей среды Docker.