Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:ssl-certificates [2025/12/25 20:00] 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]}}
  
 ====== Сертификаты ====== ====== Сертификаты ======
 +
 +===== Самоподписанные сертификаты =====
 +
 +===== Покупные сертификаты =====
 +
 +Вы получите от удостоверяющего центра один из следующих файлов:
 +  * Элемент ненумерованного спискафайл подписанного сертификата формата **X.509** с расширением **CER** или **CRT**;
 +  * Элемент ненумерованного спискафайл цепочки сертификатов в формате **PKCS#7** с расширением **P7B**. Файл включает подписанный по вашему запросу сертификат сайта и сертификаты промежуточных центров сертификации.
  
 === Создание полной цепочки === === Создание полной цепочки ===
  
 Файлы сертификата: Файлы сертификата:
-  * Сертификат+  * **Сертификат**
   * CSR-запрос   * CSR-запрос
-  * Корневой сертификат +  * **Корневой сертификат** 
-  * Private Key+  * **Private Key**
  
 <code> <code>
-$ cat Сертификат Корневой_сертификат > lampa-fullchain.crt +$ cat Сертификат Корневой_сертификат > domain-fullchain.crt 
-$ chown www-data:www-data /etc/nginx/ssl/lampa-fullchain.crt /etc/nginx/ssl/Private_Key +$ chown www-data:www-data /etc/nginx/ssl/domain-fullchain.crt /etc/nginx/ssl/Private_Key 
-$ chmod 644 /etc/nginx/ssl/lampa-fullchain.crt+$ chmod 644 /etc/nginx/ssl/domain-fullchain.crt
 $ chmod 600 /etc/nginx/ssl/Private_Key $ 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> </code>
  
Строка 21: Строка 47:
  
 === PEM ↔ DER === === PEM ↔ DER ===
 +
 +Получение файлов приватного ключа и сертификата от удостоверяющего центра. Приватный ключ и сертификат предоставляются в виде PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12).
 +Если в качестве удостоверяющего центра в вашей организации используется стандартная служба Active Directory Certification Services, следует использовать шаблон Web Server для создания сертификата. 
 +Вам нужно сохранить результат в виде цепочки сертификатов (certificate chain) в DER-кодировке.
  
 <code bash> <code bash>
Строка 26: Строка 56:
 $ openssl x509 -inform der -in cert.der -out cert.pem $ openssl x509 -inform der -in cert.der -out cert.pem
 </code> </code>
 +
 +После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить подписанный сертификат в формате X.509 (файл с расширением CER или CRT).
 +Файл сертификата в формате X.509 может быть представлен в двух кодировках:
 +
 +  * DER encoded (DER-кодировка).
 +  * Base64 encoded (PEM-кодировка).
  
 === PEM → PKCS#12 (с ключом) === === PEM → PKCS#12 (с ключом) ===
Строка 33: Строка 69:
 </code>  </code> 
  
-=== PKCS#12 → PEM (сертификат + ключ) ===+=== PKCS#12 / PFX-контейнера → PEM (сертификат + ключ) === 
 + 
 +Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке.
  
 <code bash> <code bash>
 $ openssl pkcs12 -in bundle.p12 -out cert.pem -nodes $ openssl pkcs12 -in bundle.p12 -out cert.pem -nodes
-</code> +</code> 
 + 
 +В результате вы получите следующие файлы: 
 + 
 +  * 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#7 → PEM (сертификат + ключ) === 
 + 
 +<code bash> 
 +$ openssl pkcs7 -in source.p7b -inform DER -print_certs -out cert.pem 
 +</code> 
 + 
 +После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить цепочку сертификатов в формате PKCS#7 (файл с расширением P7B). Цепочка включает подписанный по вашему запросу сертификат сайта, а также сертификаты промежуточных центров сертификации. 
 +Файл в формате PKCS#7 может быть представлен в двух кодировках: 
 + 
 +  * DER encoded (DER-кодировка). 
 +  * Base64 encoded (PEM-кодировка). 
 + 
 +Для дальнейшего использования необходимо извлечь сертификаты из контейнера и получить файл в кодировке PEM. Конвертацию можно выполнить с помощью утилиты openssl. 
 + 
 +== Чтобы конвертировать файл формата PKCS#7 в DER-кодировке, используйте команду: == 
 + 
 +<code bash> 
 +$ openssl pkcs7 -in source.p7b -inform DER -print_certs -out cert.pem 
 +</code> 
 + 
 +== Чтобы конвертировать файл формата PKCS#7 в PEM-кодировке, используйте команду: == 
 + 
 +<code bash> 
 +$ openssl pkcs7 -in source.p7b -inform PEM -print_certs -out cert.pem 
 +</code> 
 + 
 +=== Извлечение только закрытого ключа из PKCS#12 / PFX-контейнера === 
 + 
 +Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке. 
 + 
 +Извлечение файлов сертификата и приватного ключа можно выполнить с помощью утилиты openssl. В процессе извлечения файлов потребуется ввести парольную фразу от PFX-контейнера.
  
-=== Извлечение только закрытого ключа из PKCS#12 ===+Чтобы извлечь файл приватного ключаиспользуйте команду:
  
 <code bash> <code bash>
 $ openssl pkcs12 -in bundle.p12 -nocerts -nodes -out private.key $ openssl pkcs12 -in bundle.p12 -nocerts -nodes -out private.key
 </code> </code>
 +
 +В результате вы получите следующие файлы:
 +
 +  * key.pem – файл приватного ключа RSA в PEM-кодировке (без парольной фразы);
 +  * cert.pem – файл сертификата формата X.509 в PEM-кодировке.
  
 ==== Проверка ==== ==== Проверка ====
Строка 136: Строка 228:
         07:d3:ea:aa:f6:3b:de:46:04:e2:5d:dc         07:d3:ea:aa:f6:3b:de:46:04:e2:5d:dc
 </code> </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>
 +
 +===== Ссылки =====
 +
 +
 +  * [[nginx:настройка_ssl_https_в_nginx]]
 +  * [[ssl-certificates|Извлечение цепочки сертификатов из контейнеров]]
 +