Настройка SSL-сертификата для среды Docker-Compose с помощью файла .pfx

    5 минут

Я не слышал о файлах .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.

Оставьте комментарий