Go语言处理PEM证书和密钥需分两阶段:先用encoding/pem解析结构,再依类型标识(如"CERTIFICATE"、"PRIVATE KEY")调用crypto/x509等包解码;加密私钥须先用x509.DecryptPEMBlock解密再解析。

Go语言中处理证书和密钥的PEM格式,主要依靠 encoding/pem 包解析原始数据,再配合 crypto/x509(证书)或 crypto/rsa、crypto/ecdsa(私钥)等包完成解码与序列化。PEM本身只是Base64编码加头尾标记的容器格式,不包含加密逻辑,也不直接表示证书或密钥类型——关键在于识别 -----BEGIN XXX----- 中的类型标识,并用对应方式解码。
读取PEM文件后,需逐块提取并判断类型,再用 x509.ParseCertificate 解析为 *x509.Certificate:
ioutil.ReadFile(Go 1.16+ 推荐 os.ReadFile)读取整个文件内容pem.Decode 提取第一个 PEM 块;若文件含多个证书(如证书链),需循环调用 pem.Decode 直到返回 nil
block.Type 是否为 "CERTIFICATE",再传给 x509.ParseCertificate(block.Bytes)
私钥的 PEM 类型标识更复杂,常见有 "RSA PRIVATE KEY"(PKCS#1)、"PRIVATE KEY"(PKCS#8)、"EC PRIVATE KEY"。推荐统一用 x509.ParsePKCS8PrivateKey 或 x509.ParsePKCS1PrivateKey:
"PRIVATE KEY" → 优先尝试 x509.ParsePKCS8PrivateKey(支持 RSA/ECDSA)"RSA PRIVATE KEY" → 用 x509.ParsePKCS1PrivateKey
"EC PRIVATE KEY" → 可用 x509.ParseECPrivateKey,但 Go 1.15+ 更建议走 PKCS#8 路径_, ok := key.(*rsa.PrivateKey))将证书或密钥对象编码为 PEM,需构造正确的 *pem.Block 并用 pem.Encode 写入 io.Writer(如文件或 bytes.Buffer):
立即学习“go语言免费学习笔记(深入)”;
x509.Certificate.Raw 或 cert.Raw(已编码的 DER),block.Type = "CERTIFICATE"
x509.MarshalPKCS1PrivateKey(rsaKey),block.Type = "RSA PRIVATE KEY"
x509.MarshalPKCS8PrivateKey(key),block.Type = "PRIVATE KEY"
pem.Encode 返回的 error,它可能因写入目标不可写而失败encoding/pem 本身不支持解密——它只负责解析 PEM 结构。若私钥被 PEM 加密(如 DEK-Info: DES-EDE3-CBC),需先用 x509.DecryptPEMBlock 解密(传入密码),再解析结果字节:
pem.Decode 得到 block,确认 block.Headers["Proc-Type"] == "4,ENCRYPTED"
x509.DecryptPEMBlock(block, password) 获取明文 DER 字节x509.ParsePKCS8PrivateKey)x509.EncryptPEMBlock,支持 AES 等算法,但注意兼容性(旧工具可能只认 DES)不复杂但容易忽略。核心是分清“PEM 解析”和“内容解码”两个阶段,类型字符串匹配准确、错误检查到位,就能稳定处理各类证书和密钥 PEM 文件。
以上就是如何在Golang中使用encoding/pem处理证书_解析和生成PEM文件的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号