Задача: Нужно внутренней системе в доменной структуре на базе 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
Шаг №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
и
нажимаю ОК
, после в списке Certificate Templates
появится новосозданный шаблон с моим именем WebServerUbuntu.
см. скриншот ниже для наглядного понимания.
Шаг №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
и нажимаю 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
и нажимаю 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
т.к. запрос подгружен, сейчас самый важный этап — это одобрить его:
через правый клик мышью в меню "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
появляется сертификат с приватным ключом (у него иконка с ключиком)
На заметку: Но если удалить из 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: отмечаю галочкой
и нажимаю Next
, защищаю парольной фразой приватный ключ
Password: отмечаю галочкой и задаю пароль, к примеру Aa1234567aA
Confirm password: Aa1234567aA
и нажимаю Next
, указываю куда сохранить
File Name: Browse, C:\soft\srv-web.pfx
и нажимаюNext
и нажимаю Finish.
Шаг №10:
Передаю полученный 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
задействуется сертификат выше:
также попробовал с srv-mail01-cas
через бразуер IE
выполнить запрос на URL
адрес, и он успешно отработал.
А вот при обращении через Google Chrome
пишет:
NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM
Что по итогу, я разобрал как можно для Ubuntu систем создать сертификат из Центра сертификации, который работает в домене на базе Windows, как произвести импорт в Web-сервис nginx, что мне и требовалось.
На этом пока данная заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.