Apache 部署 SSL
以下以 Apache HTTP Server 2.4 为例。先确认使用发行版软件包还是源码安装,两者的模块管理、配置目录和服务名称不同。
开启 mod_ssl 并加载配置
Debian / Ubuntu 的软件包安装通常使用:
sudo a2enmod ssl
源码安装则检查 httpd.conf 中是否已加载模块,需要时启用对应行,不要重复加载:
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
如果通过 conf.d 目录加载配置,指令应写成:
IncludeOptional conf.d/*.conf
这里的相对路径基于 ServerRoot,并且目录需要真实存在。原文的 includeOptionalconf.d/*.conf 缺少指令与参数之间的空格,不能使用。
准备证书与私钥
将证书放到服务配置引用的路径,例如 /etc/ssl/example/fullchain.pem 与 /etc/ssl/example/privkey.pem。私钥不放在网站公开目录内。
fullchain.pem 应包含站点证书及中间证书,按站点证书在前的顺序排列;私钥是另一个文件。Apache 2.4.8 起可由 SSLCertificateFile 加载中间证书,不需要再使用旧的 SSLCertificateChainFile。证书链文件也不是私钥。
HTTPS 虚拟主机
下面示例需要已有对应目录、文件、访问权限和有效证书。将域名和路径改成实际值,确认全局已监听 443;已有 Listen 443 时不要重复添加。
Listen 443
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot "/var/www/example/public"
SSLEngine on
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCertificateFile "/etc/ssl/example/fullchain.pem"
SSLCertificateKeyFile "/etc/ssl/example/privkey.pem"
<Directory "/var/www/example/public">
Require all granted
</Directory>
</VirtualHost>
TLSv1.3 要求 Apache 所链接的 OpenSSL 支持它(OpenSSL 1.1.1 起)。旧环境不能直接套用;先核对实际版本。其他 TLS 参数按所用版本及系统策略配置,不继续复制原文含 RC4 / MEDIUM 的旧套件列表。
一个证书可以覆盖多个域名,但必须在证书的 SAN 中列出或匹配相应域名;不同网站的 SNI 虚拟主机仍应分别配置 ServerName、站点目录及适用证书。
检查后再重载
Debian / Ubuntu:
sudo apache2ctl configtest
sudo apache2ctl -S
仅在检查通过后执行:
sudo systemctl reload apache2
源码安装则使用该安装目录的 apachectl,例如:
sudo /usr/local/httpd/bin/apachectl -t
sudo /usr/local/httpd/bin/apachectl -S
通过后使用同一个安装实例的管理方式重载;不要将源码安装与系统 httpd / apache2 服务混用。随后从客户端验证证书、域名和响应,不能仅凭配置语法通过就认定公网 HTTPS 正常。
HTTP 请求跳转 HTTPS
在已监听 80 的配置中添加对应虚拟主机,使用固定的目标域名:
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost>
这个写法使用 mod_alias,不依赖 mod_rewrite。站点若通过 HTTP-01 续期证书,还要确认验证路径与证书工具的工作方式兼容。
评论将在接近此处时加载,也可点击立即加载。