Задача: Нужно внутренней системе в доменной структуре на базе Ubuntu 22.04 Server для Webсервиса (nginx или Apache) каким-либо образом выпустить сертификат из Центра сертификации Windows в домене дабы работа через браузер строилась не по ссылки вида http, а по ссылке вида https. Вот такую задачу попросил проработать наш программист пишущий различные автоматизации для связки магазина и 1С 7.7.

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

Hostname: srv-dc01.polygon.local

  • OS: Windows Server 2012 R2 Std
  • Roles: AD,DHCP,DNS,CA
  • IP: 10.90.90.3

Hostname: srv-gw.polygon.local

  • OS: Mikrotik v7.1.3 on CHR (x86-64)
  • Roles: Gateway
  • IP: 10.90.90.2

Hostname: srv-web.polygon.local

  • OS: Ubuntu 22.04 Server
  • Roles: Web-сервис
  • IP: 10.90.90.11

Шаг №1: На системе srv-web(OS: Ubuntu 22.04 Server) прописываем содержимое в файле hosts, текущий IP адрес система получила по DHCP от srv-dc01, это: 10.90.90.11

ekzorchik@srv-web:~$ sudo nano /etc/hosts
10.90.90.11     srv-web.polygon.local  srv-web

Шаг №2: На системе srv-dc01 (OS: Windows Server 2012 R2 Std), подключаюсь по RDP, авторизуюсь как Domain Admin, Login: ekzorchik и в оснастке DHCP для системы srv-web настраиваю что за этой системой настроена резервация IP адреса, т.е. 10.90.90.11

Для системы srv-web.polygon.local настраиваем резервацию получения IP адреса.

Шаг №3: На системе srv-dc01 (OS: Windows Server 2012 R2 Std), подключаюсь по RDP, авторизуюсь как Domain Admin, Login: ekzorchik и в оснастке DNS: Forward Lookup Zones - polygon.local создаю Record A Type запись:

  • Hostname: srv-web
  • Fully qualified domain name (FQDN): srv-web.polygon.local
  • IP address: 10.90.90.11
  • Create associated pointer (PTR) record: отмечаю галочкой

Шаг №4: После проверяю с домен контроллера что вижу через ICMP запросы узел srv-home:

Win + X - Command Prompt

C:\Users\ekzorchik>ping srv-web
Pinging srv-web.polygon.local [10.90.90.11] with 32 bytes of data:
Reply from 10.90.90.11: bytes=32 time<1ms TTL=64
Reply from 10.90.90.11: bytes=32 time<1ms TTL=64
Ping statistics for 10.90.90.11:
Packets: Sent = 2, Received = 2, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
Control-C
^C
C:\Users\ekzorchik>

Отлично, узел откликается.

Шаг №5: На домен контроллере srv-dc01 создадим шаблон который будем использовать для выпуска сертификатов, ориентированных на Ubuntu системы для Webсервиса, либо nginx, либо apache2:

logon in srv-dc01 (User: ekzorchik Group: Domain Admins, Enterprise Admins, Schema Admins)

Win + X -> Control Panel - View by: Small icons - Administrative Tools - Certification Authority - Certification Authority (Local) - srv-dc01-ca — через правый клик мышью на Certificate Templates выбираю Manage, затем на основе уже имеющего место быть шаблона "Web Server" через правый клик мышью на нем выбираю "Duplicate Template" открывается Properties of New Template

вкладка "General"

  • Template display name: WebServerUbuntu
  • Validity period: 2 years
  • Renewal period: 1 years

вкладка "Request Handling"

  • Purpose: Signature and encryption
  • Allow private key to be exported: отмечаю галочкой

вкладка "Extensions"

  • Extensions included in this template: Application Policies (Server Authentication), через Edit, Add, выбираю еще Client Authentication и нажимаю OK

вкладка "Security"

  • Login: ekzorchik@polygon.local (Read, Write, Enroll,Autoenroll)
  • Login: SRV-DC01$ (Read,Write,Enroll,Autoenroll)

вкладка "Issuance Requirements"

  • CA certificate manager approval: отмечаю галочкой

вкладка "Subject Name"

  • Supply in the request: отмечаю галочкой

и нажимаю Apply, OK.

после закрываем оснастку управления шаблонами, т.е. Certificate Templates Console, переходим в оснастку Certification Authority (Local) - srv-dc01-ca — и через правый клик мышью на Certificate Templates выбираю New - Certificate Template to Issue, нахожу свой созданный выше шаблон с именем WebServerUbuntu и

нахожу свой созданный выше шаблон с именем WebServerUbuntu и

нажимаю ОК, после в списке Certificate Templates появится новосозданный шаблон с моим именем WebServerUbuntu.

см. скриншот ниже для наглядного понимания.

