首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PKI 加密解密 OpenSSL 實操指南:Windows/Linux 金鑰生成與驗證

     編輯:PHP 相關知識

OpenSSL 安裝與環境準備

Windows

  1. 下載 Win32/Win64 OpenSSL (建議 Light 版)
  2. 安裝至預設路徑 (如 C:\Program Files\OpenSSL-Win64)
  3. 將 bin 目錄加入系統環境變數 PATH
  4. 驗證: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
生成 CSRopenssl 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 保護私鑰不落地
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved