X.509 证书:结构、类型与开发者生成指南
X.509 证书是公钥基础设施(PKI)的核心组成部分,用于承载公钥和主体信息。这一标准源于 X.500 DAP,现已被 LDAP 大多取代。所有结构均采用 ASN.1 定义——一种数据序列化元语言,编码遵循 X.690 或 XER 中的 BER、CER、DER 规则。
基本 TBSCertificate 结构:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL
}
在 ASN.1 中,SEQUENCE 类似于 C 语言的 struct。语法细节可参考 X.680(2008)。证书主要作为公钥容器,同时用于验证域名所有权或身份,但可靠性因情况而异。
证书层级与类型
信任链从根 CA 延伸至终端实体。
- 根证书:发行者等于主体,basicConstraints.cA = TRUE。
- 中间证书:由上级 CA 签名,构建信任链。
- 终端实体证书:不签名他人,由最终系统使用。
按验证级别分类:
- DV(域名验证):通过邮件或 HTTP 挑战自动验证域名。
- OV(组织验证):验证 WHOIS、注册信息及联系人,通常需几天时间。
- EV(扩展验证):完整企业审计、独占域名权及授权证明。浏览器显示绿色地址栏并带公司名。主体需包含 jurisdictionOfIncorporationCountryName、businessCategory、serialNumber。
其他类型:
- 多域名:SAN(subjectAltName)支持多个域名。
- 通配符:CN=*.example.com 覆盖子域名。
- 合格证书:个人证书,按 RFC 3739 包含 givenName、dateOfBirth、countryOfCitizenship。
证书生成
使用 ECC 自签名证书
椭圆曲线加密(ECC)在 CPU 效率和密钥大小上优于 RSA,但 TLS <1.2 的支持度不一。
生成 secp521r1 私钥:
openssl ecparam -name secp521r1 -genkey -param_enc explicit -out private-key.pem
生成 SHA256 CSR:
openssl req -new -sha256 -key private-key.pem -out server.csr -days 730
自签名:
openssl x509 -req -sha256 -days 365 -in server.csr -signkey private-key.pem -out public.crt
查看详情:
openssl x509 -text -noout -in public.crt
帮助:openssl -help,openssl x509 -help。
使用 Java keytool
RSA 2048:
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
转换为 PKCS12:
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype pkcs12
输出包含 SubjectKeyIdentifier(OID 2.5.29.14,按 RFC 5280 非关键扩展)。
Let's Encrypt(DV)
安装 certbot 获取证书:
sudo certbot certonly --standalone -d example.com -d www.example.com
(Gentoo: sudo emerge certbot;Debian: sudo apt-get install certbot -t stretch-backports;Fedora: sudo dnf install certbot)。
扩展与分析
证书使用 OID 标识:subjectKeyIdentifier ::= KeyIdentifier。完整解析用 openssl x509 -text。信任链为:根 → 中间 → 叶子证书。
关键要点:
- X.509 采用 ASN.1:SEQUENCE 似 struct,DER/BER 编码。
- 类型:DV/OV/EV 按验证分,通配符/SAN 增灵活性。
- 生成:openssl 支持 ECC/RSA,keytool 处理 JKS/PKCS12,certbot 用于 Let's Encrypt。
- 链路:根 (cA=TRUE) → 中间 → 终端实体。
用 openssl s_client -connect host:443 -showcerts 调试链路。X.680/690、RFC 5280/3739 等标准确保 PKI 互操作性。
— Editorial Team
暂无评论。