本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
继续研究 host 模块
1.x509 是什么?
x509 是一个证书格式
x509 v3 证书格式
2.PEM 是什么?
x509 证书主要有 2 种编码格式,一种是 DER 格式,另一种是 PEM 格式。
1. DER 格式二进制格式。der 类型的不用在编码解码,直接就是二进制的数据可以直接使用
2.PEM 格式 PEM 格式的文件是普通的文本文件,实际内容进行了某些编码。数据要根据 base64 编码解码后,得到的数据需要进行增加或裁剪特殊字符-、\n、\r、begin 信息、end 信息等。通常 PEM 文件都包含不同的页眉页脚
证书签名请求 CSR 的格式如下
RSA 私钥文件格式如下
证书文件格式如下
-----BEGIN CERTIFICATE----
...
-----END CERTIFICATE-----
复制代码
3.X509KeyPair 是什么?
certPool := cmx509.NewCertPool() 创建证书池
for i := range certPEMs { certPool.AppendCertsFromPEM(certPEMs[i]) }
复制代码
遍历证书,然后添加
func (s *CertPool) AppendCertsFromPEM(pemCerts []byte) (ok bool) {
for len(pemCerts) > 0 {
var block *pem.Block
//解析证书字节数组变为pem.Block
block, pemCerts = pem.Decode(pemCerts)
if block == nil {
break
}
if block.Type != "CERTIFICATE" || len(block.Headers) != 0 {
continue
}
//解析证书字节数组为证书
cert, err := ParseCertificate(block.Bytes)
if err != nil {
continue
}
//添加证书
s.AddCert(cert)
ok = true
}
return
}
复制代码
添加证书
func (s *CertPool) AddCert(cert *Certificate) {
if cert == nil {
panic("adding nil Certificate to CertPool")
}
// Check that the certificate isn't being added twice.
if s.contains(cert) {
return
}
//获取已有证书长度
n := len(s.certs)
//添加证书
s.certs = append(s.certs, cert)
if len(cert.SubjectKeyId) > 0 {
keyId := string(cert.SubjectKeyId)
s.bySubjectKeyId[keyId] = append(s.bySubjectKeyId[keyId], n)
}
name := string(cert.RawSubject)
s.byName[name] = append(s.byName[name], n)
}
复制代码
sk, err := asym.PrivateKeyFromPEM(keyPEMs[idx], nil)
sk 就是私钥
tlsCert, err := cmTls.X509KeyPair(certPEMs[idx], keyPEMs[idx])
复制代码
X509KeyPair 从证书 pem 格式内容、私钥 pem 格式内容中获取到了一个证书
评论