你遇到的“证书链不完整”问题,通常是因为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

        ```