Ubuntu系统Apache 2部署SSL证书完整教程
最近给一个客户部署SSL证书,服务器是Ubuntu系统跑Apache 2,整个过程比想象中简单,把实操步骤记录下来分享给有需要的朋友。
前期准备
开始之前需要准备好这些:
- •服务器系统:Ubuntu 20.04 或 22.04 LTS
- •Web服务:Apache 2.4 及以上版本
- •已申请的SSL证书:包括证书文件(.crt或.pem)和私钥文件(.key)
- •域名已解析到服务器IP
- •sudo权限的账号
如果你还没申请证书,可以去 sslmianfei.com 免费申请一张,支持单域名、通配符和IP证书,不用注册直接用。
第一步:启用Apache SSL模块
Ubuntu默认安装Apache时不会开启SSL模块,需要手动启用:
sudo a2enmod ssl
sudo a2enmod headers
sudo systemctl restart apache2
headers模块后面配置HSTS的时候会用到,建议一起开启。
第二步:上传证书文件
把申请好的证书文件放到服务器上,建议放在专门的目录:
sudo mkdir -p /etc/apache2/ssl/
sudo cp your_domain.crt /etc/apache2/ssl/
sudo cp your_domain.key /etc/apache2/ssl/
# 如果CA颁发机构提供了中间证书,也要上传
sudo cp ca_bundle.crt /etc/apache2/ssl/
权限设置很重要,私钥文件权限要收紧:
sudo chown root:root /etc/apache2/ssl/your_domain.key
sudo chmod 600 /etc/apache2/ssl/your_domain.key
sudo chmod 644 /etc/apache2/ssl/your_domain.crt
第三步:合并证书链
很多朋友部署完后浏览器报”证书不受信任”,90%是证书链没合并。把你的域名证书和CA中间证书合并成一个文件:
cat your_domain.crt ca_bundle.crt > fullchain.crt
sudo mv fullchain.crt /etc/apache2/ssl/
注意顺序:域名证书在前,中间证书在后,不能反过来。
第四步:配置虚拟主机
Apache 2.4默认的SSL配置文件在 /etc/apache2/sites-available/default-ssl.conf,但建议为每个域名单独建配置:
sudo nano /etc/apache2/sites-available/your_domain-ssl.conf
配置内容:
<VirtualHost *:443>
ServerName your_domain.com
ServerAlias www.your_domain.com
DocumentRoot /var/www/your_domain
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/fullchain.crt
SSLCertificateKeyFile /etc/apache2/ssl/your_domain.key
# 优化SSL配置
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
SSLCompression off
# HSTS头
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# HTTP/2支持(可选)
Protocols h2 http/1.1
# 日志
ErrorLog ${APACHE_LOG_DIR}/your_domain_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/your_domain_ssl_access.log combined
</VirtualHost>
第五步:启用站点配置
sudo a2ensite your_domain-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
如果 configtest 输出 Syntax OK 就说明配置没问题。
第六步:HTTP强制跳转HTTPS
光配好HTTPS还不够,要把所有HTTP请求跳转到HTTPS。编辑80端口的虚拟主机配置:
sudo nano /etc/apache2/sites-available/your_domain.conf
添加跳转规则:
<VirtualHost *:80>
ServerName your_domain.com
ServerAlias www.your_domain.com
Redirect permanent / https://your_domain.com/
</VirtualHost>
重载配置生效:
sudo a2ensite your_domain.conf
sudo systemctl reload apache2
验证部署
打开浏览器访问 https://your_domain.com,地址栏应该出现小绿锁。如果想更深入检测,可以用 SSL证书测试工具 检查证书链、安全头部配置是否完整。
常见问题排查
证书不受信任:检查证书链是否合并,fullchain.crt里域名证书在前
私钥不匹配:用下面命令对比证书和私钥的modulus是否一致
openssl x509 -noout -modulus -in your_domain.crt | openssl md5
openssl rsa -noout -modulus -in your_domain.key | openssl md5
两个md5值相同说明匹配。
端口443未开放:检查防火墙
sudo ufw allow 443/tcp
sudo ufw status
Apache启动失败:看错误日志定位
sudo tail -50 /var/log/apache2/error.log
最后
整个过程下来其实就几步:开模块、放证书、配虚拟主机、跳转、验证。最容易踩坑的就是证书链合并和权限设置,这两点搞定了基本就稳了。如果你用的是Nginx而不是Apache,思路是类似的,只是配置语法不同。
希望这篇实操笔记能帮到正在折腾SSL部署的朋友,有问题欢迎留言交流。