Добавляю созданный шаблон WebServerUbuntu в меню Certificate Template

Шаг №6: Формируем запрос к Центру сертификации для Ubuntu Webсервера на srv-dc01 запустив оснастку mmc:

Win + X - Command Prompt (Admin), Yes

C:\Windows\system32> mmc.exe

File - Add/Remove Snap-in… - Available snap-ins: выбираю Certificates и нажимаю Add

  • This snap-in will always manage certificates for: выбираю Computer account

и нажимаю Next, Finish, OK.

Затем делаю запрос:

Console Root - Certificates (Local Computer) - Personal — через правый клик на Certificates выбираю All Tasks - Advanced Operations - Create Custom Request…, нажимаю Next, Next, выбираю созданный выше шаблон

  • Template: WebServerUbuntu
  • Request format: PKCS #10

Формирую запрос на основа созданного шаблона WebServerUbuntu

и нажимаю Next

нажимаю стрелочку ВОЗЛЕ Details вниз дабы перейти в Properties

Открываю свойства запроса на основе шаблона.

и на вкладке "Subject"

Subject name:

  • Type: Common Name
  • Value: srv-web.polygon.local

и нажимаю Add

Alternative name:

  • Type: DNS
  • Value: srv-web.polygon.local

и нажимаю Add, делаю еще Value (Свойства) для srv-web

  • Type: IP address (v4)
  • Value: 10.90.90.11

см скриншот ниже что у Вас должно получиться

Привожу свойства запроса к виду представленному на скриншоте ниже.

и нажимаю Add

вкладка "General"

  • Friendly name: srv-web
  • Description: srv-web

и нажимаю Apply, OK, Next

указываю путь где сохранить запрос

  • File Name: нажимаю Browse, C:\Soft\srv-web.req и нажимаю Save
  • File format: Base 64

Сохраняю запрос в C:\Soft\srv-web.req

и нажимаю Finish.

Шаг №7: Принимаем запрос srv-web.req в центре сертификации и одобряем его:

logon in srv-dc01 (User: ekzorchik Group: Domain Admins, Enterprise Admins, Schema Admins)

Win + X -> Control Panel - View by: Small icons - Administrative Tools - Certification Authority - Certification Authority (Local) через правый клик на srv-dc01-ca выбираю All Tasks - Submit new request… — указываю путь до файла и сам файл C:\soft\srv-web.req и нажимаю Open, после чего в меню "Pending Requests" отобразится запрос srv-web.req

Принимаю запрос srv-web.req в Центре сертификации.

т.к. запрос подгружен, сейчас самый важный этап — это одобрить его:

через правый клик мышью в меню "Penging Requests" на подгруженном запросе с Request ID: 10 выбираю All Tasks - Issue

Одобряю запрос на выпуск сертификата.

после чего в меню "Issued Certificates" появится сертификат.

Шаг №8: Выданный сертификат для узла srv-web.polygon.local сохраняю, как CERфайл:

logon in srv-dc01 (User: ekzorchik Group: Domain Admins, Enterprise Admins, Schema Admins)

Win + X -> Control Panel - View by: Small icons - Administrative Tools - Certification Authority - Certification Authority (Local) - Issued Certificates — через правый клик на Request ID: 10 выбираю Open — вкладка Details - Copy to File… - Next,

  • Select the format you want to use: DER encoded binary X.509 (.CER)

и нажимаю Next

  • File name: c:\soft\srv-web.cer

после делаю import данного сертификата:

logon in srv-dc01 (User: ekzorchik Group: Domain Admins, Enterprise Admins, Schema Admins)

Win + X -> Control Panel - View by: Small icons - Administrative Tools - Certification Authority - Certification Authority (Local) - Personal — через правый клик на Certificates выбираю All Tasks - Import

  • Store Location: Local Machine

нажимаю Next

  • File name: Browse, C:\Soft\srv-web.cert

и нажимаю Next

  • Place all certificates in the following store: выбираю
  • Certificate store: Personal

и нажимаю Next, Finish, если все сделано за раз, то в Personal появляется сертификат с приватным ключом (у него иконка с ключиком)

Сертификат для узла srv-web.polygon.local импортирован в Personal и содержит публичный и приватный ключи.

На заметку: Но если удалить из Personal - Certificates — сертификат srv-web.polygon.local, а потом заново сделать Import то сертификат будет без приватной части, только публичная и придется заново формировать запрос, одобрять его, сохранять в cer файл и импортировать. Это очень важный момент.

Шаг №9: Теперь делаю экспорт из сертификата srv-web.polygon.local приватный ключ для получения PFX файла:

Win + X - Command Prompt (Admin), Yes

C:\Windows\system32> mmc.exe

