OpenSSL & SSL Complete Commands Reference
SECTION 1: CERTIFICATE INSPECTION COMMANDS
View Certificate Details
openssl x509 -in certificate.crt -text -noout
openssl x509 -in certificate.crt -text -noout -issuer -subject -dates
openssl x509 -in certificate.crt -fingerprint -noout
openssl x509 -in certificate.crt -fingerprint -sha256 -noout
openssl x509 -in certificate.crt -serial -noout
openssl x509 -in certificate.crt -startdate -enddate -noout
openssl x509 -in certificate.crt -modulus -noout
openssl x509 -in certificate.crt -ext subjectAltName -noout
openssl x509 -in certificate.crt -purpose -noout
openssl x509 -in certificate.crt -pubkey -noout
View Private Key Details
openssl rsa -in private.key -text -noout
openssl rsa -in private.key -modulus -noout
openssl rsa -in private.key -text -noout -passin pass:yourpassword
openssl ec -in private.key -text -noout
openssl rsa -in private.key -check -noout
View CSR Details
openssl req -in request.csr -text -noout
openssl req -in request.csr -subject -noout
openssl req -in request.csr -verify -noout
openssl req -in request.csr -pubkey -noout
SECTION 2: CERTIFICATE VALIDATION COMMANDS
Verify Certificate Chain
openssl verify -CAfile ca.crt certificate.crt
openssl verify -CAfile root-ca.crt -untrusted intermediate.crt server.crt
openssl verify -CAfile root-ca.crt -untrusted bundle.pem server.crt
openssl verify -CAfile ca.crt -CRLfile crl.pem certificate.crt
openssl verify -verbose -CAfile ca.crt certificate.crt
Check Certificate Chain in a Bundle
openssl crl2pkcs7 -nocrl -certfile bundle.pem | openssl pkcs7 -print_certs -noout
openssl crl2pkcs7 -nocrl -certfile bundle.pem | openssl pkcs7 -print_certs -noout | grep -c "subject"
openssl x509 -in bundle.pem -out server.crt
openssl crl2pkcs7 -nocrl -certfile bundle.pem | openssl pkcs7 -print_certs -noout
openssl crl2pkcs7 -nocrl -certfile bundle.pem | openssl pkcs7 -print_certs -noout | grep "subject\|issuer"
Match Private Key with Certificate
openssl x509 -in certificate.crt -modulus -noout | openssl md5
openssl rsa -in private.key -modulus -noout | openssl md5
openssl x509 -in certificate.crt -pubkey -noout | openssl md5
openssl ec -in private.key -pubout -outform pem | openssl md5
SECTION 3: SSL/TLS CONNECTION TESTING
Basic Connection Testing
openssl s_client -connect example.com:443
openssl s_client -connect example.com:443 -showcerts
openssl s_client -connect example.com:443 -showcerts </dev/null
openssl s_client -connect example.com:443 -tls1_3
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_1
openssl s_client -connect example.com:443 -tls1
openssl s_client -connect example.com:443 -cipher ECDHE-RSA-AES256-GCM-SHA384
openssl s_client -connect example.com:443 -servername example.com
openssl s_client -connect example.com:443 -CAfile ca.crt -verify_return_error
openssl s_client -connect example.com:443 -showcerts </dev/null | openssl x509 -out server-cert.crt
openssl s_client -connect example.com:443 -showcerts </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > chain.pem
Advanced Connection Testing
openssl s_client -connect example.com:443 -tls1_3 </dev/null 2>&1 | grep "Protocol"
openssl s_client -connect example.com:443 -tls1_2 </dev/null 2>&1 | grep "Protocol"
openssl s_client -connect example.com:443 -cipher 'ALL:!LOW:!EXP:!aNULL' 2>&1 | grep -E "Cipher|Protocol"
openssl s_client -connect example.com:443 -showcerts -debug </dev/null
openssl s_client -connect example.com:443 -status -ocsp -CAfile ca.crt
openssl s_client -connect example.com:443 -alpn h2
openssl s_client -connect example.com:443 -CAfile /etc/ssl/certs/ca-certificates.crt
openssl s_client -connect smtp.example.com:25 -starttls smtp
openssl s_client -connect pop3.example.com:110 -starttls pop3
openssl s_client -connect imap.example.com:143 -starttls imap
openssl s_client -connect ftp.example.com:21 -starttls ftp
openssl s_client -connect xmpp.example.com:5222 -starttls xmpp
SECTION 4: CERTIFICATE CONVERSION COMMANDS
Convert Between PEM and DER
openssl x509 -in certificate.pem -outform DER -out certificate.der
openssl x509 -in certificate.der -inform DER -outform PEM -out certificate.pem
Convert Between PEM and PKCS12
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile ca-chain.crt
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile ca-chain.crt -passout pass:yourpassword
openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes
openssl pkcs12 -in certificate.pfx -nocerts -out private.key -nodes
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out certificate.crt
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out ca.crt
Convert Between PEM and PKCS7
openssl crl2pkcs7 -nocrl -certfile certificate.pem -out certificate.p7b
openssl pkcs7 -in certificate.p7b -print_certs -out certificate.pem
Convert PEM to Other Formats
openssl pkcs12 -export -in certificate.crt -inkey private.key -out certificate.p12
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore keystore.jks
openssl pkcs12 -export -in certificate.crt -inkey private.key -out certificate.pfx
Combine Certificates
cat certificate.crt private.key > combined.pem
cat server.crt intermediate.crt > fullchain.pem
cat server.crt intermediate.crt root.crt > fullchain-with-root.pem
cat server.crt intermediate.crt root.crt > bundle.pem
SECTION 5: CERTIFICATE GENERATION COMMANDS
Generate Self-Signed Certificate
openssl req -x509 -newkey rsa:4096 -keyout private.key -out certificate.crt -days 365
openssl req -x509 -newkey rsa:4096 -keyout private.key -out certificate.crt -days 365 -subj "/CN=example.com" -nodes
openssl req -x509 -newkey rsa:4096 -keyout private.key -out certificate.crt -days 365 -nodes -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:*.example.com,DNS:localhost"
openssl req -x509 -newkey rsa:4096 -keyout private.key -out certificate.crt -days 365 -nodes -config <(cat <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = example.com
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com
DNS.3 = localhost
EOF
)
openssl ecparam -name prime256v1 -genkey -out private.key
openssl req -x509 -key private.key -out certificate.crt -days 365 -subj "/CN=example.com" -nodes
Generate CSR (Certificate Signing Request)
openssl req -new -newkey rsa:4096 -keyout private.key -out request.csr -nodes
openssl req -new -key private.key -out request.csr
openssl req -new -key private.key -out request.csr -config <(cat <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = example.com
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com
EOF
)
openssl req -new -key private.key -out request.csr -subj "/C=US/ST=California/L=San Francisco/O=My Company/OU=IT/CN=example.com"
Generate Certificate with CA
openssl ca -config openssl.cnf -in request.csr -out certificate.crt -days 365
openssl ca -config openssl.cnf -in request.csr -out certificate.crt -days 365 -extensions v3_req
openssl ca -config openssl.cnf -in request.csr -out certificate.crt -days 365 -batch
Generate Different Key Types
openssl genrsa -out private.key 2048
openssl genrsa -out private.key 4096
openssl genrsa -aes256 -out private.key 4096
openssl ecparam -name prime256v1 -genkey -out private.key
openssl ecparam -name secp384r1 -genkey -out private.key
openssl ecparam -name secp521r1 -genkey -out private.key
openssl dsaparam -genkey 2048 -out private.key
SECTION 6: CERTIFICATE RENEWAL & MANAGEMENT
Certificate Expiry Check
openssl x509 -in certificate.crt -enddate -noout
openssl x509 -in certificate.crt -enddate -noout | cut -d= -f2
openssl x509 -in certificate.crt -checkend 86400 -noout && echo "Valid for at least 24 hours" || echo "Expiring soon or expired"
for cert in *.crt; do echo -n "$cert: "; openssl x509 -in "$cert" -enddate -noout; done
Renew Certificate
openssl req -new -key private.key -out new-request.csr -subj "/CN=example.com"
openssl x509 -x509toreq -in old.crt -signkey private.key -out new.csr
openssl x509 -req -in new.csr -signkey private.key -out new.crt -days 365
Revoke Certificate
openssl ca -config openssl.cnf -gencrl -out crl.pem
openssl ca -config openssl.cnf -revoke certificate.crt
openssl crl -in crl.pem -text -noout
SECTION 7: SSL/TLS SERVER TESTING
Start Test SSL Server
openssl s_server -accept 8443 -cert certificate.crt -key private.key
openssl s_server -accept 8443 -cert fullchain.pem -key private.key
openssl s_server -accept 8443 -cert certificate.crt -key private.key -CAfile ca.crt -verify
openssl s_server -accept 8443 -cert certificate.crt -key private.key -www
openssl s_server -accept 8443 -cert certificate.crt -key private.key -tls1_3
openssl s_server -accept 8443 -cert certificate.crt -key private.key -verify_client_once -CAfile ca.crt
Test SMTP/POP3/IMAP
openssl s_client -connect smtp.example.com:25 -starttls smtp -crlf
openssl s_client -connect pop3.example.com:110 -starttls pop3
openssl s_client -connect imap.example.com:143 -starttls imap
openssl s_client -connect ftp.example.com:990
echo -e "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n" | openssl s_client -connect example.com:443 -quiet
echo -e "HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n" | openssl s_client -connect example.com:443 -quiet 2>/dev/null
SECTION 8: ADVANCED TROUBLESHOOTING
Debug SSL/TLS Issues
openssl s_client -connect example.com:443 -debug
openssl s_client -connect example.com:443 -state -debug
openssl s_client -connect example.com:443 -tlsextdebug
openssl ciphers -v 'ALL:!COMPLEMENTOFDEFAULT'
openssl s_client -connect example.com:443 -cipher 'ECDHE+AESGCM'
for cipher in $(openssl ciphers 'ALL'); do
echo -n "$cipher: "
openssl s_client -connect example.com:443 -cipher "$cipher" -tlsextdebug 2>&1 | grep -q "Cipher is" && echo "Supported" || echo "Not supported"
done
Check Certificate Chain Issues
openssl s_client -connect example.com:443 -showcerts 2>/dev/null | grep -c "BEGIN CERTIFICATE"
openssl s_client -connect example.com:443 -showcerts 2>/dev/null | awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' | csplit -sz -f cert- - '/END CERTIFICATE/+1' {*}
openssl s_client -connect example.com:443 -CApath /etc/ssl/certs/
openssl s_client -connect example.com:443 -CAfile root-ca.crt
Check Certificate Transparency Logs
openssl s_client -connect example.com:443 -status 2>&1 | grep -A5 "OCSP Response"
openssl x509 -in certificate.crt -text -noout | grep -A5 "Signed Certificate Timestamp"
SECTION 9: FILE FORMAT COMMANDS
Check File Formats
grep -q "BEGIN CERTIFICATE" file.crt && echo "PEM format" || echo "Not PEM"
file certificate.der | grep -q "DER" && echo "DER format" || echo "Not DER"
file certificate.pfx | grep -q "PKCS" && echo "PKCS12 format" || echo "Not PKCS12"
file certificate.p7b | grep -q "PKCS" && echo "PKCS7 format" || echo "Not PKCS7"
Convert Between Text and Binary
openssl x509 -in certificate.crt -outform DER | xxd -p
echo "hexstring" | xxd -r -p | openssl x509 -inform DER -outform PEM
SECTION 10: CRYPTO OPERATIONS
Hash and Digest Operations
openssl x509 -in certificate.crt -hash -noout
openssl x509 -in certificate.crt -hash -noout && echo ".0"
ln -s certificate.crt $(openssl x509 -in certificate.crt -hash -noout).0
openssl x509 -in certificate.crt -fingerprint -sha256 -noout | sed 's/.*=//g' | tr -d ':'
openssl x509 -in certificate.crt -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
Encryption and Decryption
openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.enc
openssl rsautl -decrypt -inkey private.key -in file.enc -out file.txt
openssl dgst -sha256 -sign private.key -out file.sig file.txt
openssl dgst -sha256 -verify public.pem -signature file.sig file.txt
Random Data Generation
openssl rand -out random.bin 1024
openssl rand -base64 32
openssl rand -hex 16
SECTION 11: NGINX & APACHE SPECIFIC COMMANDS
Nginx SSL Commands
nginx -t
nginx -t -c /etc/nginx/nginx.conf
openssl s_client -connect localhost:443 -session-id 123 2>&1 | grep -i "session-id"
openssl dhparam -out dhparam.pem 2048
openssl dhparam -out dhparam.pem 4096
Apache SSL Commands
apachectl configtest
httpd -t -D DUMP_SSL_CERTS
httpd -t -D DUMP_MODULES | grep ssl
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
SECTION 12: PERL ONE-LINERS FOR SSL
perl -MIO::Socket::SSL -e 'print IO::Socket::SSL->new("example.com:443")->peer_certificate->expires, "\n"'
perl -MIO::Socket::SSL -e 'my $s=IO::Socket::SSL->new("example.com:443"); print $s->peer_certificate->verify_hostname("example.com", "ssl") ? "Valid" : "Invalid"'
perl -MIO::Socket::SSL -e 'print IO::Socket::SSL->new("example.com:443")->peer_certificate->issuer, "\n"'
SECTION 13: BASH SCRIPTS FOR SSL MONITORING
Certificate Expiry Monitor Script
#!/bin/bash
domains=("example.com" "google.com" "github.com")
for domain in "${domains[@]}"; do
expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
expiry_seconds=$(date -d "$expiry" +%s)
current_seconds=$(date +%s)
days_left=$(( (expiry_seconds - current_seconds) / 86400 ))
echo "$domain: $days_left days remaining"
done
Download Certificate Chain Script
#!/bin/bash
domain=$1
if [ -z "$domain" ]; then
echo "Usage: $0 domain.com"
exit 1
fi
openssl s_client -connect "$domain:443" -showcerts </dev/null 2>/dev/null | \
awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' | \
csplit -sz -f "$domain-cert-" - '/END CERTIFICATE/+1' {*}
echo "Certificates saved as ${domain}-cert-00, ${domain}-cert-01, ..."
SSL Checker for Multiple Ports
#!/bin/bash
ports=(443 8443 465 993 995)
for port in "${ports[@]}"; do
echo "Testing port $port..."
echo | openssl s_client -connect localhost:"$port" -servername localhost 2>/dev/null | \
grep -E "Protocol|Cipher|Verify" | head -3
echo "---"
done
SECTION 14: QUICK REFERENCES
Common OpenSSL Commands Cheat Sheet
alias certinfo='openssl x509 -in certificate.crt -text -noout'
alias csrinfo='openssl req -in request.csr -text -noout'
alias keyinfo='openssl rsa -in private.key -text -noout'
alias ssltest='openssl s_client -connect example.com:443 -showcerts'
alias checkexpiry='openssl x509 -in certificate.crt -enddate -noout'
alias certfp='openssl x509 -in certificate.crt -fingerprint -sha256 -noout'
Common Certificate Paths
ls /etc/ssl/certs/
ls /usr/share/ca-certificates/
ls /usr/local/share/ca-certificates/
sudo update-ca-certificates
ls /etc/nginx/ssl/
ls /etc/nginx/conf.d/
ls /etc/apache2/ssl/
ls /etc/httpd/conf.d/ssl.conf
Useful Environment Variables
export OPENSSL_CONF=/etc/ssl/openssl.cnf
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
export SSL_CERT_DIR=/etc/ssl/certs/
SECTION 15: TESTING COMMANDS FOR COMMON SCENARIOS
Test Common SSL Issues
openssl s_client -connect example.com:443 -tlsextdebug 2>&1 | grep -i heartbeat
openssl s_client -connect example.com:443 -ssl3 2>&1 | grep -i error
openssl s_client -connect example.com:443 -cipher RSA -tls1_2
openssl s_client -connect example.com:443 -cipher ECDHE+AES
openssl s_client -connect example.com:443 -compression
Test SSL/TLS Performance
time openssl s_client -connect example.com:443 -no_ign_eof </dev/null 2>&1 >/dev/null
for i in {1..10}; do
time openssl s_client -connect example.com:443 -no_ign_eof </dev/null 2>&1 >/dev/null
done
for tls in tls1 tls1_1 tls1_2 tls1_3; do
echo -n "$tls: "
openssl s_client -connect example.com:443 -${tls} </dev/null 2>&1 | grep -q "Protocol" && echo "Supported" || echo "Not supported"
done