Questão Evite a solicitação de senha para chaves e solicita informações de DN


Eu 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 pergunta da frase secreta? Seria razoavelmente seguro para mim fazer isso? (como em não deve ser absolutamente tolo como alguém deve ser capaz de hackear o certificado)

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


82


origem




Respostas:


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


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

Geração de certificado sem senha autoassinado de 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 possuem sua própria página man. Vejo man req.


Especificamente abordando suas dúvidas e para ser mais explícito sobre exatamente quais opções estão em vigor:

  1. o -nodes sinalizador para não criptografar a chave, assim você não precisa de uma senha. Você também pode usar o -passout arg bandeira. Vejo PASS PHRASE ARGUMENTS no openssl(1) página man de como formatar o arg.

  2. Usando o -subj flag você pode especificar o assunto (o exemplo está acima).


136



Ler coisas através de "-subj" funciona muito bem, no entanto - só para mim - quando OPENSSL_CONF NÃO está definido. IOW: se OPENSSL_CONF estiver definido, o OpenSSL tentará ler a partir daí, e ignorar "-subj" argumento de linha de comando. Demorei um pouco para descobrir. - oberstet
oberstet: Sim, isso é verdade. - bahamat
É possível passar o assunto chave em si de stdin? Eu tentei "-key stdin", "-key fd: 1" e "-key -" .. sem sorte. - oberstet
@ JeremyBaker: Não, você precisará de um processo de duas etapas para isso. Omitir o -x509 e -days para gerar um CSR em vez de um certificado, use seu método usual de assinatura da CA. - bahamat
@ jww - e essa hora chegou. 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


Não faz -passin opção faz o truque para você?

Com file:pathname forma você pode ser bastante seguro com permissões 600 para esse arquivo.


7



Vi a opção na página man. Parece que posso ter a frase secreta dessa maneira sem avisar. Obrigado!


A resposta aceita precisa de algumas pequenas correções. Linhas 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 eu verifiquei a resposta aceita como descrito abaixo

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

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

    $ 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 ver o certificado:

    $ openssl x509 -noout -text -in server.crt
    

2



Como isso é diferente da resposta aceita? - Ramhound
A única diferença importante é que eu listo explicitamente a etapa de geração do arquivo pem. A resposta aceita está faltando os dois personagens e me fez pensar que o comando está incorreto. - Andrei Sura
Você pode querer mencionar esse fato. Se a resposta aceita for realmente incompleta e estiver faltando caracteres, é importante destacar as diferenças e como sua resposta contém informações importantes importantes. - Ramhound


@bahamat tem uma ótima resposta. Infelizmente, algumas versões do openssl lançam 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-fips em CentOS 7.

Criar seu certificado com os 3 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

1



Não deve a última linha terminar com server.crt? - ᴠɪɴᴄᴇɴᴛ


Tente o seguinte comando:

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

A parte de salto é: -passout pass:foo.


0