nginx仅支持pem格式证书(.crt/.pem)和明文私钥(.key),需用openssl从.pfx/.p12中提取:openssl pkcs12 -in cert.pfx -clcerts -nokeys -out server.crt导出服务器证书,-nocerts -nodes导出明文私钥,再通过-nodes导出full.pem并拆分或直接使用其证书链部分生成fullchain.pem供nginx配置ssl_certificate。

Nginx 只认 PEM 格式的文本证书(.crt 或 .pem)和明文私钥(.key),不支持二进制的 .pfx 或 .p12 文件。所以必须把它们拆开,提取出服务器证书、私钥,必要时还要补全中间证书链。
从 .pfx 或 .p12 提取服务器证书(.crt)
这条命令只导出服务器证书(不含私钥,也不含中间 CA):
openssl pkcs12 -in your-cert.pfx -clcerts -nokeys -out server.crt
-
-clcerts:只提取“客户端或服务器证书”,即你申请的那个域名证书 -
-nokeys:不输出私钥 - 输出的
server.crt是 PEM 格式,内容以-----BEGIN CERTIFICATE-----开头
⚠️ 注意:如果 PFX 里有多个证书(比如带了中间证书),
-clcerts默认只取最上面那个(即叶证书)。完整链需额外处理。
从 .pfx 或 .p12 提取私钥(.key)
openssl pkcs12 -in your-cert.pfx -nocerts -nodes -out server.key
-
-nocerts:跳过所有证书,只输出密钥 -
-nodes:不加密私钥(关键!Nginx 不支持加密的私钥,否则启动会报错SSL_CTX_use_PrivateKey_file failed) - 输出的
server.key是明文 PEM 私钥,开头为-----BEGIN PRIVATE KEY-----或-----BEGIN RSA PRIVATE KEY-----
✅ 检查私钥是否可用:
openssl rsa -check -in server.key,无报错即正常。
补全证书链(生成 fullchain.pem)
很多 CA(如 Let’s Encrypt、Sectigo、DigiCert)签发的证书依赖中间证书才能被浏览器信任。PFX 里通常已包含,但 -clcerts 不会自动导出它们。
推荐做法是先用 -nodes 导出完整 PEM,再手动拆分:
openssl pkcs12 -in your-cert.pfx -out full.pem -nodes
输入密码后,full.pem 会按顺序包含:
- 私钥(
-----BEGIN PRIVATE KEY-----) - 服务器证书(
-----BEGIN CERTIFICATE-----) - 中间证书(可能一个或多个
-----BEGIN CERTIFICATE-----)
然后用文本编辑器或命令拆开:
# 提取第一个证书(服务器证书)
awk '/^-----BEGIN CERTIFICATE-----$/,/^-----END CERTIFICATE-----$/{if(/BEGIN/&&c++); else print}' full.pem > server.crt
# 提取其余证书(中间链)
awk '/^-----BEGIN CERTIFICATE-----$/,/^-----END CERTIFICATE-----$/{if(c++>0) print}' full.pem > chain.pem
# 合并为 fullchain.pem(Nginx 推荐用这个配 ssl_certificate)
cat server.crt chain.pem > fullchain.pem
或者更稳妥地:直接用 full.pem 作为 ssl_certificate,只要它开头是私钥、接着是服务器证书、再是中间证书——Nginx 能识别并跳过私钥部分。
Nginx 配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/fullchain.pem; # 或 server.crt + chain.pem 合并后的文件
ssl_certificate_key /path/to/server.key;
# 其他配置...
}
-
ssl_certificate:建议填fullchain.pem(含服务器证书 + 中间证书),不是纯server.crt -
ssl_certificate_key:必须是明文.key,不能加密,不能是.pfx或.pem里混着私钥
不复杂但容易忽略











