Sổ tay kỹ thuật

OpenSSL – lệnh hay dùng với cert, key, CSR

cheatsheet#openssl#tls#pki· cập nhật 2026-11-06

Tra nhanh lệnh openssl để tạo key/CSR, đọc cert, kiểm tra chain, debug handshake và đổi định dạng PEM/DER/PKCS#12.

Sửa trang này
Mục lục

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 sha256

Kiể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