Certyfikaty X.509: struktura, typy i generowanie dla programistów
Certyfikaty X.509 to kluczowy element PKI, przechowujący klucz publiczny i atrybuty podmiotu. Standard wywodzi się z X.500 DAP, zastąpionego przez LDAP. Wszystkie struktury opisane są w ASN.1 — meta-języku do serializacji danych. Kodowanie odbywa się zgodnie z regułami BER, CER, DER z X.690 lub XER.
Podstawowa struktura TBSCertificate:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL
}
SEQUENCE w ASN.1 jest analogiczne do struct w C. Do analizy składni użyj X.680 (2008). Pierwsza rola certyfikatu — kontener klucza publicznego. Druga — potwierdzenie posiadania domeny lub tożsamości, choć wiarygodność się różni.
Hierarchia i typy certyfikatów
Łańcuch zaufania buduje się od głównego CA do końcowego podmiotu.
- Główne (root): issuer = subject, basicConstraints.cA = TRUE.
- Pośrednie: podpisane przez wyższy CA, tworzą łańcuch.
- Końcowe (leaf): nie podpisują innych, używane przez systemy końcowe.
Według poziomu weryfikacji:
- DV (Domain Validated): automatyczna weryfikacja domeny przez e-mail lub wyzwanie HTTP.
- OV (Organization Validated): sprawdzenie whois, rejestracji, kontaktów — kilka dni.
- EV (Extended Validation): audyt firmy, wyłączne prawo do domeny, autoryzacja. Widoczny zielonym paskiem z nazwą organizacji. Wymaga jurisdictionOfIncorporationCountryName, businessCategory, serialNumber w subject.
Inne warianty:
- Wielodomenowe: SAN (subjectAltName) dla wielu domen.
- Wildcard: CN=*.example.net dla poddomen.
- Kwalifikowane: osobiste wg RFC 3739 z GN, dateOfBirth, countryOfCitizenship.
Generowanie certyfikatów
Samopodpisane z ECC
Krzywe eliptyczne (ECC) są efektywniejsze od RSA pod względem CPU i rozmiaru klucza, ale obsługa w TLS<1.2 bywa różna.
Generowanie klucza prywatnego secp521r1:
openssl ecparam -name secp521r1 -genkey -param_enc explicit -out private-key.pem
CSR z SHA256:
openssl req -new -sha256 -key private-key.pem -out server.csr -days 730
Podpis:
openssl x509 -req -sha256 -days 365 -in server.csr -signkey private-key.pem -out public.crt
Podgląd:
openssl x509 -text -noout -in public.crt
Pomoc: openssl -help, openssl x509 -help.
Z Java keytool
RSA 2048:
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Konwersja do PKCS12:
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype pkcs12
Wyjście zawiera SubjectKeyIdentifier (OID 2.5.29.14, non-critical wg RFC 3280).
Let's Encrypt (DV)
Instalacja certbot i uzyskanie:
sudo certbot certonly --standalone -d example.com -d www.example.com
(Dla Gentoo: sudo emerge certbot; Debian: sudo apt-get install certbot -t stretch-backports; Fedora: sudo dnf install certbot).
Rozszerzenia i analiza
Certyfikaty zawierają OID do identyfikacji: subjectKeyIdentifier ::= KeyIdentifier. Pełna analiza — przez openssl x509 -text. Łańcuchy budują zaufanie: root → pośrednie → leaf.
Co ważne:
- X.509 na ASN.1: SEQUENCE jak struct, kodowanie DER/BER.
- Typy: DV/OV/EV wg weryfikacji, wildcard/SAN dla elastyczności.
- Generowanie: openssl dla ECC/RSA, keytool dla JKS/PKCS12, certbot dla LE.
- Łańcuch: root (cA=TRUE) → pośrednie → leaf.
Do debugowania łańcuchów użyj openssl s_client -connect host:443 -showcerts. Zestaw standardów (X.680/690, RFC 3280/3739) zapewnia interoperacyjność w PKI.
— Editorial Team
Brak komentarzy.