SSL: erro: 0B080074: rotinas de certificado x509: X509_check_private_key: valores-chave incompatíveis

99

Não consigo configurar SSL. Eu pesquisei no Google e encontrei algumas soluções, mas nenhuma delas funcionou para mim. Eu preciso de ajuda, por favor...

Aqui está o erro que recebo quando tento reiniciar o nginx:

root@s17925268:~# service nginx restart
Restarting nginx: nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/conf.d/ssl/ssl.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed

Meu certificado é da StartSSL e é válido por 1 ano.

Aqui está o que testei:

  • O certificado e a chave privada não têm espaços à direita.
  • Não estou usando o arquivo server.key padrão.
  • Verifiquei o nginx.conf e as diretivas estão apontando para a chave privada e o certificado corretos.

Eu também verifiquei o módulo e obtive um módulo diferente para a chave e o certificado.

Obrigado pela ajuda. :)

Galou
fonte

Respostas:

36

Recebi um hash MD5 com resultados diferentes para a chave e o certificado.

Isso diz tudo. Você tem uma incompatibilidade entre sua chave e certificado.

O módulo deve corresponder. Certifique-se de ter a chave correta.

dev0z
fonte
A menos que eu esteja faltando alguma coisa, você QUER absolutamente que as chaves pública e privada (o arquivo do certificado e o arquivo da chave) sejam diferentes.
Mark Berry
1
As modulus' and the porções do expoente público na chave e no certificado devem corresponder. Sem dúvida, os arquivos são diferentes. A chave é gerada para um certificado particular.
dev0z
Foi mal. Achei que ele estava se referindo ao MD5 dos arquivos. Vejo agora que os certificados têm uma função de módulo separada: Como confirmar se o módulo em sua chave privada corresponde ao módulo em sua chave pública de certificado SSL / TLS antes da instalação? .
Mark Berry
165

Depois de estabelecer que eles não correspondem, você ainda tem um problema - o que fazer a respeito. Freqüentemente, o certificado pode simplesmente ser montado incorretamente. Quando uma CA assina seu certificado, eles enviam a você um bloco que se parece com

-----BEGIN CERTIFICATE-----
MIIAA-and-a-buncha-nonsense-that-is-your-certificate
-and-a-buncha-nonsense-that-is-your-certificate-and-
a-buncha-nonsense-that-is-your-certificate-and-a-bun
cha-nonsense-that-is-your-certificate-and-a-buncha-n
onsense-that-is-your-certificate-AA+
-----END CERTIFICATE-----

eles também enviarão um pacote (geralmente dois certificados) que representa sua autoridade para conceder um certificado a você. isso vai se parecer com algo como

-----BEGIN CERTIFICATE-----
MIICC-this-is-the-certificate-that-signed-your-request
-this-is-the-certificate-that-signed-your-request-this
-is-the-certificate-that-signed-your-request-this-is-t
he-certificate-that-signed-your-request-this-is-the-ce
rtificate-that-signed-your-request-A
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICC-this-is-the-certificate-that-signed-for-that-one
-this-is-the-certificate-that-signed-for-that-one-this
-is-the-certificate-that-signed-for-that-one-this-is-t
he-certificate-that-signed-for-that-one-this-is-the-ce
rtificate-that-signed-for-that-one-this-is-the-certifi
cate-that-signed-for-that-one-AA
-----END CERTIFICATE-----

exceto que, infelizmente, eles não serão identificados de forma tão clara.

uma prática comum, então, é agrupar tudo isso em um arquivo - o seu certificado, depois os certificados de assinatura. Mas, uma vez que não são facilmente distinguidos, às vezes acontece que alguém os coloca acidentalmente na outra ordem - assinando certificados, depois o certificado final - sem perceber. Nesse caso, seu certificado não corresponderá à sua chave.

Você pode testar para ver o que o certificado pensa que representa executando

openssl x509 -noout -text -in yourcert.cert

