SSL证书链如何导入?怎么校验证书链是否完整?
简单来说,SSL证书链(Certificate Chain)是一条从你的“服务器证书”一直追溯到浏览器信任的“根证书”的信任传递路径。
1.1 证书文件的组成
一个完整的证书文件应该包含:
-----BEGIN CERTIFICATE-----
服务器证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中间证书内容(可能有多个)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
根证书内容(可选,通常不需要)
-----END CERTIFICATE-----
1.2 获取证书链的方法
方法一:从 CA 获取
大多数 CA 会提供一个压缩包,包含:
your_domain.crt- 服务器证书 intermediate.crt- 中间证书 ca-bundle.crt- 完整证书链
方法二:手动拼接
# 拼接服务器证书和中间证书
cat your_domain.crt intermediate.crt > fullchain.crt
# 或者按顺序拼接
cat your_domain.crt > fullchain.crt
cat intermediate1.crt >> fullchain.crt
cat intermediate2.crt >> fullchain.crt
方法三:从服务器获取
# 查看远程服务器的证书链
openssl s_client -connect example.com:443 -showcerts
# 导出证书链
openssl s_client -connect example.com:443 -showcerts /dev/null | openssl x509 -outform PEM > certchain.pem
1.3 验证证书链完整性
# 验证证书链
openssl verify -CAfile intermediate.crt your_domain.crt
# 验证完整证书链
openssl verify -CAfile ca-bundle.crt fullchain.crt
# 查看证书链信息
openssl crl2pkcs7 -nocrl -certfile fullchain.crt | openssl pkcs7 -print_certs -noout
1.4 如何检查证书链顺序?
证书链必须按照从下到上的顺序拼接,即:直接签发者 → 上级签发者 → 更上级签发者 → 根证书。顺序错误会导致验证失败。
如何确定顺序?
每个证书都有 subject(主题)和 issuer(签发者)信息。正确的顺序是:
-
服务器证书的 issuer= 第一个中间证书的subject -
第N个中间证书的 issuer= 第N+1个中间证书的subject -
以此类推,直到根证书
快速检查命令:
# 查看每个证书的签发者和主题
openssl x509 -in file1.crt -noout -subject -issuer
openssl x509 -in file2.crt -noout -subject -issuer
openssl x509 -in file3.crt -noout -subject -issuer
# 输出示例:
# subject=CN = Intermediate CA 3
# issuer=CN = Intermediate CA 2 ← 说明 CA2 签发了 CA3
验证顺序是否正确:
# 验证证书链顺序
cat cert1.crt cert2.crt cert3.crt > chain.crt
openssl verify -CAfile chain.crt server.crt
# 输出 "OK" = 顺序正确
# 输出错误 = 顺序不对或缺少证书
如果顺序错了会怎样?
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
建议:用上面的命令检查每个文件的 subject 和 issuer,按签发关系排序。
1.5 导入到 AWS IAM
# 上传证书(必须包含证书链)
aws iam upload-server-certificate \
--server-certificate-name my-cert \
--certificate-body file://server.crt \
--private-key file://server.key \
--certificate-chain file://intermediate.crt
# 验证上传结果
aws iam get-server-certificate --server-certificate-name my-cert
3.6 导入到 AWS ACM
# 导入证书到 ACM
aws acm import-certificate \
--certificate file://server.crt \
--private-key file://server.key \
--certificate-chain file://intermediate.crt \
--region us-east-1
# 注意:ACM 证书只能用于特定的 AWS 服务
# API Gateway 和 CloudFront 要求证书在 us-east-1 区域
二、常见问题排查
2.1 如何判断证书链是否完整?
.jpg_2005.jpg)
2.2 不同浏览器的行为差异
|
|
|
|
|---|---|---|
| Chrome/Edge |
|
|
| Firefox |
|
|
| Safari |
|
|
| Android 浏览器 |
|
|
| iOS Safari |
|
|
| curl/openssl |
|
|
2.3 常见错误信息
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
三、最佳实践
3.1 推荐做法
.jpg_3942.jpg)
3.2 证书链检查脚本
#!/bin/bash
# 检查证书链完整性
CERT_FILE=$1
if [ -z "$CERT_FILE" ]; then
echo"用法: $0 <证书文件>"
exit1
fi
echo"=== 证书链检查 ==="
# 统计证书数量
CERT_COUNT=$(grep -c "BEGIN CERTIFICATE""$CERT_FILE")
echo"证书数量: $CERT_COUNT"
if [ "$CERT_COUNT"-lt2 ]; then
echo"?? 警告: 证书链可能不完整(建议至少2个证书)"
else
echo"? 证书链包含 $CERT_COUNT 个证书"
fi
# 提取并验证每个证书
echo""
echo"=== 证书详情 ==="
openssl crl2pkcs7 -nocrl -certfile "$CERT_FILE"2>/dev/null | \
openssl pkcs7 -print_certs -noout 2>/dev/null | \
grep -E "subject=|issuer="
# 验证证书链
echo""
echo"=== 验证结果 ==="
if openssl verify -CAfile "$CERT_FILE""$CERT_FILE"2>/dev/null; then
echo"? 证书链验证通过"
else
echo"? 证书链验证失败"
fi