Evitar solicitação de senha para chaves e solicitações de informações de DN

90

Estou usando o seguinte código para gerar chaves:

apt-get -qq -y install openssl;
mkdir -p /etc/apache2/ssl;
openssl genrsa -des3 -out server.key 1024;
openssl req -new -key server.key -out server.csr;
cp server.key server.key.org;
openssl rsa -in server.key.org -out server.key;
openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt;
mv server.crt  /etc/apache2/ssl/cert.pem;
mv server.key  /etc/apache2/ssl/cert.key;
rm -f server.key.orig;
rm -f server.csr

Eu tenho duas perguntas:

  1. Como posso ignorar a solicitação da frase secreta? Seria razoavelmente seguro para mim fazer isso? (como não deve ser totalmente tolo, como alguém deveria conseguir hackear o certificado)

  2. Como evito a solicitação do nome do país, organização etc. Espero poder fornecer a eles no prompt de comando (a página de manual mostra apenas as opções de nível superior para o OpenSSL)

jww
fonte

Respostas:

150

Edit: Esta é de longe a minha resposta mais popular, e já faz alguns anos, então eu adicionei uma variante ECDSA. Se você pode usar o ECDSA, deve.


Você pode fornecer todas essas informações na linha de comando.

Geração de certificado sem senha autoassinada em uma etapa:

Versão RSA

openssl req \
    -new \
    -newkey rsa:4096 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Versão ECDSA

openssl req \
    -new \
    -newkey ec \
    -pkeyopt ec_paramgen_curve:prime256v1 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Todos os subcomandos openssl têm sua própria página de manual. Veja man req.


Abordar especificamente suas perguntas e ser mais explícito sobre exatamente quais opções estão em vigor:

  1. O -nodessinalizador sinaliza para não criptografar a chave; portanto, você não precisa de uma senha. Você também pode usar a -passout argbandeira. Veja PASS PHRASE ARGUMENTSna openssl(1)página de manual como formatar o argumento.

  2. Usando a -subjbandeira, você pode especificar o assunto (o exemplo está acima).

bahamat
fonte
3
Ler coisas via "-subj" funciona muito bem, no entanto - para mim - somente quando OPENSSL_CONF NÃO está definido. IOW: se OPENSSL_CONF estiver definido, o OpenSSL tentará ler a partir daí e ignorará o argumento da linha de comandos "-subj". Levei um tempo para descobrir.
oberstet 27/03
oberstet: Sim, isso é verdade.
bahamat
É possível passar a própria chave de assunto do stdin? Eu tentei "-key stdin", "-key fd: 1" e "-key -" .. sem sorte.
oberstet
1
@ JeremyBaker: Não, você precisará de um processo de duas etapas para isso. Omita -x509e -daysgere um CSR em vez de um certificado e use o método de assinatura CA usual.
bahamat
1
@jww - e chegou a hora. A partir do Chrome v58, ao tentar carregar uma página segura, mas o certificado não contém um subjectAltName correspondente, ele mostra uma página de erro de privacidade com a mensagem de erro "NET :: ERR_CERT_COMMON_NAME_INVALID". Clicar no botão avançado mostra a mensagem "... seu certificado de segurança é de [missing_subjectAltName]"
Insomniac Software
11

A -passinopção não faz o truque para você?

Com o file:pathnameformulário, você pode estar bastante seguro com as permissões 600 para esse arquivo.

9000
fonte
Vi a opção na página de manual. Parece que posso ter a senha dessa maneira sem avisar. Obrigado!
E com -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/...
andras.tim
5

A resposta aceita precisa de algumas pequenas correções. Linhas da CE:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

deveria estar:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

No MacOS - OpenSSL 1.0.2f instalado via brew, verifiquei a resposta aceita como descrito abaixo

  • Para listar as curvas elípticas disponíveis:

    $ openssl ecparam -list_curves
    
  • Para gerar um arquivo de chave:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Para gerar o certificado sem solicitação de senha:

    openssl req \
        -new \
        -newkey ec:secp256k1.pem \
        -days 365 \
        -nodes \
        -x509 \
        -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \
        -keyout server.key \
        -out server.crt
    
  • Para visualizar o certificado:

    $ openssl x509 -noout -text -in server.crt
    
Andrei Sura
fonte
Como isso é diferente da resposta aceita?
Ramhound
1
A única diferença importante é que listo explicitamente a etapa de geração do arquivo pem. A resposta aceita está faltando os dois caracteres \ e me fez pensar que o comando está incorreto.
Andrei Sura
1
Você pode mencionar esse fato. Se a resposta aceita é realmente incompleta e faltam caracteres, é importante destacar as diferenças e como sua resposta contém informações importantes e significativas.
Ramhound
3

Tente o seguinte comando:

openssl genrsa -des3 -out user.key -passout pass:foo 1024

A parte pular é: -passout pass:foo.

kenorb
fonte
2

@bahamat tem uma ótima resposta. Infelizmente, algumas versões do openssl geram um erro ao tentar criar um certificado ECDSA com um comando. O erro é algo como:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404

Eu estava usando openssl 1.0.1e-fipsno CentOS 7.

Criar seu certificado com os três comandos a seguir parece funcionar:

openssl ecparam -genkey -name prime256v1 -out key.pem
openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem
jxmallett
fonte
A última linha não deveria terminar com server.crt?
ᴠɪɴᴄᴇɴᴛ