Apache 装 SSL 证书这事,安装说穿了就是安装把两个文件塞到服务器上,再改几行配置。安装但真动手的安装时候,坑比想象的安装多。上周帮朋友处理一个老项目的安装证书续期,折腾了半小时才搞定,安装原因是安装他把中间证书和根证书的顺序搞反了。所以这篇文章不讲理论,安装直接说怎么干。安装
先拿到该拿的安装文件
不管你是从阿里云、腾讯云还是安装 Let's Encrypt 签的证书,最后到手的安装一般是这几个东西:一个 .crt 或 .pem 结尾的证书文件,一个 .key 结尾的安装私钥文件,还有一个叫 chain.crt 或者 ca_bundle.crt 的安装中间证书链。有些服务商图省事,直接给你一个合并好的 fullchain 文件,那最省心。
关键点:Apache 需要的是证书 + 中间链拼在一起的完整链文件。如果你只填了域名证书,浏览器大概率会报“证书链不完整”,尤其安卓端和某些老版本浏览器。
拼的方法很简单,用 cat 命令就行:
cat your_domain.crt chain.crt > fullchain.pem 顺序别搞反,域名证书在前,中间证书在后。反过来 Apache 启动直接报错,日志里会说 key values mismatch 之类的话。
确认 Apache 加载了 SSL 模块
不是所有 Apache 默认都开了 mod_ssl。Debian/Ubuntu 上跑一句:
a2enmod ssl CentOS 或 RHEL 系的话,检查 /etc/httpd/conf.modules.d/ 下面有没有 00-ssl.conf,或者直接看 httpd -M | grep ssl 有没有输出。没有的话,装 mod_ssl 包就行。
改配置文件,别乱改
把 fullchain.pem 和私钥传到服务器上,建议放 /etc/ssl/ 或者 /etc/pki/tls/ 下面,权限设成 600,属主是 root。私钥文件千万别给 644,那等于把钥匙挂门上。
找到 VirtualHost 配置段。一般在你站点的配置文件里,比如 /etc/apache2/sites-available/your-site.conf 或者 /etc/httpd/conf.d/ssl.conf。加这么一段:
<VirtualHost *:443> ServerName example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/ssl/fullchain.pem SSLCertificateKeyFile /etc/ssl/private.key <Directory /var/www/html> AllowOverride All Require all granted </Directory> </VirtualHost> 注意:SSLCertificateFile 指向的是拼好的 fullchain,不是单独的域名证书。SSLCertificateKeyFile 指向私钥。老版本 Apache 可能还需要 SSLCertificateChainFile,但 2.4.8 以后这个指令已经废弃了,链直接拼进 cert 文件就行。
重启之前先做语法检查
直接重启 Apache 是个坏习惯。先跑:
apachectl configtest 或者 httpd -t。返回 Syntax OK 再重启,不然服务挂了还得去翻日志。重启命令:
systemctl restart apache2 # 或 systemctl restart httpd 验证到底成没成
浏览器打开 https://你的域名,看锁头图标。但更靠谱的是用命令行:
openssl s_client -connect example.com:443 -servername example.com 看返回的证书链里有没有你的域名证书和中间证书。如果只显示一个,说明链没拼对。另外可以用 curl -I https://example.com 看响应头,正常应该返回 200 或 301。
还有个常见坑:如果服务器前面挂了 CDN 或者负载均衡,证书得在那一层也配一遍。只改源站 Apache 没用,用户访问的还是 CDN 上的旧证书。
顺手把 HTTP 跳转做了
证书装完,用户用 http 访问还是明文。加个 301 跳转:
<VirtualHost *:80> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost> 别用 RewriteRule 绕一圈,Redirect 指令更干净,性能也好一点。
最后提一句:Let's Encrypt 的证书 90 天就过期,记得配自动续期。用 certbot 的话,它会自己改 Apache 配置,但续期后要 reload 才生效。在 crontab 里加个 certbot renew --quiet && systemctl reload apache2,省得三个月后又被叫去救火。


相关文章




精彩导读
热门资讯
关注我们