# Apache SSL 配置生成器（mod_ssl、TLS 1.3）

> 生成安全的 Apache httpd mod_ssl 配置：TLS 1.2/1.3、现代密码套件、HSTS、HTTP 跳转 HTTPS 和 http2，附版本要求和测试命令。

Source: https://ssl.sh/zh/tools/tls-config-generator/apache/
Last updated: 2026-11-10

为 Apache httpd 生成带 TLS 1.2/1.3、HSTS 和 HTTPS 跳转的 mod_ssl 配置，并列出需要的模块和版本。

[TLS 配置生成器](https://ssl.sh/zh/tools/tls-config-generator/)的 Apache 预设生成 Apache httpd 的 mod_ssl 配置。选好档位和选项，把结果复制到站点配置（比如 `/etc/apache2/sites-available/example.com-ssl.conf` 或 `/etc/httpd/conf.d/ssl.conf`），用 `apachectl configtest` 测试后重载。

## 示例：中级档

```apache
<VirtualHost *:80>
    ServerName example.com
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile      /etc/ssl/example.com/fullchain.pem
    SSLCertificateKeyFile   /etc/ssl/example.com/privkey.pem
    Protocols h2 http/1.1
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
</VirtualHost>

# 全局设置（VirtualHost 之外）
SSLProtocol             -all +TLSv1.2 +TLSv1.3
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
SSLOpenSSLConfCmd       Curves X25519:prime256v1:secp384r1
SSLHonorCipherOrder     off
SSLSessionTickets       off
```

## 国内环境说明

- 阿里云、腾讯云下载的 Apache 证书包通常有三个文件：站点证书、证书链（chain/root_bundle）和私钥。Apache 2.4.8 及以上可以把站点证书和证书链合并成一个文件给 `SSLCertificateFile`；更老的版本分别写 `SSLCertificateFile` 和 `SSLCertificateChainFile`。
- CentOS 7 自带 Apache 2.4.6 和 OpenSSL 1.0.2，不支持 TLS 1.3，也不支持在 `SSLCertificateFile` 里放证书链，需要用 `SSLCertificateChainFile`。

## 版本要求

- **Apache 2.4.37+ 和 OpenSSL 1.1.1+** 才有 TLS 1.3（用 `apachectl -V` 和 `openssl version` 查看）。
- **mod_http2** 才能用 `Protocols h2 http/1.1`，没有就删掉这一行。
- **X25519MLKEM768**：httpd 链接 OpenSSL 3.5+ 时，把 Curves 那一行换成 `SSLOpenSSLConfCmd Groups X25519MLKEM768:X25519:prime256v1:secp384r1`。

## 测试并重载

```bash
sudo apachectl configtest && sudo systemctl reload apache2   # CentOS/Rocky 上是 httpd
```

## 常见错误

- **SSLProtocol 写了好几处**：发行版的 `ssl.conf`、certbot 写的 `options-ssl-apache.conf` 里都可能有，最后读到的生效。用 `grep -ri sslprotocol /etc/apache2 /etc/httpd` 找出来。
- **HSTS 头没出来**：没启用 `mod_headers`，或者只写在了 80 端口的 VirtualHost 里。
- **证书链文件过期**：续期后 `SSLCertificateChainFile` 还指向旧的中间证书。改用 `SSLCertificateFile` 放完整证书链。


## FAQ

**需要哪些模块？**

mod_ssl 提供 TLS，mod_headers 加 HSTS 头，mod_rewrite 做跳转，mod_http2 提供 HTTP/2。Debian/Ubuntu 用 a2enmod ssl headers rewrite http2 启用；CentOS/Rocky 装 mod_ssl 包即可。

**各个指令放在哪里？**

证书文件、ServerName、HSTS 头放在 <VirtualHost *:443> 里；SSLProtocol、SSLCipherSuite、SSLHonorCipherOrder、SSLSessionTickets 可以放在全局（VirtualHost 之外），所有站点共用；SSLStaplingCache 必须放在全局。

**提示 Invalid command 'SSLOpenSSLConfCmd' 怎么办？**

只有 mod_ssl 基于 OpenSSL 1.0.2 及以上编译时才有这条指令，基于 LibreSSL 或老版 OpenSSL 的构建没有。删掉这一行，或者升级。