File - Add/Remove Snap-in… - Available snap-ins: выбираю Certificates и нажимаю Add

  • This snap-in will always manage certificates for: выбираю Computer account

и нажимаю Next, Finish, OK.

Console Root - Certificates (Local Computer) - Certificate Enrollment Request - Certificates — вижу свой сертификат выданный для srv-web.polygon.local (с иконкой ключика) через правый клик мышью по нему выбираю All Tasks - Export - Next

  • Do you want to export the private key with the certificate? выбираю Yes, export the private key

и нажимаю Next

  • Personal Information Exchange - PKCS #12 (.PFX): выбираю
  • Include all certificates in the certification path if possible: отмечаю галочкой
  • Export all extended properties: отмечаю галочкой

Экспортирую приватный ключ pfx файл для сертификата srv-web.polygon.local

и нажимаю Next, защищаю парольной фразой приватный ключ

  • Password: отмечаю галочкой и задаю пароль, к примеру Aa1234567aA
  • Confirm password: Aa1234567aA

Защищаю парольной фразой приватный ключ

и нажимаю Next, указываю куда сохранить

  • File Name: Browse, C:\soft\srv-web.pfx и нажимаю Next

Указываю куда сохранить приватный ключ, файл srv-web.pfx

и нажимаю Finish.

Шаг №10: Передаю полученный srv-web.pfx файл на srv-web.polygon.local через приложение WinSCP

Передаю полученный srv-web.pfx файл на srv-web.polygon.local через приложение WinSCP

Шаг №11: На системе srv-web.polygon.local произвожу разбор pfx файла на файлы: key & pem

ekzorchik@srv-web:~$ ls -l srv-web.pfx
-rw-r--r-- 1 ekzorchik ekzorchik 3162 May  7 13:56 srv-web.pfx
ekzorchik@srv-web:~$ file srv-web.pfx
srv-web.pfx: data
ekzorchik@srv-web:~$
ekzorchik@srv-web:~$ openssl pkcs12 -in srv-web.pfx -out srv-web.pem -clcerts -nodes -legacy
Enter Import Password: ввожу Aa1234567aA
ekzorchik@srv-web:~$ openssl pkcs12 -in srv-web.pfx -out srv-web.key -nocerts -nodes -legacy
Enter Import Password: ввожу Aa1234567aA
ekzorchik@srv-web:~$

В результате получаю следующие файлы:

  • srv-web.pem - файл приватного ключа RSA в PEM-кодировке (без парольной фразы);
  • srv-web.key - файл сертификата формата X.509 в PEM-кодировке.

Шаг №12: На систему srv-web.polygon.local устанавливаю Webсервис nginx и создаю конфигурацию доступа через URL адрес вида https при обращении к системе:

ekzorchik@srv-web:~$ sudo apt-get install -y nginx
ekzorchik@srv-web:~$ sudo cp -f srv-web.{pem,key} /etc/nginx/ssl/
ekzorchik@srv-web:~$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.conf
ekzorchik@srv-web:~$ sudo rm /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
ekzorchik@srv-web:~$ sudo nano /etc/nginx/sites-available/default.conf
server {
server_name srv-web.polygon.local;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/srv-web.pem;
ssl_certificate_key /etc/nginx/ssl/srv-web.key;
}
ekzorchik@srv-web:~$ sudo ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf
ekzorchik@srv-web:~$ sudo nginx -t
nginx: [emerg] SSL_CTX_use_certificate("/etc/nginx/ssl/srv-web.pem") failed (SSL: error:0A00018E:SSL routines::ca md too weak)
nginx: configuration file /etc/nginx/nginx.conf test failed
ekzorchik@srv-web:~$
ekzorchik@srv-web:~$ sudo nano /etc/ssl/openssl.cnf
#изменяю значение 2 на 0
CipherString = DEFAULT:@SECLEVEL=0
ekzorchik@srv-web:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-web:~$ sudo systemctl restart nginx
ekzorchik@srv-web:~$
ekzorchik@srv-web:~$ sudo netstat -tulpn | grep :443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      2261/nginx: master
ekzorchik@srv-web:~$

Шаг №13: После проверяю что обратившись с srv-dc01 на URL: https://srv-web.polygon.local задействуется сертификат выше:

Обращение из домена к узлу https://srv-web.polygon.local посредством браузера IE задействует выданный сертификат.

также попробовал с srv-mail01-cas через бразуер IE выполнить запрос на URL адрес, и он успешно отработал.

А вот при обращении через Google Chrome пишет:

NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM

Что по итогу, я разобрал как можно для Ubuntu систем создать сертификат из Центра сертификации, который работает в домене на базе Windows, как произвести импорт в Web-сервис nginx, что мне и требовалось.

На этом пока данная заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.