Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
develop:ssl-certificates [2024/05/12 19:58] – создано mirocowdevelop:ssl-certificates [2025/12/25 22:11] (текущий) mirocow
Строка 1: Строка 1:
-{{tag>[ssl certificate]}}+{{tag>[ssl certificate openssl pem crt pfx der X.509 P12]}}
  
 ====== Сертификаты ====== ====== Сертификаты ======
  
-Этапы замены SSL-сертификата узла кластера при самостоятельном создании файлов приватного ключа и сертификата+===== Самоподписанные сертификаты ===== 
 + 
 +===== Покупные сертификаты =====
  
 Вы получите от удостоверяющего центра один из следующих файлов: Вы получите от удостоверяющего центра один из следующих файлов:
-  * Элемент ненумерованного спискафайл подписанного сертификата формата X.509 с расширением CER или CRT; +  * Элемент ненумерованного спискафайл подписанного сертификата формата **X.509** с расширением **CER** или **CRT**
-  * Элемент ненумерованного спискафайл цепочки сертификатов в формате PKCS#7 с расширением P7B. Файл включает подписанный по вашему запросу сертификат сайта и сертификаты промежуточных центров сертификации.+  * Элемент ненумерованного спискафайл цепочки сертификатов в формате **PKCS#7** с расширением **P7B**. Файл включает подписанный по вашему запросу сертификат сайта и сертификаты промежуточных центров сертификации. 
 + 
 +=== Создание полной цепочки === 
 + 
 +Файлы сертификата: 
 +  * **Сертификат** 
 +  * CSR-запрос 
 +  * **Корневой сертификат** 
 +  * **Private Key** 
 + 
 +<code> 
 +$ cat Сертификат Корневой_сертификат > domain-fullchain.crt 
 +$ chown www-data:www-data /etc/nginx/ssl/domain-fullchain.crt /etc/nginx/ssl/Private_Key 
 +$ chmod 644 /etc/nginx/ssl/domain-fullchain.crt 
 +$ chmod 600 /etc/nginx/ssl/Private_Key 
 +</code> 
 + 
 +<code nginx> 
 +server { 
 +    listen 443 ssl; 
 +    http2 on; 
 +    server_name domain; 
 +     
 +    access_log      /var/log/nginx/command-fewgehe-bot.access.log; 
 +    error_log       /var/log/nginx/command-fewgehe-bot.error.log; 
 + 
 +    ssl_certificate     /etc/nginx/ssl/domain-fullchain.crt; 
 +    ssl_certificate_key /etc/nginx/ssl/Private_Key; 
 + 
 +    # Оптимальные настройки безопасности 2025 
 +    ssl_protocols TLSv1.2 TLSv1.3; 
 +    ssl_prefer_server_ciphers off; 
 +
 +</code> 
 + 
 +==== Основные команды конвертации ====
  
-==== Конвертация сертификата из кодировки DER в PEM-кодировку ====+=== PEM ↔ DER ===
  
 Получение файлов приватного ключа и сертификата от удостоверяющего центра. Приватный ключ и сертификат предоставляются в виде PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12). Получение файлов приватного ключа и сертификата от удостоверяющего центра. Приватный ключ и сертификат предоставляются в виде PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12).
Строка 15: Строка 52:
 Вам нужно сохранить результат в виде цепочки сертификатов (certificate chain) в DER-кодировке. Вам нужно сохранить результат в виде цепочки сертификатов (certificate chain) в DER-кодировке.
  
-Конвертация сертификата из кодировки DER в PEM-кодировку+<code bash> 
 +$ openssl x509 -in cert.pem -outform der -out cert.der 
 +$ openssl x509 -inform der -in cert.der -out cert.pem 
 +</code> 
 После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить подписанный сертификат в формате X.509 (файл с расширением CER или CRT). После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить подписанный сертификат в формате X.509 (файл с расширением CER или CRT).
 Файл сертификата в формате X.509 может быть представлен в двух кодировках: Файл сертификата в формате X.509 может быть представлен в двух кодировках:
Строка 21: Строка 62:
   * DER encoded (DER-кодировка).   * DER encoded (DER-кодировка).
   * Base64 encoded (PEM-кодировка).   * Base64 encoded (PEM-кодировка).
 +
 +=== PEM → PKCS#12 (с ключом) ===
 +
 +<code bash>
 +$ openssl pkcs12 -export -in cert.pem -inkey key.pem -out bundle.p12
 +</code> 
 +
 +=== PKCS#12 / PFX-контейнера → PEM (сертификат + ключ) ===
 +
 +Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке.
  
 <code bash> <code bash>
