Certificado SSL autoassinado inválido - “Nome alternativo do assunto ausente”

96

Recentemente, o Chrome parou de funcionar com meus certificados SSL autoassinados e acha que eles são inseguros. Quando eu olho para o certificado na DevTools | Securityguia, posso ver que diz

Nome alternativo do assunto ausente O certificado para este site não contém uma extensão de nome alternativo do assunto contendo um nome de domínio ou endereço IP.

Erro de certificado Há problemas com a cadeia de certificados do site (net :: ERR_CERT_COMMON_NAME_INVALID).

Como posso consertar isso?

Brad Parks
fonte
33
Como isso não é uma pergunta de programação ... é sobre certificados de auto-assinatura, que fazem parte da criação de sua pilha. ,,, Obrigado Brad
Sweet Chilly Philly
1
CN=www.example.comprovavelmente está errado. Os nomes de host sempre vão no SAN . Se estiver presente no CN , deve estar presente também no SAN (neste caso, você deve listá-lo duas vezes). Para obter mais regras e motivos, consulte Como você assina a solicitação de assinatura de certificado com sua autoridade de certificação e Como criar um certificado autoassinado com o openssl? Você também precisará colocar o certificado autoassinado no armazenamento confiável apropriado.
jww
@jww - esta não é uma duplicata da pergunta, já que você não precisa criar um certificado usando o openssl, você pode criá-lo com outras ferramentas.
Brad Parks
1
@BradParks - Hmmm ... A pergunta foi marcada como OpenSSL e a resposta aceita usa OpenSSL. Eu reabri e removi a tag OpenSSL.
jww

Respostas:

104

Para corrigir isso, você precisa fornecer um parâmetro extra ao opensslcriar o certificado, basicamente

-sha256 -extfile v3.ext

onde v3.extestá um arquivo como esse, com %%DOMAIN%%substituído pelo mesmo nome que você usa Common Name. Mais informações aqui e aqui . Observe que normalmente você definiria o Common Namee %%DOMAIN%%para o domínio para o qual está tentando gerar um certificado. Então, se fosse www.mysupersite.com, você usaria para ambos.

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%

Nota: Scripts que tratam desse problema e criam certificados SSL totalmente confiáveis ​​para uso no Chrome, Safari e de clientes Java podem ser encontrados aqui

Outra observação : se tudo o que você está tentando fazer é impedir que o Chrome emita erros ao visualizar um certificado autoassinado, você pode dizer ao Chrome para ignorar todos os erros de SSL para TODOS os sites, iniciando-o com uma opção de linha de comando especial, conforme detalhado aqui no SuperUser

Brad Parks
fonte
2
Não tenho certeza de qual versão do XAMPP você está usando, mas se você procurar uma linha nesse arquivo que contenha "openssl x509", deverá ser capaz de adicionar o código acima no final dessa linha no arquivo. Por exemplo, esta versão do makecert.bat , tem-no na linha 9, e acabaria sendo: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Claro que você ainda precisa salvar o v3.ext arquivo em um arquivo na mesma pasta.
Brad Parks
1
Desisti do Chrome depois de tentar de tudo e continuei com outro navegador. Poucos dias depois, hoje verifiquei com o chrome e funciona !!! O Chrome provavelmente tinha um bug e eles o consertaram. Seu método para falta de nome alternativo de assunto funciona !!!! Basta adicionar o certificado em certificados raiz confiáveis ​​no navegador.
Tarik
35
Eu estou conseguindo unknown option -extfile. Como faço para corrigir isso?
Nick Manning
2
@NickManning - Talvez você esteja usando a extfilediretiva no comando openssl errado? Em vez de ser usado em openssl req -new ..., é usado em openssl x509 -req .... Pelo menos foi o que alguém aqui disse , o que parece verdadeiro pelo exemplo que tenho em outra resposta a uma pergunta semelhante de como gerar totalmente esses certificados
Brad Parks
2
"fornecer um parâmetro extra para o openssl" Para qual comando especificamente? Existem várias etapas envolvidas e esta resposta é muito vaga: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/…
user145400
34

A solução a seguir funcionou para mim no Chrome 65 ( ref ) -

Crie um arquivo de configuração OpenSSL (exemplo: req.cnf)

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = company.net

Crie o certificado que faz referência a este arquivo de configuração

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Anshul
fonte
2
Isso é ótimo! Exatamente o que eu precisava, e ele ignora as solicitações irritantes de coisas como nome da empresa e estado, etc.
coredumperror
2
Tentei algumas soluções alternativas, mas esta é a única que funcionou para mim. THX!!
Mirko de
1
Você pode passar o assunto de uma linha de comando: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba
como você importou para o cromo? Não está basicConstraints = CA:truefaltando aqui ?
woodz
19

Bash Script

