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.
@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
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
Respostas:
A opção
-nodes
nã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
-nodes
e 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
: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.
fonte
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
-nodes
meios 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.plno entanto, sinto que o objetivo (para programadores) é porque:
ssl_password_file file.keys;
emhttp { }
ouserver { }
contexto. [ ref ]-nodes
para criar private.key sem criptografiaútil: bloquear private.key
sudo chown root:ssl-cert private.key
- ch ange própria er de private.key a raiz do usuário, ssl-cert gruposudo chmod 640 private.key
- alterar as permissões de acesso da chave privada para o proprietário R / W, grupo ROpçã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
fonte