-$ openssl x509 -in source.cer -inform DER -out cert.pem+$ openssl pkcs12 -in bundle.p12 -out cert.pem -nodes
 </code> </code>
  
-==== Извлечение цепочки сертификатов из контейнера PKCS#7 ====+В результате вы получите следующие файлы: 
 + 
 +  * key.pem – файл приватного ключа RSA в PEM-кодировке (без парольной фразы); 
 +  * cert.pem – файл сертификата формата X.509 в PEM-кодировке. 
 + 
 +== Чтобы извлечь файл приватного ключа, используйте команду: == 
 + 
 +<code bash> 
 +$ openssl pkcs12 -in source.pfx -nocerts -nodes -out key.pem 
 +</code> 
 + 
 +== Чтобы извлечь файл сертификата, используйте команду: == 
 + 
 +<code bash> 
 +$ openssl pkcs12 -in source.pfx -clcerts -nokeys -out cert.pem 
 +</code> 
 + 
 +=== PKCS#→ PEM (сертификат + ключ) === 
 + 
 +<code bash> 
 +$ openssl pkcs7 -in source.p7b -inform DER -print_certs -out cert.pem 
 +</code>
  
 После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить цепочку сертификатов в формате PKCS#7 (файл с расширением P7B). Цепочка включает подписанный по вашему запросу сертификат сайта, а также сертификаты промежуточных центров сертификации. После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить цепочку сертификатов в формате PKCS#7 (файл с расширением P7B). Цепочка включает подписанный по вашему запросу сертификат сайта, а также сертификаты промежуточных центров сертификации.
Строка 36: Строка 108:
 Для дальнейшего использования необходимо извлечь сертификаты из контейнера и получить файл в кодировке PEM. Конвертацию можно выполнить с помощью утилиты openssl. Для дальнейшего использования необходимо извлечь сертификаты из контейнера и получить файл в кодировке PEM. Конвертацию можно выполнить с помощью утилиты openssl.
  
-Чтобы конвертировать файл формата PKCS#7 в DER-кодировке, используйте команду:+== Чтобы конвертировать файл формата PKCS#7 в DER-кодировке, используйте команду: == 
 <code bash> <code bash>
 $ openssl pkcs7 -in source.p7b -inform DER -print_certs -out cert.pem $ openssl pkcs7 -in source.p7b -inform DER -print_certs -out cert.pem
 </code> </code>
  