Próximo ao topo, você deverá ver "Assunto:" e outras coisas que se parecem com seus dados. Se, em vez disso, ele se parecer com sua CA, seu pacote provavelmente está na ordem errada; você pode tentar fazer um backup e mover o último certificado para o início, esperando que seja esse o seu certificado.

Se isso não funcionar, talvez você precise reemitir o certificado. Quando eu faço um CSR, gosto de rotular claramente para qual servidor ele se destina (em vez de apenas ssl.key ou server.key) e faço uma cópia dele com a data no nome, como mydomain.20150306.key etc. é improvável que os pares de chaves privadas e públicas se misturem com outro conjunto.

Vynce
fonte
1
Isso corrigiu para mim no Nginx!
TTT
24
Grande +1 para mostrar como ver o que está na cadeia de certificados.
cbednarski
Definitivamente útil, passei uma hora tentando entender por que o nginx estava recusando o certificado enquanto eu podia ver que ele continha os dados
Jacopofar
3
Ok, isso também funcionou para mim com um certificado Comodo e Ngix. Empurrei o último bloco de certificado para o topo. Obrigado pela explicação detalhada e visão sobre este problema.
Andy D
1
Isso me ajuda a! Resposta muito útil! Muito obrigado!
Oleg Klimenko de
70
  1. Certifique-se de que seu certificado e chave estejam no formato PEM. Caso contrário, converta-os usando o comando openssl
  2. Verifique um hash MD5 da chave pública para garantir que corresponde ao que está em uma chave privada

    openssl x509 -noout -modulus -in certificate.crt | openssl md5
    openssl rsa -noout -modulus -in privateKey.key | openssl md5
    
dev0z
fonte
7
Bom conselho ! Bem, ainda obterá o mesmo erro mesmo se o hash md5 for o mesmo para mim ^^
Delphine
4
Obrigado por incluir como verificar os hashes. Eu descobri que tinha um erro de copiar e colar e estava faltando um único traço no início do meu pem. Você acabou de me salvar de muitas dores de cabeça. Felicidades.
Justin Fortier
38

Tive esse problema porque estava adicionando o pacote e o certificado na ordem errada, então talvez isso pudesse ajudar outra pessoa.

Antes (o que está errado):

cat ca_bundle.crt certificate.crt > bundle_chained.crt

Depois (o que é certo)

cat certificate.crt ca_bundle.crt > bundle_chained.crt

E não se esqueça de atualizar o conf apropriado (ssl_certificate agora deve apontar para o crt encadeado) como

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     bundle_chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

De manual nginx :

Se o certificado do servidor e o pacote forem concatenados na ordem errada, o nginx falhará ao iniciar e exibirá a mensagem de erro:

SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)
Mandeep Gill
fonte
3
Na verdade, essa é uma resposta melhor a essa pergunta do que uma aceita.
baldrs
9

Se isso acontecer e você estiver usando o Let's Encrypt / certbot, é provável que você tenha usado em chain.pemvez defullchain.pem .

Deve ser algo assim:

ssl_certificate /etc/certbot/live/example.com/fullchain.pem;
ssl_certificate_key /etc/certbot/live/example.com/privkey.pem;

Consulte a documentação do certbot “Onde estão meus certificados?”

Mariana
fonte
Ou a ordem dos certificados no pacote está errada: primeiro permite criptografar, depois o próprio certificado.
ingopingo
5

Eu tive o mesmo problema e finalmente resolvi alterando a ordem dos blocos pem no arquivo de certificado.

O bloco certificado deve ser colocado no início do arquivo, em seguida nos blocos intermediários e, em seguida, no bloco raiz.

Percebi esse problema comparando um arquivo de certificado problemático com um arquivo de certificado em funcionamento.

Fuweichin
fonte
1

Meus 5 centavos sobre o assunto:

Eu tive o mesmo problema. Após cerca de 1 hora cuidando dele, descobri que colei o certificado incorretamente.

Se você tiver um erro como este, verifique seu certificado.

usuario
fonte
1

No meu caso, queria mudar o certificado SSL, porque mudei meu servidor, então tive que criar um novo CSR com este comando:

 openssl req -new -newkey rsa:2048 -nodes -keyout mysite.key -out mysite.csr

