openssl 中 -nodes 参数的目的是啥?

Posted

技术标签:

【中文标题】openssl 中 -nodes 参数的目的是啥?【英文标题】:What is the purpose of the -nodes argument in openssl?openssl 中 -nodes 参数的目的是什么? 【发布时间】:2011-06-30 09:57:28 【问题描述】:

openssl 中-nodes 参数的作用是什么?

【问题讨论】:

Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。 @jww 我不同意,openssl 是一个低级工具包,开发人员必须一直处理它。这条线相当模糊,仅仅因为它恰好是一个 CLI 而不是 C lib,所以不允许在这里提出 openssl 问题将是一个很大的损失。 @gtd - 当我标记这些时,这是一个常见的抱怨。另见Where do I post questions about Dev Ops?。 (但我认为我在这个问题上犯了一个错误——这个问题是从 2011 年开始的,我相信它是当时的话题。我不喜欢因为政策变化而受到惩罚)。 @gtd - re: “openssl 是一个低级工具包,开发人员必须一直处理它。” - 这就是 Super User 或 Unix & Linux Stack Exchange是给。 “...不允许 openssl 问题将是一个很大的损失...” - 这里总是欢迎 openssl C 编程问题。非编程问题的丢失不会错过,因为 Stack Overflow 是一个编程和开发站点。当您不知道如何使用命令时,可以访问其他网站。 感谢您的链接,我将在那里发布我的回复,因为我认为这是一个非常重要的问题。 【参考方案1】:

选项-nodes 不是英文单词“nodes”,而是“no DES”。当作为参数给出时,这意味着 OpenSSL 不会加密 PKCS#12 文件中的私钥。

要加密私钥,您可以省略-nodes,您的密钥将使用 3DES-CBC 加密。为了加密密钥,OpenSSL 会提示您输入密码,并使用该密码通过密钥派生函数EVP_BytesToKey 生成加密密钥。

根据您的 OpenSSL 版本和编译选项,您可能能够提供这些选项来代替 -nodes

-des          encrypt private keys with DES
-des3         encrypt private keys with triple DES (default)
-idea         encrypt private keys with idea
-seed         encrypt private keys with seed
-aes128, -aes192, -aes256
              encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
              encrypt PEM output with cbc camellia

最终在库级别 OpenSSL 使用您选择的加密算法(或缺少加密算法)调用函数 PEM_write_bio_PrivateKey。

【讨论】:

加密是指密码吗? @Flimm:有密码保护,是的。密码使用密钥派生算法生成加密密钥,加密是使用密钥完成的,而不是密码。使用加密密钥的唯一方法是首先对其进行解密,为此您需要知道加密它的密码才能生成相同的密钥。 为什么要加密我的私钥文件?那些不是向任何人发布的,因此得名。还是我错了? @Blauhirn:加密私钥文件的原因与加密任何文件的原因相同:您不希望获得副本的人能够阅读或使用它。是否应该加密私钥取决于密钥的重要性和您的威胁模型。【参考方案2】:

编辑: nginx v1.7.3 添加了一个ssl_password_file 指令,该指令从指定文件中读取密码短语,尝试使用上下文的encrypted-private.key上的每个密码短语p>

indiv 是正确的,-nodes 参数意味着 OpenSSL 将创建未加密的 private.key;否则,将出现创建 encrypted-private.key 的密码提示。见req、pkcs12、CA.pl

不过,我觉得目的(针对程序员)是因为:

HTTP 服务器(例如 Apache、Nginx)在没有密码的情况下无法读取 encrypted-private.key → 选项 A - 每次 HTTP 服务器启动时,必须为 encrypted-private.key 提供密码 选项 B - 在 http server 上下文中指定 ssl_password_file file.keys;。 [ref] 选项 C - 使用 -nodes 创建不加密的 private.key

有用:锁定private.key

将 HTTP 服务器添加到 ssl-certsudo chown root:ssl-cert private.key - chprivate.key拥有er 授予 root 用户,ssl-cert sudo chmod 640 private.key - 将 private.key 的访问权限更改为所有者 R/W,组 R 现在,HTTP 服务器应该能够启动和读取未加密的 private.key

选项 A

更强大的安全性,但当服务器重新启动时,必须为 encrypted-private.key手动输入密码

选项 B

中等安全性,A/C 之间可能有很好的平衡

选项 C

较弱的安全性,但未提示输入未加密的 private.key 密码短语

【讨论】:

Nginx 可以从 1.7.3 版本开始读取加密的私钥,参见:nginx.org/en/docs/http/… 将 nginx 及其版本带入讨论的目的是什么?此外,(B) 和 (C) 提供等效的安全性(即文件系统 ACL)。您描述的问题是无人值守密钥存储问题,它是一个没有解决方案的问题。请参阅 Gutmann 的 Engineering Security 书。 @jww 问题问“目的是什么...”。我考虑了问题的上下文(程序员的 QnA),我试图通过“但是,我觉得(程序员的)目的是因为:”来表明这一点。特别是关于安全性..可能是security.stackexchange.com的讨论

以上是关于openssl 中 -nodes 参数的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth授权请求中'state'参数的目的是啥

JAVA中REENTRANT LOCK中公平参数的目的是啥?

C++ 中指向 unique_ptr 函数参数的原始指针的目的是啥?

OAuth 2身份验证中grant_type参数的目的是啥

使用 OleDb 参数的目的是啥? [复制]

将方法参数声明为 final 的目的是啥? [复制]