写点什么

长安链源码分析之网络模块 net-liquid(2)

作者:
  • 2022-10-16
    湖南
  • 本文字数:1030 字

    阅读完需:约 1 分钟

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


用户头像

关注

还未添加个人签名 2018-05-04 加入

还未添加个人简介

评论

发布
暂无评论
长安链源码分析之网络模块 net-liquid(2)_李_InfoQ写作社区