证书申请

下载与部署

证书签发后可下载 fullchain.pem 与 privkey.pem 两个文件。本文说明两个文件的用途,以及 Nginx、Apache、Caddy、Tomcat 等常见服务器软件的配置方法。

证书签发后,可在申请详情页下载两个文件。

两个文件的用途

文件内容配置项
<域名>.fullchain.pem证书本身与中间证书,按顺序合并证书 / certificate
<域名>.privkey.pem私钥私钥 / certificate key

证书一项必须使用 fullchain.pem。若只配置了不含中间证书的文件,桌面浏览器多数情况下仍可正常访问,而手机 App、curl、Java 客户端会报证书错误——这是最难定位的一类故障。详见证书链缺少中间证书

私钥仅在签发时生成一次,请妥善保管。私钥文件的权限应设置为仅所属用户可读:

chmod 600 privkey.pem

Nginx

nginx.conf
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
}

修改后需检查语法并重载:

nginx -t && nginx -s reload

Apache

httpd.conf / vhost
<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile    /etc/ssl/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/ssl/example.com/privkey.pem
</VirtualHost>

Apache 2.4.8 以下的版本不支持合并文件,需要使用 SSLCertificateChainFile 单独指定中间证书。

修改后需检查语法并重载:

apachectl configtest && apachectl graceful

Caddy

Caddyfile
example.com {
    tls /etc/ssl/example.com/fullchain.pem /etc/ssl/example.com/privkey.pem
}

Caddy 默认会自行申请并续期证书。仅在需要使用本站签发的证书时才需要如上手工指定。

HAProxy

HAProxy 要求证书与私钥位于同一个文件中,且顺序不可颠倒:

cat fullchain.pem privkey.pem > /etc/ssl/example.com/combined.pem
chmod 600 /etc/ssl/example.com/combined.pem
# haproxy.cfg
# bind :443 ssl crt /etc/ssl/example.com/combined.pem

Tomcat 与其他 Java 服务

Java 使用 keystore 格式,需要先转换。通过 PKCS#12 中转最为稳妥:

openssl pkcs12 -export \
  -in fullchain.pem -inkey privkey.pem \
  -out keystore.p12 -name tomcat

转换时必须使用 fullchain.pem。Java 客户端不会主动补全缺失的中间证书,链不完整会直接导致 PKIX path building failed

IIS 与 Windows

Windows 需要 PFX 格式:

openssl pkcs12 -export \
  -in fullchain.pem -inkey privkey.pem \
  -out example.com.pfx

导入时请将中间证书放入「中间证书颁发机构」存储,而非「受信任的根证书颁发机构」。

CDN 与负载均衡

在 CDN 或负载均衡控制台上传证书时,「证书内容」输入框中同样需要粘贴 fullchain.pem全部内容,即包含证书与中间证书两段,而不是只有第一段。

仅更新源站而遗漏边缘节点,是证书故障最常见的复发方式。若同一域名同时配置在源站与 CDN 上,两处都需要更新。

部署后的验证

部署完成后建议实际验证一次,确认服务器发送的证书链完整:

openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null | grep -c "BEGIN CERTIFICATE"

返回 2 或更大表示链完整;返回 1 表示只发送了证书本身,需要改用 fullchain.pem

也可以使用本站的证书检测,输入域名即可得到完整结论。