Title: πŸ” OpenSSL β€” CSR with Subject Alternative Names (SAN) Group: Security & Crypto Icon: πŸ” Order: 3 ## Table of Contents - [Basics & Overview](#-basics--overview--основы-ΠΈ-ΠΎΠ±Π·ΠΎΡ€) - [Configuration File](#-configuration-file--Ρ„Π°ΠΉΠ»-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ) - [Generating CSR](#-generating-csr--созданиС-csr) - [Verification](#-verification--ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°) - [Real-World Examples](#-real-world-examples--ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹-ΠΈΠ·-ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ) --- # πŸ“˜ Basics & Overview / ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΈ ΠΎΠ±Π·ΠΎΡ€ ### What is SAN? / Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ SAN? **Subject Alternative Name (SAN)** allows a single certificate to secure multiple domain names. **ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ имя ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚Π° (SAN)** позволяСт ΠΎΠ΄Π½ΠΎΠΌΡƒ сСртификату Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ нСсколько Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΡ‘Π½. **Common Use Cases / Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ случаи использования:** - Multiple subdomains (`www.example.com`, `api.example.com`) / НСсколько ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² - Wildcard + specific domains / Wildcard + ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄ΠΎΠΌΠ΅Π½Ρ‹ - IPs + domains (less common) / IP + Π΄ΠΎΠΌΠ΅Π½Ρ‹ (Ρ€Π΅ΠΆΠ΅) --- # πŸ“„ Configuration File / Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ### Basic SAN Configuration / Базовая конфигурация SAN ```ini # openssl-san.cnf [req] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [dn] C = # Country / Π‘Ρ‚Ρ€Π°Π½Π° ST = # State/Province / Π¨Ρ‚Π°Ρ‚/ΠžΠ±Π»Π°ΡΡ‚ΡŒ L = # City / Π“ΠΎΡ€ΠΎΠ΄ O = # Organization / ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ CN = # Common Name / ОсновноС имя [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = DNS.2 = www. DNS.3 = api. DNS.4 = mail. ``` ### Example Configuration / ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ```ini # openssl-san.cnf [req] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [dn] C = US ST = California L = San Francisco O = Example Inc CN = example.com [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = api.example.com DNS.4 = *.example.com # Wildcard / Wildcard ``` ### With IP Addresses / Π‘ IP-адрСсами ```ini [alt_names] DNS.1 = example.com DNS.2 = www.example.com IP.1 = IP.2 = ``` --- # πŸ”‘ Generating CSR / Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ CSR ### Generate New Key + CSR / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ + CSR openssl req -new -newkey rsa:2048 -nodes \ -keyout .pem \ -out .pem \ -config openssl-san.cnf ### Generate CSR from Existing Key / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ CSR ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Π° openssl req -new -key .pem \ -out .pem \ -config openssl-san.cnf ### Generate 4096-bit Key / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ 4096-Π±ΠΈΡ‚ openssl req -new -newkey rsa:4096 -nodes \ -keyout .pem \ -out .pem \ -config openssl-san.cnf ### Generate ECC Key (Modern) / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ECC ΠΊΠ»ΡŽΡ‡ (соврСмСнный) openssl req -new -newkey ec:<(openssl ecparam -name prime256v1) -nodes \ -keyout .pem \ -out .pem \ -config openssl-san.cnf --- # βœ… Verification / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ### View CSR Details / ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ CSR openssl req -text -noout -in .pem # View CSR / ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ CSR openssl req -text -noout -in .pem | grep -A1 "Subject Alternative Name" # View SANs only / Волько SANs ### Verify CSR Signature / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ подпись CSR openssl req -verify -in .pem -noout # Verify CSR / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ CSR ### Extract Public Key from CSR / Π˜Π·Π²Π»Π΅Ρ‡ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· CSR openssl req -in .pem -pubkey -noout # Extract public key / Π˜Π·Π²Π»Π΅Ρ‡ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ### View Private Key / ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° openssl rsa -in .pem -text -noout # View RSA key / ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ RSA ΠΊΠ»ΡŽΡ‡Π° openssl ec -in .pem -text -noout # View EC key / ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ EC ΠΊΠ»ΡŽΡ‡Π° --- # 🌟 Real-World Examples / ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ### Web Server with Multiple Subdomains / Π’Π΅Π±-сСрвСр с нСсколькими ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ ```bash # Create configuration / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ cat > openssl-san.cnf < openssl-san-internal.cnf < IP.2 = EOF # Generate / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ openssl req -new -newkey rsa:2048 -nodes \ -keyout internal.key \ -out internal.csr \ -config openssl-san-internal.cnf ``` ### Self-Signed Certificate with SAN / Бамоподписанный сСртификат с SAN ```bash # Generate self-signed cert with SANs / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ самоподписанный сСртификат с SANs openssl req -x509 -newkey rsa:2048 -nodes \ -keyout selfsigned.key \ -out selfsigned.crt \ -days 365 \ -config openssl-san.cnf \ -extensions req_ext # Verify certificate SANs / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ SANs сСртификата openssl x509 -in selfsigned.crt -text -noout | grep -A1 "Subject Alternative Name" ``` ### Wildcard + Specific Domains / Wildcard + ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄ΠΎΠΌΠ΅Π½Ρ‹ ```bash # Config with wildcard / ΠšΠΎΠ½Ρ„ΠΈΠ³ с wildcard cat > openssl-san-wildcard.cnf <.key β€” Private key / ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ # .csr β€” Certificate signing request / Запрос Π½Π° подпись сСртификата # .crt β€” Signed certificate / ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ сСртификат # πŸ“‹ Common DN Fields / РаспространённыС поля DN # C β€” Country (2-letter code) / Π‘Ρ‚Ρ€Π°Π½Π° (2-Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄) # ST β€” State or Province / Π¨Ρ‚Π°Ρ‚ ΠΈΠ»ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ # L β€” Locality (city) / Π“ΠΎΡ€ΠΎΠ΄ # O β€” Organization / ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ # OU β€” Organizational Unit / ΠŸΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ # CN β€” Common Name (primary domain) / ОсновноС имя (основной Π΄ΠΎΠΌΠ΅Π½)