openssl中-nodes参数的目的是什么?


102

-nodesopenssl 中该参数的目的是什么?


2
堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎与主题无关,因为它与编程或开发无关。请在帮助中心中查看我可以询问哪些主题。也许超级用户Unix&Linux Stack Exchange是一个更好的选择。
jww 2015年

20
@jww我不同意,openssl是一个低级工具包,开发人员必须一直处理它。这行是相当模糊的,仅因为它碰巧是CLI而不是C lib,所以在这里不允许openssl问题将是一个巨大的损失。
gtd 2015年

@gtd-当我标记这些时,这是一个经常抱怨的问题。另请参阅我在哪里发布有关Dev Ops的问题?。(但我认为我在这方面犯了一个错误-问题是从2011年开始的,我认为那是当时的话题。我不希望因政策变更而受到惩罚)。
jww 2015年

2
@gtd-re:“ openssl是一个低级工具包,开发人员必须始终处理它。” -这就是超级用户Unix&Linux Stack Exchange的用途。“ ...不允许openssl问题将是一个巨大的损失……” -这里始终欢迎openssl C编程问题。由于Stack Overflow是一个编程和开发站点,因此不会错过所有非编程问题。当您不知道如何使用命令时,还有其他站点可以访问。
jww 2015年

感谢您的链接,我将回复贴在这里,因为我认为这是一个非常重要的问题。
gtd 2015年

Answers:


122

该选项-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函数。


1
加密是指密码吗?
Flimm

4
@Flimm:是的,有密码保护。密码使用密钥派生算法生成加密密钥,并且加密是通过密钥而不是密码来完成的。使用加密密钥的唯一方法是首先对其进行解密,为此您需要知道加密密钥以生成相同的密钥。
indiv 2013年

为什么要加密我的私钥文件?那些arent发布给任何人,因此得名。还是我错了?
phil294

1
@Blauhirn:出于加密任何文件的相同原因,您将加密私钥文件:您不希望获得副本的人能够读取或使用它。是否应加密私钥取决于密钥的重要性和威胁模型。
indiv 2016年

12

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

indiv是正确的,因为该-nodes参数意味着OpenSSL将创建UNencrypted private.key ; 否则,将出现一个密码短语提示来创建cryptod-private.key。参见reqpkcs12CA.pl

但是,我觉得目的(对于程序员)是因为:

  • 没有密码短语的HTTP服务器(例如ApacheNginx)无法读取cryptod-private.key
    • 选项A-每次HTTP服务器启动时,都必须提供crypto -private.key的密码
    • 选项B- ssl_password_file file.keys;http { }server { }上下文中指定。[ 参考 ]
    • 选项C- -nodes用于创建不加密的private.key

有用:锁定private.key

  • {将HTTP服务器添加到ssl-cert组}
  • sudo chown root:ssl-cert private.key- CH安格自己的ER private.key用户,SSL证书
  • sudo chmod 640 private.key-将private.key的访问权限更改为所有者R / W,组R
  • 现在,HTTP服务器应该能够启动并读取未加密的private.key

选项A

更高的安全性,但是在服务器重新启动时,必须手动输入用于加密的private.key的密码

选项B

安全性中等,空调之间可能达到良好的平衡

选项C

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



1
Nginx的可能:因为1.7.3版本读取加密私钥,请参阅nginx.org/en/docs/http/...
5lava

2
将nginx及其版本引入讨论的目的是什么?此外,(B)和(C)提供等效的安全性(即文件系统ACL)。您正在描述的问题是无人值守的密钥存储问题,它是没有解决方案的问题。请参阅Gutmann的《工程安全》一书。
jww 2015年

@jww问题询问“ 目的是什么……”。我考虑了问题的上下文(针对程序员的QnA),我试图通过“但是,我觉得(对于程序员)的目的是因为:”。特别是关于安全..可以是用于讨论security.stackexchange.com
杰克伯杰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.