返回首页

X.509 证书:ASN.1 和生成

本文分解了 ASN.1 中的 X.509 证书结构、验证类型 (DV/OV/EV)、链层次结构。提供了使用 openssl (ECC/RSA)、keytool 和 certbot 生成的命令。针对高级开发者:OID 扩展、DER/BER 编码。

X.509 指南:从 ASN.1 到 ECC 密钥
Advertisement 728x90

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)。证书主要作为公钥容器,同时用于验证域名所有权或身份,但可靠性因情况而异。

Google AdInline article slot

证书层级与类型

信任链从根 CA 延伸至终端实体。

  • 根证书:发行者等于主体,basicConstraints.cA = TRUE。
  • 中间证书:由上级 CA 签名,构建信任链。
  • 终端实体证书:不签名他人,由最终系统使用。

按验证级别分类:

  • DV(域名验证):通过邮件或 HTTP 挑战自动验证域名。
  • OV(组织验证):验证 WHOIS、注册信息及联系人,通常需几天时间。
  • EV(扩展验证):完整企业审计、独占域名权及授权证明。浏览器显示绿色地址栏并带公司名。主体需包含 jurisdictionOfIncorporationCountryName、businessCategory、serialNumber。

其他类型:

Google AdInline article slot
  • 多域名: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:

Google AdInline article slot
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 -helpopenssl 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

Advertisement 728x90

继续阅读