Enviei o arquivo mysite.csr para o provedor SSL da empresa e depois de receber o certificado crt, reiniciei o nginx e recebi este erro

 (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)

Depois de muita investigação, o erro era que o módulo do arquivo de chave não era o mesmo do arquivo crt

Então, para fazer funcionar, criei um novo arquivo csr, mas tenho que mudar o nome do arquivo com este comando

 openssl req -new -newkey rsa:2048 -nodes -keyout mysite_new.key -out mysite_new.csr

Então recebi um novo arquivo crt do provedor da empresa, reinicie o nginx e funcionou.

peixe limão
fonte
0

Isso também pode acontecer quando sua CA emite um certificado intermediário

Encontrei este problema (duas vezes) com o nginx e nenhuma das soluções neste post explicou o problema. A postagem do blog aqui por um cavalheiro legal chamado Marco acertou em cheio, e eu estou colando aqui para qualquer um que também topar com o que eu estava vendo. https://medium.com/@mrkdsgn/steps-to-install-a-go-daddy-ssl-certificate-on-nginx-on-ubuntu-14-04-ff942b9fd7ff

No meu caso, go-daddy era o CA e isso é específico para a forma como eles emitem o cert e os bundles de cert intermediários.

Aqui está o trecho da postagem do blog de Marco

Com o Nginx, se sua CA incluiu um certificado intermediário, você deve criar um único arquivo de certificado em cadeia que contenha seu certificado e os certificados intermediários da CA.

Você pode usar este comando para criar um arquivo combinado chamado example.com.chained.crt:

cat example.com.crt intermediate.crt > example.com.chained.crt

Shyam Habarakada
fonte
0

No meu caso, o problema é que crio sertificados sem inserir nenhum dado na interface CLI. Quando eu regenerei os certificados e inseri todos os campos: Cidade, Estado, etc., tudo ficou bem.

 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Viktor Kruglikov
fonte
0

Aconteceu comigo quando combinei o bundle.crt e o cert principal. O motivo foi que copiei o certificado principal abaixo de bundle.crt. Deveria ser o contrário

1 / cert principal 2 / bundle.crt

Krishna
fonte
0

Para Nginx:

  1. openssl req -newkey rsa:2048 -nodes -keyout domain.com.key -out domain.com.csr

  2. Arquivo domain_com.crte domain_com.ca-bundlearquivos SSL e , em seguida, copie o novo arquivo e cole domain.com.chained.crt.

3: Adicionar arquivos nginx:

  1. ssl_certificate /home/user/domain_ssl/domain.com.chained.crt;
  2. ssl_certificate_key /home/user/domain_ssl/domain.com.key;

Lates reinicie o Nginx.

eletrocoder
fonte
0

SL_CTX_use_PrivateKey ("/ etc / nginx / ssl / file") falhou (SSL: erro: 0B080074: rotinas de certificado x509: X509_check_private_key: valores-chave incompatíveis)

Este erro pode ocorrer quando a chave privada do certificado ( ssl_certificate_keypor exemplo, .keyou .pemarquivo) não corresponde ao arquivo de certificado público ( ssl_certificate) em sua configuração Nginx (check nginx.confou insites-enabled/ ). Certifique-se de que os dois arquivos são correspondentes.

Verifique os logs de erros do Nginx para obter mais detalhes (por exemplo /var/log/nginx/error.log).

Kenorb
fonte
0

No meu caso tenho que concatenar os certs do meu domínio.

cat myDomain.crt EntityCertCA.crt TrustedRoot.crt > bundle.crt

E no arquivo de configuração /etc/nginx/nginx.conf

 ssl_certificate "/etc/pki/nginx/bundle.crt";

Reinicie o serviço e tudo ok.

systemctl restart nginx.service

Fonte da etapa 2: https://www.namecheap.com/support/knowledgebase/article.aspx/9781/2238/nginx-ssl-error0b080074x509-certificate-routines-x509checkprivatekeykey-values-mismatch

mariofertc
fonte