在 Apache HTTP Server 上部署 SSL/TLS 證書,實現 HTTPS 加密訪問。涵蓋證書文件部署、VirtualHost 配置、配置測試、服務重啟、故障排查、PCI 合規加固全流程。
your_domain.crt (或 .pem)DigiCertCA.crt (或 ca-bundle.crt)your_domain.key (CSR 生成時產生,嚴禁洩露)/etc/ssl/certs/ (證書)、/etc/ssl/private/ (私鑰)chmod 600 /etc/ssl/private/your_domain.key、chown root:root 所有文件| 發行版/安裝方式 | 主配置文件 | VirtualHost 典型位置 |
|---|---|---|
| RHEL/CentOS/Fedora (yum/httpd) | /etc/httpd/conf/httpd.conf | /etc/httpd/conf.d/ssl.conf 或 vhost 文件 |
| Debian/Ubuntu (apt/apache2) | /etc/apache2/apache2.conf | /etc/apache2/sites-available/default-ssl.conf |
| 源碼編譯默認 | /usr/local/apache2/conf/httpd.conf | httpd.conf 末尾或 extra/httpd-ssl.conf |
搜索關鍵字 <VirtualHost 定位現有站點配置塊。
複製現有 HTTP VirtualHost 為新塊,修改端口為 443 並添加 SSL 指令:
<VirtualHost *:80>
ServerName www.yourdomain.com
DocumentRoot /var/www/html
# 可選:重定向所有 HTTP 到 HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName www.yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/your_domain.crt
SSLCertificateKeyFile /etc/ssl/private/your_domain.key
SSLCertificateChainFile /etc/ssl/certs/DigiCertCA.crt
# 安全加固 (推薦)
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>
直接修改現有 VirtualHost 端口為 443 並添加上述 SSL 指令,刪除 80 端口配置。
| 指令 | 指向文件 | 說明 |
|---|---|---|
SSLCertificateFile | 服務器證書 (your_domain.crt) | 必須 |
SSLCertificateKeyFile | 私鑰 (your_domain.key) | 必須 |
SSLCertificateChainFile | 中間 CA 鏈 (DigiCertCA.crt) | 推薦 (避免瀏覽器信任鏈不全) |
SSLCACertificateFile | 客戶端 CA 證書 (雙向認證時) | 可選 |
# 語法檢查 (關鍵步驟,防止配置錯誤導致服務無法啟動)
apachectl configtest
# 或
httpd -t
# 或 (Debian/Ubuntu)
apache2ctl configtest
# 重啟服務
apachectl restart
# 或
systemctl restart httpd
# 或
service apache2 restart
舊版本提示:Apache 2.2 早期版本使用apachectl startssl啟用 SSL,現代版本 (2.4+) 已廢棄,統一使用apachectl start/restart,SSL 由配置文件SSLEngine on控制。
openssl s_client -connect www.yourdomain.com:443 -servername www.yourdomain.com
curl -Iv https://www.yourdomain.com
SSLCertificateFile: file does not exist → 路徑/權限錯誤Private key does not match certificate → 證書與私鑰不匹配 (重新生成 CSR/私鑰)unable to get local issuer certificate → 缺少 SSLCertificateChainFile 或鏈不全在 VirtualHost 或全局 ssl.conf 添加:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!RC4:!DH:!ECDH
SSLHonorCipherOrder on
SSLCompression off
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
# PFX → PEM (私鑰+證書+鏈)
openssl pkcs12 -in cert.pfx -out cert.pem -nodes
# 提取私鑰
openssl pkcs12 -in cert.pfx -nocerts -out key.pem -nodes
# 提取證書
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.crt
現代最佳實踐:使用 Let's Encrypt 免費證書 + Certbot 自動續期 (certbot --apache),啟用 HTTP/2 (Protocols h2 http/1.1)、OCSP Stapling (SSLUseStapling on)、HSTS Preload 列表提交。