go解析含passphrase的pem秘钥

ops/2024/11/22 22:18:14/

背景

在编写TLS配置时需要用到需要用到一串包含passphrase的RSA秘钥,本想通过官方库的方式解析使用,但由于安全因素,官方已经禁用了DecryptPEMBlockEncryptPEMBlockIsEncryptedPEMBlock等函数,导致无法通过官方库去实现这个需求。

解决方案

最终通过pkcs8库来完成需求,代码如下:

go">package mainimport ("crypto/x509""encoding/pem""fmt""os""github.com/youmark/pkcs8"
)func main() {pem, err := getTlsConfig()if err != nil {panic(err)}fmt.Println("无加密的pem:", string(pem))
}func getTlsConfig() ([]byte, error) {passphrase := "test123"keyFilePaaht := "./key"keyPEMByte, err := os.ReadFile(keyFilePaaht)if err != nil {err = fmt.Errorf("read %s failed! err: %s", keyFilePaaht, err)return nil, err}keyPEMBlock, rest := pem.Decode(keyPEMByte)if len(rest) > 0 {err := fmt.Errorf("decode key failed! rest: %s", rest)return nil, err}// 解析pemkey, err := pkcs8.ParsePKCS8PrivateKey(keyPEMBlock.Bytes, []byte(passphrase))if err != nil {err = fmt.Errorf("parse PKCS8 private key err: %s", err)return nil, err}// 解析出其中的RSA 私钥keyBytes, err := x509.MarshalPKCS8PrivateKey(key)if err != nil {err = fmt.Errorf("MarshalPKCS8PrivateKey failed! %s", err)return nil, err}// 编码成新的PEM 结构newKey := pem.EncodeToMemory(&pem.Block{Type:  "PRIVATE KEY",Bytes: keyBytes,},)return newKey, nil
}

为什么GO不支持pem的加密?

GO团队的Commit Message:

crypto/x509: deprecate legacy PEM encryption
It’s unfortunate that we don’t implement PKCS#8 encryption (#8860)
so we can’t recommend an alternative but PEM encryption is so broken
that it’s worth deprecating outright.

官方库x509:

Deprecated: Legacy PEM encryption as specified in RFC 1423 is insecure by design. Since it does not authenticate the ciphertext, it is vulnerable to padding oracle attacks that can let an attacker recover the plaintext.

GO团队认为PEM encryption的实现是不好的,不够安全的,因此官方移除了实现,并且也不推荐相关的外部实现的库。

从这个Issue的讨论可以看出社区对这个需求的渴望已经很久,但官方并没有太多关注。

参考链接

  • Github Issue - crypto/x509: “certificate is not standards compliant” on MacOS
  • Github Issue - Encrypted private key in PKCS#8 format not supported #17
  • x509-decryptpemblock-is-deprecated-what-is-alternative

http://www.ppmy.cn/ops/32484.html

相关文章

spring boot “error“: “Not Found“

标题spring boot “error”: “Not Found” {"timestamp": "2024-05-04T07:26:21.15000:00","status": 404,"error": "Not Found","path": "/user/register" }出现以上这个提示可能是如下原因 查看在…

Ubuntu20安装torch1.13和pytorch_geometric2.3.0(对应cuda11.6)

在torch下载页面搜索1.13https://pytorch.org/get-started/previous-versions/,wheel安装方式(激活conda虚拟环境) pip install torch1.13.0cu116 torchvision0.14.0cu116 torchaudio0.13.0 --extra-index-url https://download.pytorch.org…

HTML_CSS学习:浮动

一、浮动简介 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>浮动_简介</title><style>div{width: 600px;height: 400px;background-color: #1c80d9;}img{float:…

CCF PTA 2023年5月C++天空之城的树

【问题描述】 拉姆达人在修建天空之城时&#xff0c;主要是依赖巨大的飞行石去维持悬空状态&#xff0c;依赖强壮的大树去作为建筑 物的框架&#xff0c;假设大树是一棵有 n(n≤10 3)个结点的二叉树。给出每个结点的两个子结点编号&#xff08;均不超 过 n&#xff09;&#x…

蓝桥杯练习系统(算法训练)ALGO-950 逆序数奇偶

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 老虎moreD是一个勤于思考的青年&#xff0c;线性代数行列式时&#xff0c;其定义中提到了逆序数这一概念。不过众所周知我们…

《MySQL45讲》读书笔记

重建表 alter table t engine InnoDB&#xff08;也就是recreate&#xff09;&#xff0c;而optimize table t 等于recreateanalyze&#xff0c;让表大小变小 重建表的执行流程 建立一个临时文件&#xff0c;扫描表 t 主键的所有数据页&#xff1b;用数据页中表 t 的记录生…

图片合称为视频

import cv2 import os def pic_video(args_input_path,folder_path,output_video_path): count 1 image_files [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.endswith(‘.png’)] img cv2.imread(image_files[0]) height img.shape[0] w…

Python实战开发及案例分析(2)——单目标优化

在Python中&#xff0c;进行单目标优化主要涉及定义一个优化问题&#xff0c;包括一个目标函数和可能的约束条件&#xff0c;然后选择合适的算法来求解。Python提供了多种库&#xff0c;如SciPy、Pyomo、GEKKO等&#xff0c;用于处理各种优化问题。 案例分析&#xff1a;使用 …