Qual é o propósito do argumento -nodes no openssl?

102

Qual é o propósito do -nodesargumento em openssl?

user624409
fonte
2
Stack Overflow é um site para questões de programação e desenvolvimento. Esta questão parece estar fora do tópico porque não é sobre programação ou desenvolvimento. Veja sobre quais tópicos posso perguntar aqui na Central de Ajuda. Talvez Superusuário ou Unix e Linux Stack Exchange sejam um lugar melhor para perguntar.
jww 01 de
20
@jww Eu discordo, o openssl é um kit de ferramentas de baixo nível e os desenvolvedores precisam lidar com isso o tempo todo. A linha está bastante borrada, e seria uma grande perda não permitir perguntas de abertura aqui simplesmente porque acontece de ser uma CLI em vez de C lib.
gtd.
@gtd - é uma reclamação frequente quando sinalizo isso. Veja também Onde eu posto perguntas sobre Dev Ops? . (Mas acho que cometi um erro neste - a questão é de 2011, e acho que estava no assunto naquela época. Não gosto de penalizar pela mudança de política).
jww
2
@gtd - re: "openssl é um kit de ferramentas de baixo nível e os desenvolvedores precisam lidar com isso o tempo todo." - é para isso que servem o Superusuário ou Unix e Linux Stack Exchange . "... seria uma grande perda não permitir perguntas em opensl ..." - perguntas de programação em opensl C são sempre bem-vindas aqui. A perda das questões de não programação não será perdida porque Stack Overflow é um site de programação e desenvolvimento. Existem outros sites para visitar quando você não sabe como usar um comando.
jww
Obrigado pelo link, postarei minha resposta lá, pois acho que esse é um assunto muito importante.
gtd

Respostas:

123

A opção -nodesnão é a palavra em inglês "nodes", mas sim "no DES". Quando fornecido como um argumento, significa que o OpenSSL não criptografará a chave privada em um arquivo PKCS # 12 .

Para criptografar a chave privada, você pode omitir -nodese sua chave será criptografada com 3DES-CBC. Para criptografar a chave, o OpenSSL solicita uma senha e usa essa senha para gerar uma chave de criptografia usando a função de derivação de chave EVP_BytesToKey .

Dependendo da sua versão do OpenSSL e das opções compiladas, você pode fornecer essas opções no lugar de -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

Em última análise, no nível da biblioteca, o OpenSSL chama a função PEM_write_bio_PrivateKey com o algoritmo de criptografia (ou a falta dele) que você escolher.

indiv
fonte
1
Por criptografar, você quer dizer com uma senha?
Flimm de
4
@Flimm: Protegido por senha, sim. A senha gera uma chave de criptografia usando um algoritmo de derivação de chave e a criptografia é feita com a chave, não com a senha. A única maneira de usar a chave criptografada é descriptografá-la primeiro, para o qual você precisa saber a senha com a qual ela foi criptografada para gerar a mesma chave.
indiv
por que devo criptografar meu arquivo de chave privada? aqueles não foram publicados para ninguém, daí o nome. Ou eu estou errado?
phil294
1
@Blauhirn: Você criptografaria seu arquivo de chave privada pelo mesmo motivo que criptografaria qualquer arquivo: você não quer que alguém que obtenha uma cópia possa lê-lo ou usá-lo. Se você deve criptografar a chave privada depende da importância da chave e do seu modelo de ameaça.
indiv
12

edit: nginx v1.7.3 adicionou uma diretiva ssl_password_file que lê as frases-senha de um arquivo especificado tentando cada frase-senha na chave privada criptografada do contexto

indiv é correto que os -nodesmeios de argumentos que OpenSSL criarão UNENCRYPTED private.key ; caso contrário, haverá um prompt de senha para criar criptografado-privado.key . consulte req , pkcs12 , CA.pl

no entanto, sinto que o objetivo (para programadores) é porque:

  • Os servidores HTTP (por exemplo , Apache , Nginx ) não podem ler chave privada criptografada sem senha →
    • Opção A - cada vez que o servidor HTTP for iniciado, deve fornecer senha para criptografado-privado.key
    • Opção B - especifique ssl_password_file file.keys;em http { }ou server { }contexto. [ ref ]
    • Opção C - use -nodespara criar private.key sem criptografia

útil: bloquear private.key

  • {adicionar servidor HTTP ao grupo SSL-cert }
  • sudo chown root:ssl-cert private.key- ch ange própria er de private.key a raiz do usuário, ssl-cert grupo
  • sudo chmod 640 private.key- alterar as permissões de acesso da chave privada para o proprietário R / W, grupo R
  • agora, servidor HTTP deve ser capaz de iniciar e ler sem criptografia private.key

Opção A

segurança mais forte, mas quando o servidor for reiniciado, terá que digitar manualmente a senha para criptografada-privada.key

Opção B

segurança média e provavelmente bom equilíbrio entre A / C

Opção C

segurança mais fraco, ainda não solicitado para não criptografadas private.key senha

Jake Berger
fonte
excelente explicação
rizidoro
1
O Nginx pode ler chaves privadas criptografadas desde a versão 1.7.3, consulte: nginx.org/en/docs/http/…
5lava
2
Qual é o propósito de trazer o nginx e suas versões para a discussão? Além disso, (B) e (C) oferecem segurança equivalente (ou seja, ACLs de sistema de arquivos). O problema que você está descrevendo é o problema de armazenamento autônomo de chaves , e é um problema sem solução. Veja o livro de Segurança de Engenharia de Gutmann .
jww 01 de
@jww a questão pergunta "qual é o propósito ...". Considerei o contexto da pergunta (QnA para programadores), que tentei indicar por meio de "entretanto, sinto que o propósito (para programadores) é porque:". especificamente em relação à segurança .. pode ser uma discussão para security.stackexchange.com
Jake Berger,