--- title: "Apache 配置 SSL 证书" tags: ['Apache', 'SSL'] published: 2022-02-03 20:15:32 updated: 2022-02-03 00:00:00 excerpt: "本文将介绍购买 SSL 证书并在 Apache 2 配置的姿势。" --- > 本文件是烧饼博客文章的 Markdown 原文,正式版本见 https://u.sb/apache-ssl/ > 全站文章与页面索引见 https://u.sb/llms.txt,建议先读索引再继续抓取。 本文将介绍购买 SSL 证书并在 Apache 2 配置的姿势。 以下操作需要 root 权限,本文命令均已带上 `sudo` 前缀,请确保当前用户拥有 `sudo` 权限;或者直接使用 root 用户操作并省略命令中的 `sudo`。 ## 购买证书并拿到所有文件 这里的步骤和 [Nginx 配置 SSL 证书](/nginx-ssl/)的步骤一样,只是把证书放在了一个新的目录下,比如我们可以新建一个文件夹 `/etc/apache2/ssl` 然后把文件都丢进去。 其中 `dhparam` 需要和证书文件放一起,可以使用命令: ```bash curl https://ssl-config.mozilla.org/ffdhe2048.txt | sudo tee -a /etc/apache2/ssl/example_com.chain.crt ``` *注意 `tee -a` 的 `-a` 参数代表追加写入,即把 `dhparam` 内容合并到证书链文件末尾* 我们最终得到如下文件: | 文件名 | 用途 | | --------------------- | --------------------------------------------- | | /etc/apache2/ssl/example_com.key | 本地或者服务器上使用 OpenSSL 生出来的证书私钥 | | /etc/apache2/ssl/example_com.crt | 服务商给你的证书公钥,没用了,可以丢了 | | /etc/apache2/ssl/example_com.chain.crt | 这个才是完整证书链 | | /etc/apache2/ssl/example_com.ca.crt | CA 根证书 | ## 配置 Apache SSL 证书开启 HTTPS 同样我们参考 Mozilla 的 [SSL 配置生成器](https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.1.1k&guideline=5.6)。 把所有 HTTP 请求跳转 HTTPS ```apache RewriteEngine On RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/ RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] ``` 然后使用现代化的 SSL 配置,开启 HTTP/2、OCSP、TLS 1.3 和 HSTS 我们以 `example.com` 为例,网站目录位于 `/var/www/example.com` ```apache ServerName example.com DocumentRoot /var/www/example.com DirectoryIndex index.html ErrorLog ${APACHE_LOG_DIR}/example.com.error.log CustomLog ${APACHE_LOG_DIR}/example.com.access.log combined Options FollowSymLinks AllowOverride All Require all granted SSLEngine on SSLCertificateFile /etc/apache2/ssl/example_com.chain.crt SSLCertificateKeyFile /etc/apache2/ssl/example.com.key Protocols h2 http/1.1 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header always set X-Frame-Options SAMEORIGIN Header always set X-Content-Type-Options nosniff Header set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy strict-origin-when-cross-origin # intermediate configuration SSLProtocol all -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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder off SSLSessionTickets off SSLUseStapling On SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" ``` 接着检查配置并重启 Apache 2 ```bash sudo apache2ctl configtest sudo systemctl restart apache2 ``` 最终你就可以在浏览器打开 `https://example.com/` 查看是否生效了。