2026-03-11
一个完整的证书文件应该包含:
-----BEGIN CERTIFICATE-----
服务器证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中间证书内容(可能有多个)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
根证书内容(可选,通常不需要)
-----END CERTIFICATE-----
大多数 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
# 验证证书链
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
证书链必须按照从下到上的顺序拼接,即:直接签发者 → 上级签发者 → 更上级签发者 → 根证书。顺序错误会导致验证失败。
如何确定顺序?
每个证书都有 subject(主题)和 issuer(签发者)信息。正确的顺序是:
issuer = 第一个中间证书的 subjectissuer = 第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,按签发关系排序。
# 上传证书(必须包含证书链)
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
# 导入证书到 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 区域
.jpg_2005.jpg)
|
|
|
|
|---|---|---|
| Chrome/Edge |
|
|
| Firefox |
|
|
| Safari |
|
|
| Android 浏览器 |
|
|
| iOS Safari |
|
|
| curl/openssl |
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.jpg_3942.jpg)
#!/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