🔐 Создание самоподписанных сертификатов OpenSSL с помощью Ansible – Information Security Squad
🔐  Создание самоподписанных сертификатов OpenSSL с помощью Ansible

OpenSSL – это надежный, коммерческий и полнофункциональный набор инструментов для протоколов Transport Layer Security (TLS) и Secure Sockets Layer (SSL).

Это библиотека, которая предоставляет приложениям криптографические протоколы.

Процесс создания самоподписанных сертификатов на компьютерах с Linux может быть сложной задачей, особенно для новых пользователей Linux.

Учитывая, что это может быть частым требованием, необходимо автоматизировать создание сертификатов.

В сегодняшнем руководстве я покажу процесс создания самоподписанных сертификатов SSL с помощью Ansible на компьютере с Linux.

При работе с OpenSSL открытые ключи являются производными от соответствующего закрытого ключа.

Первым шагом всегда будет создание закрытого ключа с использованием определенного алгоритма.

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

Поскольку мы говорим про случаи использования Dev и Lab, мы создаем самоподписанный сертификат.

Создание сертификата OpenSSL с помощью Ansible

В примерах, показанных в этой статье, закрытый ключ называется hostname_privkey.pem, файл сертификата – hostname_fullchain.pem, а файл CSR – hostname.csr, где hostname – это фактический DNS, сертификат которого сгенерирован.

Прежде чем начнем

--- Установка Ansible на Fedora ---
$ sudo dnf install ansible

--- Установка Ansible на CentOS 8 / CentOS 7 ---
$ sudo yum -y install epel-release
$ sudo yum install ansible

--- Установка Ansible на Ubuntu ---
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible

--- Установка Ansible на Debian ---
$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
$ sudo apt update
$ sudo apt install ansible

--- Установка Ansible на Arch Linux ---
$ pacman -S ansible

Подтвердите установку Ansible, проверив версию.

