Các lệnh dưới đây chạy trên OpenSSL 3.x (Ubuntu 22.04+, RHEL 9). Khái niệm chain, SAN, mTLS xem TLS và PKI.
Tạo key và CSR
| Mục đích | Lệnh |
|---|---|
| Key EC P-256 (khuyên dùng) | openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out server.key |
| Key RSA 3072 | openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out server.key |
| CSR có SAN (một lệnh) | openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com,IP:192.0.2.10" |
| Đọc CSR, xem SAN | openssl req -in server.csr -noout -text |
| Kiểm tra chữ ký CSR | openssl req -in server.csr -noout -verify |
| Self-signed cert cho lab (key + cert cùng lúc) | openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes -keyout lab.key -out lab.crt -days 365 -subj "/CN=lab.example.com" -addext "subjectAltName=DNS:lab.example.com" |
CA nội bộ cho lab
# Root CA
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes \
-keyout ca.key -out ca.crt -days 3650 -subj "/CN=Lab Root CA" \
-addext "basicConstraints=critical,CA:TRUE" \
-addext "keyUsage=critical,keyCertSign,cRLSign"
# Ký CSR, giữ nguyên SAN trong CSR (-copy_extensions cần OpenSSL 3.0+)
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 397 -copy_extensions copy-copy_extensions copy chép mọi extension trong CSR, kể cả CA:TRUE nếu người gửi cố ý thêm. Chỉ dùng với CSR bạn tự tạo; CA thật nên dùng Vault PKI hoặc step-ca.
Đọc cert
| Mục đích | Lệnh |
|---|---|
| Toàn bộ nội dung | openssl x509 -in server.crt -noout -text |
| Subject, issuer, thời hạn | openssl x509 -in server.crt -noout -subject -issuer -dates |
| Chỉ xem SAN | openssl x509 -in server.crt -noout -ext subjectAltName |
| Còn hạn ít nhất 30 ngày? (exit 0 = còn) | openssl x509 -in server.crt -noout -checkend 2592000 |
| Fingerprint SHA-256 | openssl x509 -in server.crt -noout -fingerprint -sha256 |
| Đếm số cert trong bundle | grep -c 'BEGIN CERTIFICATE' fullchain.pem |
| Xem từng cert trong bundle | openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout |
Key khớp cert?
So sánh hash public key, ba dòng phải ra cùng một giá trị (dùng được cho cả RSA và EC):
openssl pkey -in server.key -pubout | openssl sha256
openssl x509 -in server.crt -noout -pubkey | openssl sha256
openssl req -in server.csr -noout -pubkey | openssl sha256Kiểm tra chain
| Mục đích | Lệnh |
|---|---|
| Verify cert với root CA | openssl verify -CAfile ca.crt server.crt |
| Verify có intermediate | openssl verify -CAfile root.crt -untrusted intermediate.crt server.crt |
| Verify với trust store hệ thống | openssl verify -untrusted chain.pem server.crt |
Kết nối tới server (s_client)
| Mục đích | Lệnh |
|---|---|
| Handshake, tóm tắt | openssl s_client -connect api.example.com:443 -servername api.example.com -brief </dev/null |
| Xem toàn bộ chain server gửi | openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null |
| Ngày hết hạn cert đang chạy | openssl s_client -connect api.example.com:443 -servername api.example.com </dev/null 2>/dev/null | openssl x509 -noout -dates -ext subjectAltName |
| Ép TLS 1.2 / 1.3 | openssl s_client -connect api.example.com:443 -tls1_2 (hoặc -tls1_3) |
| Fail khi verify lỗi, kiểm tra hostname | openssl s_client -connect api.example.com:443 -verify_return_error -verify_hostname api.example.com </dev/null |
| Dùng CA nội bộ | openssl s_client -connect 192.0.2.10:57400 -CAfile ca.crt </dev/null |
| mTLS: gửi cert client | openssl s_client -connect 192.0.2.10:57400 -cert client.crt -key client.key -CAfile ca.crt </dev/null |
| SMTP STARTTLS | openssl s_client -connect mail.example.com:587 -starttls smtp -brief </dev/null |
| Kiểm tra ALPN (h2) | openssl s_client -connect api.example.com:443 -alpn h2 </dev/null 2>/dev/null | grep ALPN |
Đổi định dạng
| Mục đích | Lệnh |
|---|---|
| PEM → DER | openssl x509 -in server.crt -outform der -out server.der |
| DER → PEM | openssl x509 -in server.der -inform der -out server.crt |
| Gộp key + cert + chain thành PKCS#12 | openssl pkcs12 -export -inkey server.key -in server.crt -certfile chain.pem -out server.p12 -passout env:P12_PASS |
| PKCS#12 cho thiết bị/Java cũ (thuật toán cũ) | thêm -legacy vào lệnh trên |
| Lấy cert từ PKCS#12 | openssl pkcs12 -in server.p12 -nokeys -passin env:P12_PASS -out certs.pem |
| Lấy key từ PKCS#12 (không mã hoá) | openssl pkcs12 -in server.p12 -nocerts -nodes -passin env:P12_PASS -out server.key |
| Bỏ passphrase của key | openssl pkey -in enc.key -out server.key |
Truyền passphrase bằng -passin env:VAR / -passout env:VAR hoặc file:path, không gõ pass:... trên dòng lệnh (lộ trong ps và history).
Linh tinh
| Mục đích | Lệnh |
|---|---|
| Sinh chuỗi ngẫu nhiên 32 byte | openssl rand -base64 32 |
| Liệt kê cipher theo chuỗi cấu hình | openssl ciphers -v 'ECDHE+AESGCM' |
| Hash file | openssl dgst -sha256 file.tar.gz |