企業內部測試環境或私有服務常需自簽憑證。本文記錄使用 OpenSSL 建立私有 CA、產生伺服器金鑰與 CSR、CA 簽署憑證的標準流程,適用於 HTTPS、LDAPS、VPN 等場景。
CA 根目錄:/etc/pki/CA
├── private/cakey.pem # CA 私鑰
├── cacert.pem # CA 自簽憑證
├── certs/ # 已簽發憑證備份
├── newcerts/ # 簽發流程暫存
├── crl/ # 撤銷清單
├── index.txt # 簽發索引
└── serial # 序號檔
編輯 /etc/pki/tls/openssl.cnf,[ CA_default ] 區段指向上述目錄:
dir = /etc/pki/CA
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
cd /etc/pki/CA
# 產生 2048-bit RSA 私鑰,權限 0600
(umask 077; openssl genrsa 2048 > private/cakey.pem)
# 自簽 CA 憑證,有效期 10 年(3655 天)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
# 依提示填寫 Country、Organization、Common Name (CA 名稱) 等
mkdir -p certs newcerts crl
touch index.txt serial
echo 01 > serial
於應用伺服器(如 HTTPD)執行:
# 產生 2048-bit 私鑰(生產環境建議 4096)
openssl genrsa 2048 > httpd.key
# 產生 CSR,含公鑰與主體資訊
openssl req -new -key httpd.key -out httpd.csr
# Common Name 必須填寫服務完整網域名(FQDN)
將 httpd.csr 傳至 CA 機器,執行:
openssl ca -in httpd.csr -out httpd.crt -days 365
# 簽署過程會更新 index.txt、serial
簽署完成後,將 httpd.crt、httpd.key 部署至應用伺服器,配置服務啟用 HTTPS。
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"(OpenSSL 1.1.1+)。basicConstraints=critical,CA:TRUE,pathlen:0。openssl ca -revoke certs/xxx.pem 並產生 CRL openssl ca -gencrl -out crl/ca.crl。certbot、cfssl、smallstep 等工具建立 PKI 自動化管線。| 現象 | 原因 | 解決 |
|---|---|---|
簽署報 failed to update database | index.txt 格式錯誤或權限不足 | 確保 index.txt 為空檔、CA 目錄擁有者為 root:root、權限 700 |
| 瀏覽器提示「不受信任」 | 根憑證未匯入信任存儲 | 將 cacert.pem 匯入 OS/瀏覽器信任根憑證清單 |
| Common Name 不符 | CSR 的 CN 與實際訪問網域不同 | 重新產生 CSR,CN 填寫完整 FQDN |
用 Ghost 備份 Linux 分區實戰:支援 ext4/NTFS、網路多機克隆、避坑指南
CentOS 6.x 使用 YUM 安裝 Nginx 環境(官方源、依賴、驗證)
在 Motorola Defy 手機上安裝 Arch Linux ARM 完整教程
Nginx 支援 .htaccess 實現偽靜態:Include 引入機制、Rewrite 規則轉換與生產級避坑
Shell 重定向深度解析:`/dev/null 2>&1` 為什麼這麼寫?
Linux 訊號機制深度解析:32 號以下不可靠 vs 33-64 號可靠訊號、sigaction 實戰與核心處理流程