OpenSSL 安裝與環境準備
Windows
- 下載 Win32/Win64 OpenSSL (建議 Light 版)
- 安裝至預設路徑 (如
C:\Program Files\OpenSSL-Win64)
- 將
bin 目錄加入系統環境變數 PATH
- 驗證:
openssl version → OpenSSL 3.0.x
Linux (Ubuntu/Debian/CentOS)
# Ubuntu/Debian
sudo apt update && sudo apt install openssl
# CentOS/RHEL
sudo yum install openssl
# 驗證
openssl version
金鑰對生成完整流程
1. 生成 RSA 私鑰 (2048/4096 位元)
# 無密碼保護 (自動化腳本適用)
openssl genrsa -out private.pem 2048
# 有密碼保護 (人工管理、高安全性)
openssl genrsa -aes256 -out private_enc.pem 2048
# 輸入密碼,確認密碼
2. 從私鑰導出公鑰
openssl rsa -in private.pem -pubout -out public.pem
# 若私鑰有密碼,會提示輸入
3. 查看金鑰詳細資訊
# 私鑰詳細資訊
openssl rsa -in private.pem -text -noout
# 公鑰詳細資訊
openssl rsa -in public.pem -pubin -text -noout
# 輸出模數、指數等 (驗證金鑰對匹配)
openssl rsa -in private.pem -modulus -noout
openssl rsa -in public.pem -pubin -modulus -noout
# 兩者 modulus 應相同
4. 生成 PKCS#8 格式私鑰 (Java/現代系統相容)
# 轉換為 PKCS#8 (無加密)
openssl pkcs8 -topk8 -inform PEM -in private.pem -out private_pkcs8.pem -nocrypt
# PKCS#8 加密
openssl pkcs8 -topk8 -inform PEM -in private.pem -out private_pkcs8_enc.pem -v2 aes256
憑證 (Certificate) 操作
1. 生成 CSR (Certificate Signing Request)
openssl req -new -key private.pem -out request.csr -subj "/C=TW/ST=Taipei/L=Taipei/O=MyOrg/CN=example.com"
2. 自簽憑證 (開發/測試用)
# 有效期 365 天
openssl req -x509 -new -key private.pem -out selfsigned.crt -days 365 -subj "/CN=localhost"
# 或從 CSR 自簽
openssl x509 -req -in request.csr -signkey private.pem -out selfsigned.crt -days 365 -sha256
3. 查看憑證資訊
openssl x509 -in selfsigned.crt -text -noout
openssl x509 -in selfsigned.crt -noout -subject -issuer -dates -fingerprint
4. 憑證格式轉換
# PEM → DER (二進位)
openssl x509 -in cert.pem -outform DER -out cert.der
# PEM → PKCS#12 (.pfx/.p12, 含私鑰+憑證, Windows/IIS/Java 常用)
openssl pkcs12 -export -in cert.pem -inkey private.pem -out cert.pfx -name "mycert"
# 輸入匯出密碼
# PKCS#12 → PEM
openssl pkcs12 -in cert.pfx -out cert.pem -nodes
加密/解密/簽章/驗證 CLI 實操
1. RSA 公鑰加密 / 私鑰解密
# 加密 (資料長度限制:2048-bit 金鑰最多 245 bytes)
echo "secret data" | openssl pkeyutl -encrypt -pubin -inkey public.pem -out encrypted.bin
# 解密
openssl pkeyutl -decrypt -inkey private.pem -in encrypted.bin
2. RSA 私鑰簽名 / 公鑰驗證
# 簽名 (SHA256)
openssl dgst -sha256 -sign private.pem -out signature.bin data.txt
# 驗證
openssl dgst -sha256 -verify public.pem -signature signature.bin data.txt
# Verified OK / Verification Failure
3. AES-256-CBC 對稱加密 (大檔案適用)
# 加密 (互動式輸入密碼)
openssl enc -aes-256-cbc -salt -in large_file.zip -out large_file.enc
# 解密
openssl enc -d -aes-256-cbc -in large_file.enc -out large_file.zip
# 指定密碼 (腳本用)
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc -pass pass:MySecretPassword
openssl enc -d -aes-256-cbc -in file.enc -out file.txt -pass pass:MySecretPassword
4. Base64 編碼/解碼 (傳輸二進位資料)
# 編碼
openssl base64 -in binary.bin -out binary.b64
# 解碼
openssl base64 -d -in binary.b64 -out binary.bin
# 管道操作
echo "data" | openssl base64
echo "ZGF0YQ==" | openssl base64 -d
SSL/TLS 連線測試
1. 啟動測試 HTTPS 伺服器
# 需有私鑰+憑證
openssl s_server -key private.pem -cert cert.pem -accept 4433 -www
# -www: 回傳 HTML 狀態頁
2. 客戶端連線測試
# 連線並顯示憑證鏈
openssl s_client -connect example.com:443 -servername example.com
# 顯示完整憑證鏈
openssl s_client -connect example.com:443 -showcerts
# 指定 CA 憑證驗證
openssl s_client -connect example.com:443 -CAfile ca-bundle.crt
# 測試特定協定版本
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
S/MIME 郵件加密/簽名
# 加密郵件 (需收件者公鑰憑證)
openssl smime -encrypt -in mail.txt -out mail.enc -outform DER recipient.crt
# 解密郵件 (需私鑰)
openssl smime -decrypt -in mail.enc -inkey private.pem -out mail.txt
# 簽名郵件
openssl smime -sign -in mail.txt -out mail.signed -signer cert.pem -inkey private.pem
# 驗證簽名
openssl smime -verify -in mail.signed -CAfile ca-bundle.crt -out mail.txt
常用指令速查卡
| 任務 | 指令 |
| 生成 RSA 私鑰 | openssl genrsa -out key.pem 2048 |
| 導出公鑰 | openssl rsa -in key.pem -pubout -out pub.pem |
| 生成 CSR | openssl req -new -key key.pem -out csr.pem |
| 自簽憑證 | openssl req -x509 -new -key key.pem -out cert.pem -days 365 |
| RSA 加密 | openssl pkeyutl -encrypt -pubin -inkey pub.pem -in data -out enc |
| RSA 解密 | openssl pkeyutl -decrypt -inkey key.pem -in enc |
| 簽名 | openssl dgst -sha256 -sign key.pem -out sig data |
| 驗證 | openssl dgst -sha256 -verify pub.pem -signature sig data |
| AES 加密 | openssl enc -aes-256-cbc -salt -in file -out enc |
| AES 解密 | openssl enc -d -aes-256-cbc -in enc -out file |
| Base64 編碼 | openssl base64 -in bin -out b64 |
| SSL 客戶端測試 | openssl s_client -connect host:443 |
| SSL 伺服器測試 | openssl s_server -key key.pem -cert cert.pem -accept 4433 |
金鑰管理最佳實踐
- 🔐 私鑰檔案權限 0600:
chmod 600 private.pem
- 🔐 私鑰加密儲存:生產環境私鑰必須加密 (AES-256),使用 PKCS#8 格式
- 🔐 分離儲存:私鑰與憑證/公鑰分開儲存,不同權限控管
- 🔐 定期輪換:建議每年輪換金鑰對,同步更新憑證
- 🔐 備份與災備:加密備份私鑰至異地離線儲存
- 🔐 硬體安全模組 (HSM):高價值系統使用 HSM 保護私鑰不落地