Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| develop:ssl-certificates [2024/05/12 20:00] – mirocow | develop:ssl-certificates [2025/12/25 22:11] (текущий) – mirocow | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | {{tag> | + | {{tag> |
| ====== Сертификаты ====== | ====== Сертификаты ====== | ||
| - | Этапы замены SSL-сертификата узла кластера | + | ===== Самоподписанные сертификаты ===== |
| + | |||
| + | ===== Покупные сертификаты ===== | ||
| Вы получите от удостоверяющего центра один из следующих файлов: | Вы получите от удостоверяющего центра один из следующих файлов: | ||
| - | * Элемент ненумерованного спискафайл подписанного сертификата формата X.509 с расширением CER или CRT; | + | * Элемент ненумерованного спискафайл подписанного сертификата формата |
| - | * Элемент ненумерованного спискафайл цепочки сертификатов в формате PKCS#7 с расширением P7B. Файл включает подписанный по вашему запросу сертификат сайта и сертификаты промежуточных центров сертификации. | + | * Элемент ненумерованного спискафайл цепочки сертификатов в формате |
| + | |||
| + | === Создание полной цепочки === | ||
| + | |||
| + | Файлы сертификата: | ||
| + | * **Сертификат** | ||
| + | * CSR-запрос | ||
| + | * **Корневой сертификат** | ||
| + | * **Private Key** | ||
| + | |||
| + | < | ||
| + | $ cat Сертификат Корневой_сертификат > domain-fullchain.crt | ||
| + | $ chown www-data: | ||
| + | $ chmod 644 / | ||
| + | $ chmod 600 / | ||
| + | </ | ||
| + | |||
| + | <code nginx> | ||
| + | server { | ||
| + | listen 443 ssl; | ||
| + | http2 on; | ||
| + | server_name domain; | ||
| + | |||
| + | access_log | ||
| + | error_log | ||
| + | |||
| + | ssl_certificate | ||
| + | ssl_certificate_key / | ||
| + | |||
| + | # Оптимальные настройки безопасности 2025 | ||
| + | ssl_protocols TLSv1.2 TLSv1.3; | ||
| + | ssl_prefer_server_ciphers off; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Основные команды конвертации ==== | ||
| - | ==== Конвертация сертификата из кодировки 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 | ||
| + | </ | ||
| После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить подписанный сертификат в формате 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> | <code bash> | ||
| - | $ openssl | + | $ openssl |
| + | </ | ||
| + | |||
| + | === PKCS#12 / PFX-контейнера → PEM (сертификат + ключ) === | ||
| + | |||
| + | Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке. | ||
| + | |||
| + | <code bash> | ||
| + | $ openssl pkcs12 -in bundle.p12 | ||
| </ | </ | ||
| - | ==== Извлечение цепочки сертификатов из контейнера PKCS#7 ==== | + | В результате вы получите следующие файлы: |
| + | |||
| + | * key.pem – файл | ||
| + | * cert.pem – файл | ||
| + | |||
| + | == Чтобы | ||
| + | |||
| + | <code bash> | ||
| + | $ openssl pkcs12 -in source.pfx -nocerts -nodes -out key.pem | ||
| + | </ | ||
| + | |||
| + | == Чтобы извлечь файл сертификата, используйте команду: | ||
| + | |||
| + | <code bash> | ||
| + | $ openssl pkcs12 -in source.pfx -clcerts -nokeys -out cert.pem | ||
| + | </ | ||
| + | |||
| + | === PKCS# | ||
| + | |||
| + | <code bash> | ||
| + | $ openssl pkcs7 -in source.p7b -inform DER -print_certs -out cert.pem | ||
| + | </ | ||
| После выполнения запроса на выписку сертификата удостоверяющий центр может предоставить цепочку сертификатов в формате 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 | ||
| </ | </ | ||
| - | Чтобы конвертировать файл формата 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 | ||
| </ | </ | ||
| - | ==== Извлечение | + | === Извлечение |
| Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке. | Если удостоверяющий центр предоставил сертификат в форме PFX-контейнера (формат PKCS#12, файл с расширением PFX или P12), необходимо самостоятельно извлечь из него файлы сертификата и приватного ключа в PEM-кодировке. | ||
| Строка 55: | Строка 129: | ||
| <code bash> | <code bash> | ||
| - | $ openssl pkcs12 -in source.pfx -nocerts -nodes -out key.pem | + | $ openssl pkcs12 -in bundle.p12 -nocerts -nodes -out private.key |
| </ | </ | ||
| - | Чтобы извлечь файл сертификата, используйте команду: | + | В результате вы получите следующие файлы: |
| + | |||
| + | * key.pem – файл приватного ключа RSA в PEM-кодировке (без парольной фразы); | ||
| + | * cert.pem – файл сертификата | ||
| + | |||
| + | ==== Проверка ==== | ||
| <code bash> | <code bash> | ||
| - | $ openssl | + | ## PEM |
| + | openssl | ||
| + | |||
| + | ## DER: | ||
| + | openssl x509 -in cert.der -inform der -noout -text | ||
| + | |||
| + | ## PKCS#12: | ||
| + | openssl pkcs12 -in bundle.p12 -nodes -info -nokeys | ||
| </ | </ | ||
| - | В результате вы получите следующие файлы: | + | <code bash> |
| + | $ openssl x509 -in / | ||
| + | Certificate: | ||
| + | Data: | ||
| + | Version: 3 (0x2) | ||
| + | Serial Number: | ||
| + | d6: | ||
| + | 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: | ||
| + | 36: | ||
| + | a4: | ||
| + | 2f: | ||
| + | 2b: | ||
| + | ASN1 OID: prime256v1 | ||
| + | NIST CURVE: P-256 | ||
| + | X509v3 extensions: | ||
| + | X509v3 Authority Key Identifier: | ||
| + | 0F: | ||
| + | X509v3 Subject Key Identifier: | ||
| + | 78: | ||
| + | X509v3 Key Usage: critical | ||
| + | Digital Signature | ||
| + | X509v3 Basic Constraints: | ||
| + | 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:// | ||
| + | Policy: 2.23.140.1.2.1 | ||
| + | Authority Information Access: | ||
| + | CA Issuers - URI: | ||
| + | OCSP - URI: | ||
| + | CT Precertificate SCTs: | ||
| + | Signed Certificate Timestamp: | ||
| + | Version | ||
| + | Log ID : 0E: | ||
| + | DF: | ||
| + | Timestamp : Dec 25 19: | ||
| + | Extensions: none | ||
| + | Signature : ecdsa-with-SHA256 | ||
| + | 30: | ||
| + | 2B: | ||
| + | 16: | ||
| + | 0C: | ||
| + | AE: | ||
| + | Signed Certificate Timestamp: | ||
| + | Version | ||
| + | Log ID : D1: | ||
| + | A5: | ||
| + | Timestamp : Dec 25 19: | ||
| + | Extensions: none | ||
| + | Signature : ecdsa-with-SHA256 | ||
| + | 30: | ||
| + | BA: | ||
| + | B7: | ||
| + | FD: | ||
| + | 1D: | ||
| + | X509v3 Subject Alternative Name: | ||
| + | DNS: | ||
| + | Signature Algorithm: ecdsa-with-SHA384 | ||
| + | Signature Value: | ||
| + | 30: | ||
| + | 70: | ||
| + | 0c: | ||
| + | 55: | ||
| + | c5: | ||
| + | 07: | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | $ echo | openssl s_client -servername command-fewgehe-bot.chickenkiller.com -connect command-fewgehe-bot.chickenkiller.com: | ||
| + | subject=CN=command-fewgehe-bot.chickenkiller.com | ||
| + | issuer=C=AT, | ||
| + | notBefore=Dec 25 00:00:00 2025 GMT | ||
| + | notAfter=Mar 25 23:59:59 2026 GMT | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | $ echo | openssl s_client -servername command-fewgehe-bot.chickenkiller.com -connect command-fewgehe-bot.chickenkiller.com: | ||
| + | CONNECTED(00000003) | ||
| + | --- | ||
| + | Certificate chain | ||
| + | 0 s: | ||
| + | | ||
| + | | ||
| + | | ||
| + | 1 s:C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA | ||
| + | | ||
| + | | ||
| + | | ||
| + | 2 s:C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority | ||
| + | | ||
| + | | ||
| + | | ||
| + | --- | ||
| + | Server certificate | ||
| + | -----BEGIN CERTIFICATE----- | ||
| + | MIIEIzCCA6qgAwIBAgIRANZR1A79Kwmtm6/ | ||
| + | MAkGA1UEBhMCQVQxEDAOBgNVBAoTB1plcm9TU0wxKjAoBgNVBAMTIVplcm9TU0wg | ||
| + | RUNDIERvbWFpbiBTZWN1cmUgU2l0ZSBDQTAeFw0yNTEyMjUwMDAwMDBaFw0yNjAz | ||
| + | MjUyMzU5NTlaMDAxLjAsBgNVBAMTJWNvbW1hbmQtZmV3Z2VoZS1ib3QuY2hpY2tl | ||
| + | bmtpbGxlci5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2evAfPrY6qzqM | ||
| + | +IKsjjZLRA4FqOFhOnrCthe6Q6Qeowt03JVYoP+QRFJFBC9n1i0tKHaCnDMec8mH | ||
| + | DCu8asdFo4ICiDCCAoQwHwYDVR0jBBgwFoAUD2vmS845R672fpAeefAwkZLIX6Mw | ||
| + | HQYDVR0OBBYEFHgPeBDvTexI4Ccf74PiU3pemwngMA4GA1UdDwEB/ | ||
| + | BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMEkGA1UdIARCMEAwNAYL | ||
| + | KwYBBAGyMQECAk4wJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D | ||
| + | UFMwCAYGZ4EMAQIBMIGIBggrBgEFBQcBAQR8MHowSwYIKwYBBQUHMAKGP2h0dHA6 | ||
| + | Ly96ZXJvc3NsLmNydC5zZWN0aWdvLmNvbS9aZXJvU1NMRUNDRG9tYWluU2VjdXJl | ||
| + | U2l0ZUNBLmNydDArBggrBgEFBQcwAYYfaHR0cDovL3plcm9zc2wub2NzcC5zZWN0 | ||
| + | aWdvLmNvbTCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB2AA5XlLzzrqk+MxssmQez | ||
| + | 95Dfm8I9cTIl3SGpJaxhxU4hAAABm1b1lfgAAAQDAEcwRQIgF92YAwC7jOkvHzBq | ||
| + | K61YXtYQK2b+ISHgX8wmDRYhzsICIQCOvpd3zHBm8J0Ml7mMfgBmW1GjFdY0awsU | ||
| + | rggk0/ | ||
| + | lskAAAQDAEgwRgIhAPlPMso7tZmbvc4eunGhynWyH9tJ/ | ||
| + | sNf2e0LEWpP9uIpDM4NRiAKyYOA0dVLUHdhHgZer5YwwMAYDVR0RBCkwJ4IlY29t | ||
| + | bWFuZC1mZXdnZWhlLWJvdC5jaGlja2Vua2lsbGVyLmNvbTAKBggqhkjOPQQDAwNn | ||
| + | ADBkAjAy6B4pKKrTqpN4zt+XbHA4d4H9yHPQDCaHluj4bswnXgz9obxKE3DJVf5u | ||
| + | 3RD6E0UCMFWPk7L8aTHVELvYYc630P3LD8XAdwNWGMbN+ExQjtIsj5VSjAfT6qr2 | ||
| + | O95GBOJd3A== | ||
| + | -----END CERTIFICATE----- | ||
| + | subject=CN=command-fewgehe-bot.chickenkiller.com | ||
| + | issuer=C=AT, | ||
| + | --- | ||
| + | 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: | ||
| + | --- | ||
| + | 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: | ||
| + | Expansion: NONE | ||
| + | No ALPN negotiated | ||
| + | Early data was not sent | ||
| + | Verify return code: 0 (ok) | ||
| + | --- | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Проверка валидности сертификата и ключа ===== | ||
| + | |||
| + | ==== Файл ==== | ||
| + | |||
| + | <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 | ||
| + | |||
| + | # проверка | ||
| + | $ 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 bash> | ||
| + | # проверка срока действия сертификата: | ||
| + | $ echo | openssl s_client -connect lampa-tv.ru: | ||
| + | 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: | ||
| + | |||
| + | # Сколько секунд осталось до истечения (0 — уже истёк) | ||
| + | $ echo | openssl s_client -servername example.com -connect example.com: | ||
| + | |||
| + | # Проверка «истечёт ли в ближайшие 30 дней» (число секунд: | ||
| + | $ echo | openssl s_client -servername example.com -connect example.com:443 2>/ | ||
| + | </ | ||
| - | key.pem – файл приватного ключа RSA в PEM-кодировке (без парольной фразы); | ||
| - | cert.pem – файл сертификата формата X.509 в PEM-кодировке. | ||
| ===== Ссылки ===== | ===== Ссылки ===== | ||
| - | {{topic>[ssl certificate]}} | + | |
| + | * [[nginx: | ||
| + | * [[ssl-certificates|Извлечение цепочки сертификатов из контейнеров]] | ||