-Чтобы конвертировать файл формата PKCS#7 в PEM-кодировке, используйте команду:+== Чтобы конвертировать файл формата PKCS#7 в PEM-кодировке, используйте команду: == 
 <code bash> <code bash>
 $ openssl pkcs7 -in source.p7b -inform PEM -print_certs -out cert.pem $ openssl pkcs7 -in source.p7b -inform PEM -print_certs -out cert.pem
 +</code>
 +
 +=== Извлечение только закрытого ключа из PKCS#12 / PFX-контейнера ===
 +
 +Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке.
 +
 +Извлечение файлов сертификата и приватного ключа можно выполнить с помощью утилиты openssl. В процессе извлечения файлов потребуется ввести парольную фразу от PFX-контейнера.
 +
 +Чтобы извлечь файл приватного ключа, используйте команду:
 +
 +<code bash>
 +$ openssl pkcs12 -in bundle.p12 -nocerts -nodes -out private.key
 +</code>
 +
 +В результате вы получите следующие файлы:
 +
 +  * key.pem – файл приватного ключа RSA в PEM-кодировке (без парольной фразы);
 +  * cert.pem – файл сертификата формата X.509 в PEM-кодировке.
 +
 +==== Проверка ====
 +
 +<code bash>
 +## PEM
 +openssl x509 -in cert.pem -noout -text
 +
 +## DER:
 +openssl x509 -in cert.der -inform der -noout -text
 +
 +## PKCS#12:
 +openssl pkcs12 -in bundle.p12 -nodes -info -nokeys
 +</code>
 +
 +<code bash>
 +$ openssl x509 -in /etc/nginx/ssl/command-fewgehe-bot.chickenkiller.com/fullchain.cer -noout -text
 +Certificate:
 +    Data:
 +        Version: 3 (0x2)
 +        Serial Number:
 +            d6:51:d4:0e:fd:2b:09:ad:9b:af:f2:c6:7a:64:4f:82
 +        Signature Algorithm: ecdsa-with-SHA384
 +        Issuer: C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
 +        Validity
 +            Not Before: Dec 25 00:00:00 2025 GMT
 +            Not After : Mar 25 23:59:59 2026 GMT
 +        Subject: CN=command-fewgehe-bot.chickenkiller.com
 +        Subject Public Key Info:
 +            Public Key Algorithm: id-ecPublicKey
 +                Public-Key: (256 bit)
 +                pub:
 +                    04:76:7a:f0:1f:3e:b6:3a:ab:3a:8c:f8:82:ac:8e:
 +                    36:4b:44:0e:05:a8:e1:61:3a:7a:c2:b6:17:ba:43:
 +                    a4:1e:a3:0b:74:dc:95:58:a0:ff:90:44:52:45:04:
 +                    2f:67:d6:2d:2d:28:76:82:9c:33:1e:73:c9:87:0c:
 +                    2b:bc:6a:c7:45
 +                ASN1 OID: prime256v1
 +                NIST CURVE: P-256
 +        X509v3 extensions:
 +            X509v3 Authority Key Identifier:
 +                0F:6B:E6:4B:CE:39:47:AE:F6:7E:90:1E:79:F0:30:91:92:C8:5F:A3
 +            X509v3 Subject Key Identifier:
 +                78:0F:78:10:EF:4D:EC:48:E0:27:1F:EF:83:E2:53:7A:5E:9B:09:E0
 +            X509v3 Key Usage: critical
 +                Digital Signature
 +            X509v3 Basic Constraints: critical
 +                CA:FALSE
 +            X509v3 Extended Key Usage:
 +                TLS Web Server Authentication
 +            X509v3 Certificate Policies:
 +                Policy: 1.3.6.1.4.1.6449.1.2.2.78
 +                  CPS: https://sectigo.com/CPS
 +                Policy: 2.23.140.1.2.1
 +            Authority Information Access:
 +                CA Issuers - URI:http://zerossl.crt.sectigo.com/ZeroSSLECCDomainSecureSiteCA.crt
 +                OCSP - URI:http://zerossl.ocsp.sectigo.com
 +            CT Precertificate SCTs:
 +                Signed Certificate Timestamp:
 +                    Version   : v1 (0x0)
 +                    Log ID    : 0E:57:94:BC:F3:AE:A9:3E:33:1B:2C:99:07:B3:F7:90:
 +                                DF:9B:C2:3D:71:32:25:DD:21:A9:25:AC:61:C5:4E:21
 +                    Timestamp : Dec 25 19:21:33.944 2025 GMT
 +                    Extensions: none
 +                    Signature : ecdsa-with-SHA256
 +                                30:45:02:20:17:DD:98:03:00:BB:8C:E9:2F:1F:30:6A:
 +                                2B:AD:58:5E:D6:10:2B:66:FE:21:21:E0:5F:CC:26:0D:
 +                                16:21:CE:C2:02:21:00:8E:BE:97:77:CC:70:66:F0:9D:
 +                                0C:97:B9:8C:7E:00:66:5B:51:A3:15:D6:34:6B:0B:14:
 +                                AE:08:24:D3:FE:E0:62
 +                Signed Certificate Timestamp:
 +                    Version   : v1 (0x0)
 +                    Log ID    : D1:6E:A9:A5:68:07:7E:66:35:A0:3F:37:A5:DD:BC:03:
 +                                A5:3C:41:12:14:D4:88:18:F5:E9:31:B3:23:CB:95:04
 +                    Timestamp : Dec 25 19:21:34.153 2025 GMT
 +                    Extensions: none
 +                    Signature : ecdsa-with-SHA256
 +                                30:46:02:21:00:F9:4F:32:CA:3B:B5:99:9B:BD:CE:1E:
 +                                BA:71:A1:CA:75:B2:1F:DB:49:FE:04:E2:38:CB:1D:CB:
 +                                B7:A0:82:33:0B:02:21:00:B0:D7:F6:7B:42:C4:5A:93:
 +                                FD:B8:8A:43:33:83:51:88:02:B2:60:E0:34:75:52:D4:
 +                                1D:D8:47:81:97:AB:E5:8C
 +            X509v3 Subject Alternative Name:
 +                DNS:command-fewgehe-bot.chickenkiller.com
 +    Signature Algorithm: ecdsa-with-SHA384
 +    Signature Value:
 +        30:64:02:30:32:e8:1e:29:28:aa:d3:aa:93:78:ce:df:97:6c:
 +        70:38:77:81:fd:c8:73:d0:0c:26:87:96:e8:f8:6e:cc:27:5e:
 +        0c:fd:a1:bc:4a:13:70:c9:55:fe:6e:dd:10:fa:13:45:02:30:
 +        55:8f:93:b2:fc:69:31:d5:10:bb:d8:61:ce:b7:d0:fd:cb:0f:
 +        c5:c0:77:03:56:18:c6:cd:f8:4c:50:8e:d2:2c:8f:95:52:8c:
 +        07:d3:ea:aa:f6:3b:de:46:04:e2:5d:dc
 +</code>
 +
 +<code bash>
 +$ echo | openssl s_client -servername command-fewgehe-bot.chickenkiller.com -connect command-fewgehe-bot.chickenkiller.com:443 2>/dev/null | openssl x509 -noout -subject -issuer -dates
 +subject=CN=command-fewgehe-bot.chickenkiller.com
 +issuer=C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
 +notBefore=Dec 25 00:00:00 2025 GMT
 +notAfter=Mar 25 23:59:59 2026 GMT
 +</code>
 +
 +<code bash>
 +$ echo | openssl s_client -servername command-fewgehe-bot.chickenkiller.com -connect command-fewgehe-bot.chickenkiller.com:443 2>/dev/null
 +CONNECTED(00000003)
 +---
 +Certificate chain
 + 0 s:CN=command-fewgehe-bot.chickenkiller.com
 +   i:C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
 +   a:PKEY: EC, (prime256v1); sigalg: ecdsa-with-SHA384
 +   v:NotBefore: Dec 25 00:00:00 2025 GMT; NotAfter: Mar 25 23:59:59 2026 GMT
 + 1 s:C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
 +   i:C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority
 +   a:PKEY: EC, (secp384r1); sigalg: ecdsa-with-SHA384
 +   v:NotBefore: Jan 30 00:00:00 2020 GMT; NotAfter: Jan 29 23:59:59 2030 GMT
 + 2 s:C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority
 +   i:C=GB, ST=Greater Manchester, L=Salford, O=Comodo CA Limited, CN=AAA Certificate Services
 +   a:PKEY: EC, (secp384r1); sigalg: sha384WithRSAEncryption
 +   v:NotBefore: Mar 12 00:00:00 2019 GMT; NotAfter: Dec 31 23:59:59 2028 GMT
 +---
 +Server certificate
 +-----BEGIN CERTIFICATE-----
 +MIIEIzCCA6qgAwIBAgIRANZR1A79Kwmtm6/yxnpkT4IwCgYIKoZIzj0EAwMwSzEL
 +MAkGA1UEBhMCQVQxEDAOBgNVBAoTB1plcm9TU0wxKjAoBgNVBAMTIVplcm9TU0wg
 +RUNDIERvbWFpbiBTZWN1cmUgU2l0ZSBDQTAeFw0yNTEyMjUwMDAwMDBaFw0yNjAz
 +MjUyMzU5NTlaMDAxLjAsBgNVBAMTJWNvbW1hbmQtZmV3Z2VoZS1ib3QuY2hpY2tl
 +bmtpbGxlci5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2evAfPrY6qzqM
 ++IKsjjZLRA4FqOFhOnrCthe6Q6Qeowt03JVYoP+QRFJFBC9n1i0tKHaCnDMec8mH
 +DCu8asdFo4ICiDCCAoQwHwYDVR0jBBgwFoAUD2vmS845R672fpAeefAwkZLIX6Mw
 +HQYDVR0OBBYEFHgPeBDvTexI4Ccf74PiU3pemwngMA4GA1UdDwEB/wQEAwIHgDAM
 +BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMEkGA1UdIARCMEAwNAYL
 +KwYBBAGyMQECAk4wJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D
 +UFMwCAYGZ4EMAQIBMIGIBggrBgEFBQcBAQR8MHowSwYIKwYBBQUHMAKGP2h0dHA6
 +Ly96ZXJvc3NsLmNydC5zZWN0aWdvLmNvbS9aZXJvU1NMRUNDRG9tYWluU2VjdXJl
 +U2l0ZUNBLmNydDArBggrBgEFBQcwAYYfaHR0cDovL3plcm9zc2wub2NzcC5zZWN0
 +aWdvLmNvbTCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB2AA5XlLzzrqk+MxssmQez
 +95Dfm8I9cTIl3SGpJaxhxU4hAAABm1b1lfgAAAQDAEcwRQIgF92YAwC7jOkvHzBq
 +K61YXtYQK2b+ISHgX8wmDRYhzsICIQCOvpd3zHBm8J0Ml7mMfgBmW1GjFdY0awsU
 +rggk0/7gYgB3ANFuqaVoB35mNaA/N6XdvAOlPEESFNSIGPXpMbMjy5UEAAABm1b1
 +lskAAAQDAEgwRgIhAPlPMso7tZmbvc4eunGhynWyH9tJ/gTiOMsdy7eggjMLAiEA
 +sNf2e0LEWpP9uIpDM4NRiAKyYOA0dVLUHdhHgZer5YwwMAYDVR0RBCkwJ4IlY29t
 +bWFuZC1mZXdnZWhlLWJvdC5jaGlja2Vua2lsbGVyLmNvbTAKBggqhkjOPQQDAwNn
 +ADBkAjAy6B4pKKrTqpN4zt+XbHA4d4H9yHPQDCaHluj4bswnXgz9obxKE3DJVf5u
 +3RD6E0UCMFWPk7L8aTHVELvYYc630P3LD8XAdwNWGMbN+ExQjtIsj5VSjAfT6qr2
 +O95GBOJd3A==
 +-----END CERTIFICATE-----
 +subject=CN=command-fewgehe-bot.chickenkiller.com
 +issuer=C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
 +---
 +No client certificate CA names sent
 +Peer signing digest: SHA256
 +Peer signature type: ecdsa_secp256r1_sha256
 +Negotiated TLS1.3 group: X25519MLKEM768
 +---
 +SSL handshake has read 4423 bytes and written 1659 bytes
 +Verification: OK
 +---
 +New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
 +Protocol: TLSv1.3
 +Server public key is 256 bit
 +This TLS version forbids renegotiation.
 +Compression: NONE
 +Expansion: NONE
 +No ALPN negotiated
 +Early data was not sent
 +Verify return code: 0 (ok)
 +---
 +
 +</code>
 +
 +===== Проверка валидности сертификата и ключа =====
 +
 +==== Файл ====
 +
 +<code bash>
 +# проверка соответствия ключа и сертификата (хеши должны совпадать)
 +$ openssl x509 -noout -modulus -in certificate.crt | openssl md5
 +$ openssl rsa -noout -modulus -in private.key | openssl md5
 +
 +# если используется ключ в формате PKCS#8:
 +$ openssl pkey -noout -modulus -in private.key | openssl md5
 +
 +# проверка соответствия ключа и сертификата из PFX-файла:
 +$ openssl pkcs12 -in bundle.pfx -nocerts -nodes | openssl rsa -noout -modulus | openssl md5
 +
 +# проверка срока действия сертификата:
 +$ openssl x509 -in certificate.crt -noout -dates
 +
 +# проверка структуры PEM-файла (если формат неверный, будет ошибка):
 +$ openssl x509 -in certificate.crt -noout
 +</code>
 +
 +==== Сайт ====
 +
 +<code bash>
 +# проверка срока действия сертификата:
 +$ echo | openssl s_client -connect lampa-tv.ru:443 2>&1 | openssl x509 -noout -dates
 +notBefore=Dec 20 13:12:38 2025 GMT
 +notAfter=Jul 22 13:12:38 2026 GMT
 +
 +# Сводка по удалённому хосту (лист, issuer, subject, даты)
 +$ echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -subject -issuer -dates
 +
 +# Сколько секунд осталось до истечения (0 — уже истёк)
 +$ echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate | awk -F= '{print $2}' | xargs -I{} date -d "{}" +%s | awk -v now=$(date +%s) '{print $1-now}'
 +
 +# Проверка «истечёт ли в ближайшие 30 дней» (число секунд: 30*24*3600 = 2592000)
 +$ echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -checkend 2592000 -noout
 </code> </code>
  
 ===== Ссылки ===== ===== Ссылки =====
  
-{{topic>[ssl certificate]}}+ 
 +  * [[nginx:настройка_ssl_https_в_nginx]] 
 +  * [[ssl-certificates|Извлечение цепочки сертификатов из контейнеров]]