$ ansible --version
ansible --version
ansible 2.9.11
  config file = None
  configured module search path = ['/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.9.11/libexec/lib/python3.8/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.5 (default, Jul 21 2020, 10:48:26) [Clang 11.0.3 (clang-1103.0.32.62)]

Установите зависимости

pyOpenSSL требуется для генерации ключей и сертификатов с помощью Ansible.

--- Установка с pip2 ---
$ sudo pip install pyOpenSSL

--- Установка с pip3 ---
$ sudo pip3 install pyOpenSSL

Написание Ansible плейбука для создания самоподписанного сертификата

Установив зависимости, мы должны приступить к созданию сертификата с помощью Ansible.

Мы сделаем единый playbook с тасками для создания закрытого ключа, CSR и сертификата.

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

Создайте папки проекта:

$ mkdir -p ~/projects/ansible/{certificates,files,templates}
$ cd ~/projects/
$ tree
.
`-- ansible
    |-- certificates
    |-- files
    `-- templates

4 directories, 0 files

Создайте шаблон плейбука

$ vim ~/projects/ansible/openssl_certificates.yml
Добавьте стандартные разделы.
---
- hosts: localhost
  vars:

Генерация закрытого ключа OpenSSL с помощью Ansible

Добавьте таск на генерацию закрытого ключа.

Мы используем модуль openssl_privatekey для генерации закрытых ключей OpenSSL.

Этот модуль может генерировать закрытые ключи RSA, DSA, ECC или EdDSA в формате PEM.

Такие параметры, как passphrase и keysize, не следует изменять, если вы не хотите, чтобы ключи восстанавливались при повторном запуске.

Вы можете посмотреть документацию по этому модулю, используя команду:
$ ansible-doc openssl_privatekey
Я буду использовать следующие варианты:
  • Key size: 4096 bits
  • Key type: RSA
  • backup: yes

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

cd ~/projects/ansible/
vim openssl_certificates.yml
Так выглядит мой таск генерации закрытого ключа.
---
- hosts: localhost
  vars:
    - server_hostname: itsecforu.ru
    - key_size: 4096
    - passphrase: # Set if you want passphrase
    - key_type: DSA # Others include DSA, ECC, Ed25519, Ed448, X25519, X448
  tasks:
    - name: Generate an OpenSSL private key
      openssl_privatekey:
        path: "./certificates/{{ server_hostname }}_privkey.pem"
        size: "{{ key_size }}"
        type: "{{ key_type }}"
        backup: yes
        
Запуск плейбука для создания закрытого ключа.
$ ansible-playbook openssl_certificates.yml
PLAY [localhost] *************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************
ok: [localhost]

TASK [Generate an OpenSSL private key] ***************************************************************************************************************************
changed: [localhost]

PLAY RECAP *******************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Подтвердите генерацию ключа.

$ ls certificates/
itsecforu.ru_privkey.pem

Генерация OpenSSL CSR с помощью Ansible

Следующий таск, который мы добавим, – создание запроса на подпись сертификата OpenSSL (CSR).

Его можно использовать для запроса подписи сертификата CA.

Для этой операции используется модуль openssl_csr.

Этот модуль Ansible поддерживает расширения subjectAltName, keyUsage, extendedKeyUsage, basicConstraints и OCSP Must Staple.

Вот варианты, которые я буду использовать:

  • common_name: имя
  • privatekey_path: Путь к закрытому ключу, который будет использоваться при подписании запроса на подпись сертификата.uest.
  • path: Имя файла, в который будет записан сгенерированный запрос на подпись сертификата OpenSSL.
  • country_nameПоле countryName в теме запроса на подпись сертификата.
  • email_address: Поле emailAddress в теме запроса на подпись сертификата.
  • organization_nameПоле organizationName в теме запроса на подпись сертификата.
  • organizational_unit_name: Поле organizationUnitName темы запроса на подпись сертификата.
Вот так выглядит обновленный файл плейбука:
$ cat openssl_certificates.yml
---
- hosts: localhost
  vars:
    - server_hostname: itsecforu.ru
    - key_size: 4096
    - passphrase: # Set if you want passphrase
    - key_type: RSA # Others include DSA, ECC, Ed25519, Ed448, X25519, X448
    - country_name: KE
    - email_address: admin@itsecforu.ru
    - organization_name: itsecforu
  tasks:
    - name: Generate an OpenSSL private key
      openssl_privatekey:
        path: "./certificates/{{ server_hostname }}_privkey.pem"
        size: "{{ key_size }}"
        type: "{{ key_type }}"
        backup: yes
    - name: Generate an OpenSSL Certificate Signing Request with Subject information
      openssl_csr:
        path: "./certificates/{{ server_hostname }}.csr"
        privatekey_path: "./certificates/{{ server_hostname }}_privkey.pem"
        country_name: "{{ country_name }}"
        organization_name: "{{ organization_name }}"
        email_address: "{{ email_address }}"
        common_name: "{{ server_hostname }}"
Перед выполнением проверьте синтаксис:
$ ansible-playbook --syntax-check openssl_certificates.yml
playbook: openssl_certificates.yml

Создание сертификата OpenSSL с помощью Ansible

Модуль openssl_certificate Ansible используется для генерации сертификатов OpenSSL.

Этот модуль реализует понятие поставщика (например, selfsigned, ownca, acme, assertonly, entrust) для вашего сертификата.

Мы будем генерировать самоподписанный сертификат, но вы можете использовать других поставщиков.

Обновленный плейбук:

---
- hosts: localhost
  vars:
    - server_hostname: itsecforu.ru
    - key_size: 4096
    - passphrase: # Set if you want passphrase
    - key_type: RSA # Others include DSA, ECC, Ed25519, Ed448, X25519, X448
    - country_name: KE
    - email_address: admin@itsecforu.ru
    - organization_name: itsecforu
  tasks:
    - name: Generate an OpenSSL private key
      openssl_privatekey:
        path: "./certificates/{{ server_hostname }}_privkey.pem"
        size: "{{ key_size }}"
        type: "{{ key_type }}"
        backup: yes
    - name: Generate an OpenSSL Certificate Signing Request with Subject information
      openssl_csr:
        path: "./certificates/{{ server_hostname }}.csr"
        privatekey_path: "./certificates/{{ server_hostname }}_privkey.pem"
        country_name: "{{ country_name }}"
        organization_name: "{{ organization_name }}"
        email_address: "{{ email_address }}"
        common_name: "{{ server_hostname }}"
    - name: Generate a Self Signed OpenSSL certificate
      openssl_certificate:
        path: "./certificates/{{ server_hostname }}_cert.pem"
        privatekey_path: "./certificates/{{ server_hostname }}_privkey.pem"
        csr_path: "./certificates/{{ server_hostname }}.csr"
        provider: selfsigned

Наконец, мы проверим синтаксис и запустим playbook для создания сертификата.

$ ansible-playbook --syntax-check openssl_certificates.yml
playbook: openssl_certificates.yml

Запустим его:

$ ansible-playbook openssl_certificates.yml

Вывод по выполнению:

PLAY [localhost] *************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************
ok: [localhost]

TASK [Generate an OpenSSL private key] ***************************************************************************************************************************
changed: [localhost]

TASK [Generate an OpenSSL Certificate Signing Request with Subject information] **********************************************************************************
changed: [localhost]

TASK [Generate a Self Signed OpenSSL certificate] ****************************************************************************************************************
changed: [localhost]

PLAY RECAP *******************************************************************************************************************************************************
localhost                  : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Выведем список файлов для проверки созданных сертов:

$ tree certificates/
certificates/
|-- itsecforu.ru.csr
|-- itsecforu.ru_cert.pem
|-- itsecforu.ru_privkey.pem
`-- itsecforu.ru_privkey.pem.56610.2020-09-10@00:39:50~

0 directories, 4 files

Вы можете проверить информацию о сертификате с помощью команды openssl.

$ openssl x509 -in certificates/itsecforu.ru_cert.pem -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            49:90:1b:9a:7c:24:c1:d2:7e:b4:ba:70:66:46:cb:e9:52:63:ae:f9
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=KE, O=itsecforu, CN=itsecforu.ru/emailAddress=admin@itsecforu.ru
        Validity
            Not Before: Sep  9 21:39:52 2020 GMT
            Not After : Sep  7 21:39:52 2030 GMT
        Subject: C=KE, O=itsecforu, CN=itsecforu.ru/emailAddress=admin@itsecforu.ru
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:d8:82:6e:d9:c6:1d:7d:86:0b:96:37:5e:6c:78:
                    09:83:35:be:a0:44:73:c4:f6:cb:f3:50:a1:09:3e:
                    4a:3c:43:74:64:8c:c5:77:de:a6:bf:28:ba:53:a4:
                    c2:a5:41:5a:63:bd:f7:f4:0a:1e:21:d7:52:e9:30:
                    a0:1b:b7:c0:2f:c6:3a:3b:81:03:1e:d5:47:8b:43:
                    98:5d:cb:2e:a7:7b:90:a4:b8:54:37:e5:e4:da:85:
                    61:1d:49:da:6b:72:48:a4:af:72:d0:26:27:7d:e2:
                    1b:ec:40:0f:96:55:44:87:69:1d:30:8a:c7:51:da:
                    19:c2:cc:08:9f:73:f5:56:f8:26:ab:d3:e9:7e:87:
                    9c:05:9a:14:e7:6d:fe:88:3c:f3:6a:aa:26:e6:6c:
                    bf:82:58:19:1d:66:80:3e:69:f1:05:97:92:43:df:
                    f9:66:8f:b7:b1:b8:db:c3:3a:c6:87:ec:0a:d0:84:
                    19:cc:2c:ca:28:a6:44:0c:96:3b:45:4a:79:1e:6d:
                    04:75:b2:8d:f0:b7:dc:00:9f:21:36:22:42:ff:da:
                    ec:36:da:70:83:11:d6:67:4b:b6:26:03:6d:6c:d5:
                    7d:bb:7c:11:8a:c8:b8:d3:6d:37:5b:b8:63:48:e4:
                    3a:62:a7:ec:18:50:bf:1e:19:75:97:2f:06:de:e8:
                    5e:03:a6:67:4e:99:31:1c:6a:db:ad:82:9c:a8:ff:
                    21:f4:e9:f9:0d:92:40:ec:db:42:05:8f:af:65:0f:
                    60:1f:d8:36:1f:9a:94:30:3e:32:bb:61:fd:8f:7f:
                    ae:00:a2:73:cd:1c:2c:31:69:0f:f0:2e:c7:db:e5:
                    77:71:09:32:72:33:85:26:84:7a:6d:07:7e:ed:a6:
                    6c:ef:87:fa:3e:a4:a7:5a:b5:5a:91:b0:74:f1:3d:
                    e6:01:45:6d:ab:74:e3:be:25:28:f7:6e:68:52:e1:
                    91:41:d6:8f:4a:d9:ed:e0:35:55:51:23:1b:dd:9d:
                    4c:0b:b9:df:7e:ff:84:64:80:78:09:6a:a0:1c:f6:
                    ce:91:56:34:96:43:84:90:72:57:bd:dd:e3:24:02:
                    ad:4d:5b:81:bf:55:45:34:a9:b2:0c:91:02:34:09:
                    da:4e:0b:95:e1:90:f0:ff:b6:17:70:6f:b5:6a:5e:
                    b0:40:51:e3:a2:0a:c5:57:e9:49:db:1a:d3:bf:ca:
                    72:cd:13:5e:2e:1f:28:83:7a:82:ff:dc:07:6d:90:
                    b4:15:3d:c3:27:f9:23:7c:fc:d1:8d:56:89:40:5a:
                    cd:d6:a5:48:22:b2:84:df:6e:bd:65:df:5b:6c:a4:
                    62:36:23:a1:c7:5c:b1:18:1e:9f:2a:99:d0:2a:08:
                    5d:b1:39
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:itsecforu.ru
            X509v3 Subject Key Identifier:
                61:1D:2F:F8:CC:9F:86:65:07:C9:9A:0E:07:6C:97:A5:30:96:A5:0D
    Signature Algorithm: sha256WithRSAEncryption
         84:49:cd:dd:2d:7c:5e:02:b1:3c:96:36:a8:79:2a:b4:f4:dc:
         ae:63:84:31:86:de:bf:e5:f0:f4:30:84:f1:8f:99:31:c1:d6:
         45:37:c3:dc:ad:16:0f:13:27:ed:75:98:4e:01:88:ec:1c:e4:
         7c:63:e2:06:5f:bc:61:11:3a:22:f4:48:f7:f2:af:a9:83:81:
         0b:2e:09:19:90:3b:a5:77:eb:3a:4d:cf:96:e2:e4:74:f3:79:
         4a:88:96:1d:c8:3a:44:a6:6e:00:d3:fe:d8:f9:1a:d7:f4:14:
         b4:75:0f:a4:4a:0e:4d:6a:de:73:f0:10:e2:9c:7d:19:88:1d:
         20:a9:b2:96:65:62:12:18:e7:f3:0a:5f:8c:e6:18:82:97:24:
         f5:2f:78:8e:51:5c:b0:53:a6:aa:41:1d:ac:3d:e3:34:8c:13:
         6e:b2:4d:e0:f9:be:10:40:a3:de:ea:e7:81:4a:b8:05:15:ed:
         3f:72:52:60:a4:f5:b5:81:fa:8d:a9:d7:ec:54:0f:01:ec:06:
         d2:05:5f:c3:d4:ad:66:eb:be:3b:37:c1:55:a1:00:3c:54:4f:
         c2:0e:2b:d1:85:6c:a2:bf:6b:8a:37:e2:22:a0:74:18:12:68:
         34:1b:e1:f4:e5:b3:21:f1:a4:40:cc:15:09:e8:96:4a:d9:46:
         5b:32:7f:cb:e1:ca:17:f0:cf:af:60:e1:41:60:58:6f:1a:96:
         96:80:a8:2b:c1:91:e7:b4:a8:e5:02:ed:78:fc:8e:76:32:90:
         38:64:e3:cc:72:5d:e9:1b:6b:68:d0:47:78:5d:b1:8c:1a:ba:
         7f:96:3f:7c:67:86:f1:62:6a:64:d5:fe:7f:5e:22:c4:51:ae:
         6d:05:e5:87:f8:df:25:28:f9:fd:f2:b3:a3:8a:08:e8:c6:21:
         0d:6d:85:fc:89:10:31:8f:e1:7b:c7:77:b2:32:fc:0c:b2:13:
         6a:c3:18:a8:54:80:5c:54:49:98:19:09:d1:88:51:0d:df:29:
         f7:e3:c2:96:13:dc:fa:15:0b:8e:4c:79:9a:00:8c:8a:6f:4d:
         96:12:e3:2a:13:e4:70:d4:3e:33:70:d3:1f:81:67:a2:85:90:
         0b:99:fc:14:cb:41:f2:8b:64:b5:51:38:63:1c:e2:a3:c2:9e:
         2e:e9:8e:86:d7:75:ab:7f:e7:a6:12:b7:e5:3d:14:4a:6e:65:
         65:c2:fd:c9:7f:bf:ee:8c:61:b7:1d:f7:2a:22:00:34:38:5c:
         72:4c:74:a1:b6:bd:3e:4f:9a:01:91:3f:58:51:d6:23:36:a9:
         ae:ed:84:5d:ce:96:c5:3b:0b:06:50:81:85:be:1e:eb:66:dd:
         a4:d2:98:41:50:55:1c:d4
-----BEGIN CERTIFICATE-----
MIIFuzCCA6OgAwIBAgIUSZAbmnwkwdJ+tLpwZkbL6VJjrvkwDQYJKoZIhvcNAQEL
BQAwdTELMAkGA1UEBhMCS0UxGjAYBgNVBAoMEUNvbXB1dGluZ2ZvcmdlZWtzMR4w
HAYDVQQDDBVjb21wdXRpbmdmb3JnZWVrcy5jb20xKjAoBgkqhkiG9w0BCQEWG2Fk
bWluQGNvbXB1dGluZ2ZvcmdlZWtzLmNvbTAeFw0yMDA5MDkyMTM5NTJaFw0zMDA5
MDcyMTM5NTJaMHUxCzAJBgNVBAYTAktFMRowGAYDVQQKDBFDb21wdXRpbmdmb3Jn
ZWVrczEeMBwGA1UEAwwVY29tcHV0aW5nZm9yZ2Vla3MuY29tMSowKAYJKoZIhvcN
AQkBFhthZG1pbkBjb21wdXRpbmdmb3JnZWVrcy5jb20wggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDYgm7Zxh19hguWN15seAmDNb6gRHPE9svzUKEJPko8
Q3RkjMV33qa/KLpTpMKlQVpjvff0Ch4h11LpMKAbt8Avxjo7gQMe1UeLQ5hdyy6n
e5CkuFQ35eTahWEdSdprckikr3LQJid94hvsQA+WVUSHaR0wisdR2hnCzAifc/VW
+Car0+l+h5wFmhTnbf6IPPNqqibmbL+CWBkdZoA+afEFl5JD3/lmj7exuNvDOsaH
7ArQhBnMLMoopkQMljtFSnkebQR1so3wt9wAnyE2IkL/2uw22nCDEdZnS7YmA21s
1X27fBGKyLjTbTdbuGNI5Dpip+wYUL8eGXWXLwbe6F4DpmdOmTEcatutgpyo/yH0
6fkNkkDs20IFj69lD2Af2DYfmpQwPjK7Yf2Pf64AonPNHCwxaQ/wLsfb5XdxCTJy
M4UmhHptB37tpmzvh/o+pKdatVqRsHTxPeYBRW2rdOO+JSj3bmhS4ZFB1o9K2e3g
NVVRIxvdnUwLud9+/4RkgHgJaqAc9s6RVjSWQ4SQcle93eMkAq1NW4G/VUU0qbIM
kQI0CdpOC5XhkPD/thdwb7VqXrBAUeOiCsVX6UnbGtO/ynLNE14uHyiDeoL/3Adt
kLQVPcMn+SN8/NGNVolAWs3WpUgisoTfbr1l31tspGI2I6HHXLEYHp8qmdAqCF2x
OQIDAQABo0MwQTAgBgNVHREEGTAXghVjb21wdXRpbmdmb3JnZWVrcy5jb20wHQYD
VR0OBBYEFGEdL/jMn4ZlB8maDgdsl6UwlqUNMA0GCSqGSIb3DQEBCwUAA4ICAQCE
Sc3dLXxeArE8ljaoeSq09NyuY4Qxht6/5fD0MITxj5kxwdZFN8PcrRYPEyftdZhO
AYjsHOR8Y+IGX7xhEToi9Ej38q+pg4ELLgkZkDuld+s6Tc+W4uR083lKiJYdyDpE
pm4A0/7Y+RrX9BS0dQ+kSg5Nat5z8BDinH0ZiB0gqbKWZWISGOfzCl+M5hiClyT1
L3iOUVywU6aqQR2sPeM0jBNusk3g+b4QQKPe6ueBSrgFFe0/clJgpPW1gfqNqdfs
VA8B7AbSBV/D1K1m6747N8FVoQA8VE/CDivRhWyiv2uKN+IioHQYEmg0G+H05bMh
8aRAzBUJ6JZK2UZbMn/L4coX8M+vYOFBYFhvGpaWgKgrwZHntKjlAu14/I52MpA4
ZOPMcl3pG2to0Ed4XbGMGrp/lj98Z4bxYmpk1f5/XiLEUa5tBeWH+N8lKPn98rOj
igjoxiENbYX8iRAxj+F7x3eyMvwMshNqwxioVIBcVEmYGQnRiFEN3yn348KWE9z6
FQuOTHmaAIyKb02WEuMqE+Rw1D4zcNMfgWeihZALmfwUy0Hyi2S1UThjHOKjwp4u
6Y6G13Wrf+emErflPRRKbmVlwv3Jf7/ujGG3HfcqIgA0OFxyTHShtr0+T5oBkT9Y
UdYjNqmu7YRdzpbFOwsGUIGFvh7rZt2k0phBUFUc1A==
-----END CERTIFICATE-----
Создав ключ и сертификат OpenSSL, вы можете начать использовать его в своих приложениях

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

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