Python调用openssl rsa时如何通过变量传私钥避免写入磁盘文件
实现方案
完全可以在不写入磁盘文件的前提下,直接将内存中存储的私钥变量传递给openssl命令生成公钥,不需要使用os.system,直接通过subprocess.run的标准输入传参能力即可实现,具体方法如下:
核心原理
openssl所有支持-in参数指定输入文件的子命令,都支持将-in的参数值设为-,代表从标准输入(stdin)读取内容,不需要读取磁盘实体文件。配合subprocess.run的input参数,就能直接把Python内存中的变量内容作为输入传给openssl,全程不会有私钥落盘的风险。
可直接运行的代码
import subprocess # 生成4096位RSA私钥,存储在内存变量中 private_key = subprocess.run( ['openssl', 'genrsa', '4096'], check=True, stdout=subprocess.PIPE, text=True ).stdout # 直接传入内存中的私钥生成公钥,无磁盘IO public_key = subprocess.run( ['openssl', 'rsa', '-in', '-', '-pubout'], input=private_key, # 将私钥变量作为标准输入传给openssl check=True, stdout=subprocess.PIPE, text=True ).stdout
执行完成后public_key变量里就是生成好的公钥文本,和你之前写文件再读出来的内容完全一致。
注意事项
- 不要用
os.system实现这个需求:os.system只能通过shell启动进程,无法直接将Python内存中的变量作为子进程的标准输入传入,要么需要写临时文件,要么需要做复杂的shell管道拼接,还存在命令注入、特殊字符转义失败的风险。 - 你代码里写的
universal_newlines=True是Python3.7之前的旧参数名,新版本中已经改名为text=True,两者效果完全一致,开启后stdout返回的是字符串类型;如果需要字节格式的密钥内容,去掉text=True参数即可,此时input传入字节类型的私钥内容就行。 - 所有subprocess调用建议保留
check=True参数,openssl执行出错(比如私钥格式非法)时会直接抛出异常,方便排查问题,不会静默返回错误内容。
内容的提问来源于stack exchange,提问作者skk6
相关产品推荐
相关产品推荐

