本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接: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 格式内容中获取到了一个证书
评论