使用Python将密码传递给OpenSSL

2 投票
1 回答
2393 浏览
提问于 2025-04-18 10:26

我正在用Python写一个脚本,目的是自动生成证书。我可以顺利地用subprocess.Popen把输入参数传给keytool,但我不知道怎么用OpenSSL做到这一点。我查了很多资料,尝试了“-passout”、“-passin”、“passwd”等各种组合,但总是提示参数无效。我想用“openssl ca”和“openssl req”来实现这个功能。

p = subprocess.Popen(['openssl', 'req', '-new', '-x509', '-extensions', 'v3_ca', '-keyout', 'c:\\cert\\sslcert\\private\\cakey.pem', '-out', 'c:\\cert\\sslcert\\cacert.pem', '-days', '3653', '-config', 'c:\\cert\\sslcert\\openssl.cnf'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
stdout, stderr = p.communicate(input='\nXFY-' +date +'\n' +email +'\n' +'\n' +'\n' +'\n' +common_name +'\n')

每次我尝试使用密码相关的选项时,都会出现“未知选项 -passout(-passin、passwd等)”的错误。我只想自动把之前用“getpass”输入的密码填入openssl命令中。

现在,当代码运行到上述命令时,它会提示“输入PEM密码短语:”。我输入后,接下来的参数在communicate()中会正常执行……就是无法自动输入PEM密码短语。这个网站上有一些类似的问题提到要使用“expect”或“pexpect”,但这看起来太复杂了。这是唯一的方法吗?而且,pexpect在Python 2.7中默认不包含,所以你得在安装Python后再添加,这在不同的机器上我需要频繁做这件事。

编辑:看起来pexpect本来就是为UNIX机器准备的。我是在Windows上做这个。

1 个回答

2

当你给 Popen() 传递参数时,需要把选项和它的值分开。比如 -passout pass:mypassword 应该分成两个参数,而不是一个。

撰写回答