你遇到的“证书链不完整”问题,通常是因为Nginx的证书文件里只包含了你的网站证书,缺少了作为“信任桥梁”的中间证书。
Nginx本身不支持通过多个指令分别加载证书链中的不同证书,它要求所有证书必须按顺序合并到一个文件中。所以问题的核心就是手动合并证书。
一、修复步骤
1. 准备证书文件:确认你手上有这两个文件:
站点证书:你的域名证书,通常是 `your_domain.crt` 或 `cert.pem`。
中间证书:CA机构提供的证书包,通常是 `intermediate.crt` 或 `ca-bundle.crt`。
私钥文件:`your_domain.key` 或 `privkey.pem`,这个不要合并。
2. 合并证书文件:使用 `cat` 命令将站点证书和中间证书按顺序合并成一个新文件。站点证书必须在最前面。
```bash
# 假设站点证书是 your_domain.crt,中间证书是 intermediate.crt
cat your_domain.crt intermediate.crt > fullchain.pem
```
注意:请勿将根证书(Root CA)也合并进去,只合并中间证书即可。合并后建议将 `fullchain.pem` 放到一个安全目录,如 `/etc/nginx/ssl/`。
3. 配置Nginx:修改Nginx配置文件(如 `/etc/nginx/sites-available/your_domain`),让 `ssl_certificate` 指向你刚合并好的 `fullchain.pem` 文件。
```nginx
server {
listen 443 ssl;
server_name your_domain.com;
# 指向合并后的完整证书链文件
ssl_certificate /etc/nginx/ssl/fullchain.pem;
# 指向你的私钥文件
ssl_certificate_key /etc/nginx/ssl/your_domain.key;
# 其他配置...
}
```
4. 测试并重载配置:
先测试配置文件语法是否正确:
```bash
sudo nginx -t
```
如果测试通过,重新加载Nginx使配置生效:
```bash
sudo systemctl reload nginx
```
二、验证与额外排查
验证证书:配置完成后,可以使用 [SSL Labs](https://www.ssllabs.com/ssltest/) 等在线工具检测你的网站,看证书链是否已完整。
检查文件权限:确保Nginx进程(通常是`www-data`用户)有权限读取证书和私钥文件。
```bash
# 示例:设置私钥文件权限
sudo chmod 600 /etc/nginx/ssl/your_domain.key
```
检查证书和私钥是否匹配:可以用以下命令验证,确保两个命令输出的MD5值一致。
```bash
openssl x509 -noout -modulus -in your_domain.crt | openssl md5
openssl rsa -noout -modulus -in your_domain.key | openssl md5
```