【问题标题】:openssl: how to convert pfx into pem in a scriptopenssl:如何在脚本中将 pfx 转换为 pem
【发布时间】:2026-02-12 14:05:06
【问题描述】:

如果我运行openssl pkcs12 -in cert.pfx -out cert.pem -password pass:mypass,我可以成功地将 pfx 转换为 pem。系统会提示我输入 PEM 密码,以便在 .pem 文件中加密私钥。

但在脚本中,如何自动输入 PEM 密码?我尝试使用 -passin 参数,但没有效果。

我猜如果我单独连接 PEM 证书和 PEM 密钥(而不是来自 pfx),这将等同于从 pfx 转换为 pem,但是来自 PFX 的 PEM 文件在外部具有那些包属性base64 字符串,我不知道这是否重要。

那么,我如何正确地“创建”一个 PEM 文件,其中包含加密的私钥,而不会提示表单密码?

【问题讨论】:

    标签: openssl certificate pem pfx pkcs#12


    【解决方案1】:

    如果您查看openssl pkcs12 文档,您将看到:

    -passin 参数

    PKCS#12 文件(即输入文件)密码源。有关 arg 格式的更多信息,请参阅 PASS PHRASE ARGUMENTS openssl(1) 中的部分。

    -传递参数

    密码短语源用于加密任何输出的私钥。有关 arg 格式的更多信息,请参阅 PASS PHRASE ARGUMENTS openssl(1) 中的部分。

    哪个指向你:

    通过短语选项

    几个命令接受密码参数,通常使用 -passin 和 -passout 分别用于输入和输出密码。这些允许 要从各种来源获得的密码。这两个 options 采用单个参数,其格式如下所述。如果不 给出密码参数并且需要密码,然后用户是 提示输入一个:这通常会从当前读取 关闭回显的终端。

    请注意,字符编码可能是相关的,请参阅 密码短语编码(7)。

    密码:密码

    实际密码是密码。由于密码对实用程序可见(如 Unix 下的 'ps'),因此只能在 安全并不重要。环境:变量

    从环境变量 var 中获取密码。由于其他进程的环境在某些平台上是可见的(例如 ps 在某些 Unix 操作系统下)应谨慎使用此选项。 文件:路径名

    路径名的第一行是密码。如果将相同的路径名参数提供给 -passin 和 -passout 参数,则第一个 行将用于输入密码,下一行用于 输出密码。路径名不需要引用常规文件:它可以 例如引用设备或命名管道。 fd:号码

    从文件描述符号中读取密码。例如,这可用于通过管道发送数据。标准输入

    从标准输入读取密码。

    所以把它们放在一起,你可以这样做:

    openssl pkcs12 -in cert.pfx -out cert.pem -passin pass:mypass -passout: pass:mypass
    

    至于为什么 -password 对您不起作用:

    -密码参数

    使用-export,-password 等效于-passout。否则, -password 等价于 -passin。

    因此,由于您没有使用“-export”,因此它的作用与“-passin”选项相同。由于这种行为,我喜欢明确地使用“-passin”和“-passout”。

    【讨论】:

    • 我确实没有意识到-passout 被用来加密证书中的密码,我之前读错了。谢谢你的澄清。