Certificate 证书

Dec 20, 2023 · 2 min read

基本概念

  • CRL(Certificate Revocation List 证书吊销列表) : PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期
  • CA(Certificate Authority): 证书的签发机构,它是公钥基础设施(Public Key Infrastructure,PKI)的核心。 任何个体/组织都可以扮演 CA 的角色,只不过难以得到客户端的信任,能够受浏览器默认信任的 CA 大厂商有很多,其中 TOP5 是 Symantec、Comodo、Godaddy、GolbalSign 和 Digicert
  • PKCS(The Public-Key Cryptography Standards 公钥密码学标准): 是一组由RSA Security Inc.设计和发布的公钥密码标准。
  • X.509标准是Public Key Certificates公钥证书的格式标准
  • Certificate Trust Chain(证书信任链): 用于身份验证的一系列证书,它们形成一条从一个可信任的根证书颁发机构开始,逐级向下连接,直到用于验证某个特定证书的中间证书或终端证书的一种方式
  • Digital Certificate 数字证书又称为公开密钥证书(Public key certificate):用来证明公开密钥拥有者的身份。
  • ASN.1(Abstract Syntax Notation One 抽象语法标记):一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。第一代PKI标准主要是基于抽象语法符号(Abstract Syntax Notation One,ASN.1)编码的,实现比较困难,这也在一定程度上影响了标准的推广。

服务器证书分类

screen reader text
服务器证书分类

  • DV(Domain Validation):面向个体用户,安全体系相对较弱,验证方式就是向 whois 信息中的邮箱发送邮件,按照邮件内容进行验证即可通过;
  • OV(Organization Validation):面向企业用户,证书在 DV 证书验证的基础上,还需要公司的授权,CA 通过拨打信息库中公司的电话来确认;
  • EV(Extended Validation):打开 Github 的网页,你会看到 URL 地址栏展示了注册公司的信息,这会让用户产生更大的信任,这类证书的申请除了以上两个确认外,还需要公司提供金融机构的开户许可证,要求十分严格

数字证书编码格式

X.509 证书目前有以下两种编码格式:

  • PEM - Privacy Enhanced Mail 保密增强邮件协议,以”—–BEGIN…”开头,”—–END…” 结尾,内容以 BASE64 编码。Apache 和 *NIX 服务器偏向于使用这种编码格式。
-----BEGIN Type-----
Headers
base64-encoded Bytes
-----END Type-----
  • DER - Distinguished Encoding Rules,二进制格式,不可读。Java 和 Windows 服务器偏向于使用这种编码格式

扩展名

除了 .pem 及 .der 之外,不同的系统或程序对数字证书文件载体定义了自己的扩展名,它们除了格式不同之外,内容也有差别,但大多数都能相互转换:

  • .crt: 多见于 *NIX 系统 PEM 编码
  • .cer: 多见于 Windows 系统 DER 编码
  • .csr: (Certificate Signing Request 证书签名请求),是向 CA 发出的证书申领请求,其核心内容包含一个「公钥」及其他主体信息,在生成该请求时,也会生成相应的「私钥」

go 语言 x509 包

crypto/x509 包主要用于解析 X.509 编码的密钥和证书.

crypto/x509/pkix 包含用于 X.509 证书,CRL 和 OCSP 的 ASN.1 解析和序列化的共享低级结构。

// X509 证书
type Certificate struct {
    // 证书的 subject 信息,包含 CN,O,L,S,C等字段
    Subject pkix.Name
    // contains filtered or unexported fields
}


// 证书签署请求
type CertificateRequest struct {
    // 签名
    Signature          []byte
    // 签名算法
    SignatureAlgorithm SignatureAlgorithm
    // 私钥算法
    PublicKeyAlgorithm PublicKeyAlgorithm
    // 私钥
    PublicKey          interface{}
    // 证书签署请求的 subject
    Subject pkix.Name
    // contains filtered or unexported fields
}
type Name struct {
	Country, Organization, OrganizationalUnit []string
	Locality, Province                        []string
	StreetAddress, PostalCode                 []string
	SerialNumber, CommonName                  string

	// Names contains all parsed attributes. When parsing distinguished names,
	// this can be used to extract non-standard attributes that are not parsed
	// by this package. When marshaling to RDNSequences, the Names field is
	// ignored, see ExtraNames.
	Names []AttributeTypeAndValue

	// ExtraNames contains attributes to be copied, raw, into any marshaled
	// distinguished names. Values override any attributes with the same OID.
	// The ExtraNames field is not populated when parsing, see Names.
	ExtraNames []AttributeTypeAndValue
}