7x24小时服务热线

400-688-5856
400
400-688-5856

7*24小时服务热线

400-688-5856

QQ在线咨询

咨询

微信客服

公众号
扫码关注海域云公众号 随时查看进度/优惠/通知

SSL证书链如何导入?怎么校验证书链是否完整?

2026-03-11

简单来说,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" = 顺序正确
# 输出错误 = 顺序不对或缺少证书

如果顺序错了会怎样?

情况
结果
AWS 导入
可能成功(AWS 有时会自动调整)
客户端验证
? 可能失败,报证书链错误
最佳实践
? 必须按正确顺序

建议:用上面的命令检查每个文件的 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 如何判断证书链是否完整?

图片

2.2 不同浏览器的行为差异

浏览器
证书链缺失时的行为
原因
Chrome/Edge
可能正常访问
自动缓存中间证书(AIA 扩展)
Firefox
直接报错
不缓存中间证书,严格验证
Safari
可能正常访问
依赖系统证书库
Android 浏览器
可能报错
取决于系统版本
iOS Safari
可能正常访问
依赖系统证书库
curl/openssl
直接报错
无缓存机制,严格验证

2.3 常见错误信息

错误信息
原因
解决方案
Certificate chain is missing
未上传中间证书
添加证书链
unable to get local issuer certificate
证书链不完整
检查中间证书顺序
certificate verify failed
根证书不在信任库
使用主流 CA 证书
SSL handshake failed
证书格式错误
检查 PEM 格式

三、最佳实践

3.1 推荐做法

图片

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