Criei um script bash para facilitar a geração de certificados TLS autoassinados que são válidos no Chrome.

Testado Chrome 65.xe ainda está funcionando. Certifique-se de reiniciar o Chrome após instalar novos certificados.

chrome://restart



Outros recursos

Outra ferramenta (muito mais robusta) que vale a pena conferir é o cfsslkit de ferramentas da CloudFlare :

Logan
fonte
2
Você deve adicionar o script aqui e explicá-lo.
jww
Parece um bom script. Mas um script não fornece (diretamente) uma resposta real para qual é o problema do OP. Talvez explique qual é o problema dele também.
bshea
4

Eu simplesmente uso o -subjparâmetro adicionando o endereço IP das máquinas. Então resolvido com apenas um comando.

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt

Você pode adicionar outros atributos como C, ST, L, O, OU, emailAddress para gerar certificados sem ser solicitado.

Ludwig
fonte
2
não funciona para. parece que o Chrome não reconhece SAN desta forma
mononoke
Tive "problemas ao fazer a solicitação de certificado" no OpenSSL 1.1.0b usando este comando.
Rick
Para mim (Windows) funcionava com uma sintaxe ligeiramente diferente: openssl.exe req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 365 -nodes -subj "/CN=my.domain.com" -addext "subjectAltName=DNS:my.domain.com" IIS então precisa do *.pfxformato:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek
3

Tive muitos problemas para obter certificados autoassinados trabalhando em macos / Chrome. Por fim, descobri Mkcert, "Uma ferramenta simples de configuração zero para criar certificados de desenvolvimento confiáveis ​​localmente com os nomes que você desejar." https://github.com/FiloSottile/mkcert

Anthony
fonte
Funciona no meu Windows 10 no novo Chrome também. Embora eu tenha que copiar os arquivos .pem da pasta padrão Windows \ system32 para outra, porque o Nginx não pode acessar esta pasta.
vatavale
2
  • Faça uma cópia de sua configuração OpenSSL em seu diretório inicial:

    cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
    

    ou no Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Adicione o nome alternativo do assunto a openssl-temp.cnf, em [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Substitua localhostpelo domínio para o qual você deseja gerar esse certificado.

  • Gerar certificado:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
        -config ~/openssl-temp.cnf
        -keyout /path/to/your.key -out /path/to/your.crt
    

Você pode então deletar openssl-temp.cnf

Vic Seedoubleyew
fonte
1

Consegui me livrar de (net :: ERR_CERT_AUTHORITY_INVALID) alterando o valor DNS.1 do arquivo v3.ext

[alt_names] DNS.1 = domainname.com

Altere domainname.com com seu próprio domínio.

Junho ver
fonte
1

Esta é uma maneira muito simples de criar um certificado IP em que o Chrome confie.

O arquivo ssl.conf ...

[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt             = no

[ req_distinguished_name ]
commonName                  = 192.168.1.10

[ req_ext ]
subjectAltName = IP:192.168.1.10

Onde, é claro, 192.168.1.10 é o IP da rede local que queremos que o Chrome confie.

Crie o certificado:

openssl genrsa -out key1.pem
openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
rm csr1.pem

No Windows, importe o certificado para o Armazenamento de certificados raiz confiável em todas as máquinas clientes. No telefone ou tablet Android, baixe o certificado para instalá-lo. Agora o Chrome vai confiar no certificado no Windows e no Android.

Na caixa de desenvolvimento do Windows, o melhor lugar para obter o openssl.exe é em "c: \ Arquivos de programas \ Git \ usr \ bin \ openssl.exe"

AQuirky
fonte
0

no MAC a partir do Chrome Versão 67.0.3396.99 meu certificado autoassinado parou de funcionar.

regeneração com tudo o que está escrito aqui não funcionou.

ATUALIZAR

tive a chance de confirmar que minha abordagem funciona hoje :). Se não funcionar para você, certifique-se de usar esta abordagem

v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
$

copiado daqui https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

END UPDATE

finalmente consegui ver o verde Seguro apenas quando removi meu certificado do sistema e o adicionei ao chaveiro local . (se houver um - largue-o primeiro).Não tenho certeza se isso importa, mas no meu caso eu baixei o certificado via chrome e verifiquei que a data de criação é hoje - então é o que acabei de criar.

espero que seja útil para alguém passar um dia nisso.

nunca atualize o Chrome!

user2932688
fonte
0

Se você deseja executar o servidor localhost, é necessário configurar CN = localhoste DNS.1 = localhost.

[req]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
prompt = no
prompt = no
x509_extensions = v3_req

[req_distinguished_name]
C = BR
CN = localhost
[email protected]
L = Sao Paulo
O = example.com
OU = example.com
ST = Sao Paulo

[v3_req]
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
Washington Botelho
fonte