A partir do Chrome 58, ele não aceita mais certificados autoassinados que dependem de Common Name
: https://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place=topicsearchin/chrome/category $3ACanary%7Csort: relevância%7Cfeitiço:falso
Em vez disso, requer o uso de Subject Alt Name
. Anteriormente, segui este guia sobre como gerar um certificado autoassinado: https://devcenter.heroku.com/articles/ssl-certificate-self que funcionou muito bem porque exigi os arquivos server.crt
e server.key
para o que estou fazendo. Agora preciso gerar novos certificados que incluam o SAN
no entanto, todas as minhas tentativas de fazer isso não funcionaram com o Chrome 58.
Aqui está o que eu fiz:
Segui as etapas do artigo Heroku mencionado acima para gerar a chave. Em seguida, escrevi um novo arquivo de configuração do OpenSSL:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
Em seguida, gerou o server.crt
com o seguinte comando:
openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650
Estou em um Mac, então abri o server.crt
arquivo com o Keychain e o adicionei aos meus Certificados do Sistema. Eu então configurei para Always Trust
.
Com exceção do arquivo de configuração para definir o valor SAN, essas foram etapas semelhantes que usei em versões anteriores do Chrome para gerar e confiar no certificado autoassinado.
No entanto, depois disso, ainda recebo ERR_CERT_COMMON_NAME_INVALID
no Chrome 58.
Minha solução:
Estado: Funciona para mim
Aqui está uma solução que funciona para mim:
Criar chave CA e certificado
Criar server_rootCA.csr.cnf
Criar arquivo de configuração v3.ext
Criar chave do servidor
Criar certificado de servidor
Adicionar certificado e chave ao arquivo do site Apache2, seção HTTPS (porta 443)
Copie server_rootCA.pem do servidor para sua máquina.
.. e adicione-o ao navegador Chromium
VOCÊ ESTÁ TERMINADO!
PS Em vez de criar um par funcional de certificado de CA e servidor (conforme as instruções acima), você pode simplesmente desativar os cabeçalhos HSTS na configuração do servidor HTTP. Isso impedirá que o Chromium imponha HTTPS e permitirá que os usuários cliquem em “Avançado → prosseguir para seu.url (inseguro)” sem precisar obter e instalar seu certificado CA personalizado (server_rootCA.pem). Em outras palavras - ter que desabilitar o HSTS permitirá que seu site seja visualizado publicamente por HTTP e/ou conexão HTTPS insegura (cuidado!).
Para Apache2, adicione o seguinte ao arquivo do site, seção HTTP (porta 80)
Testado em Debian/Apache2.4 + Debian/Chromium 59
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
No Windows, salve este script em sua pasta SSL como makeCERT.bat. Ele criará estes arquivos: example.cnf, example.crt, example.key
Existem várias ótimas respostas que fornecem exemplos de como fazer isso funcionar, mas nenhuma que explique onde as coisas deram errado em sua tentativa. O OpenSSL pode ser bastante não intuitivo algumas vezes, então vale a pena dar uma olhada.
Primeiro, como um aparte, o padrão do OpenSSL é ignorar qualquer valor de nome distinto que você forneça no arquivo config. Se você quiser usá-los, você deve adicionar
prompt = no
à sua configuração. Além disso, o comando conforme escrito gera apenas uma solicitação de certificado , não um certificado em si, portanto, o-days
comando não faz nada.Se você gerar sua solicitação de certificado usando este comando que você deu e inspecionar o resultado, o Subject Alt Name estará presente:
Mas, se você gerar o certificado usando o comando no link heroku e inspecionar o resultado, o nome alternativo do assunto estará ausente:
A razão é que, por padrão, o OpenSSL não copia extensões da solicitação para o certificado. Normalmente, o certificado seria criado/assinado por uma CA com base em uma solicitação de um cliente, e algumas extensões poderiam conceder ao certificado mais poder do que a CA pretendia se confiassem cegamente nas extensões definidas na solicitação.
Existem maneiras de dizer ao OpenSSL para copiar as extensões, mas IMHO é mais trabalhoso do que apenas fornecer as extensões em um arquivo de configuração ao gerar o certificado.
Se você tentar usar seu arquivo de configuração existente, não funcionará porque a seção de nível superior está marcada
[req]
para que essas configurações se apliquem apenas ao comando req, não ao comando x509. Não é necessário ter um marcador de seção de nível superior, portanto, basta remover a primeira linha e funcionará bem para gerar solicitações ou certificados.Como alternativa, você pode usar o
-x509
argumento para oreq
comando para gerar um certificado autoassinado em um único comando, em vez de primeiro criar uma solicitação e depois um certificado. Neste caso não é necessário remover a[req]
linha da seção, pois essa seção é lida e utilizada pelo comando req.Para recapitular, aqui está o arquivo de configuração modificado usado nos comandos acima:
Script Bash com configuração incorporada
Como um script de shell que deve funcionar em plataformas com o bash. Assume
HOSTNAME
env definido para o shell ou fornece um nome de host de sua escolha, por exemploself_signed_cert.sh test
O acima mais ou menos injeta as informações mínimas do arquivo de configuração que o openssl precisa.
Observação, incluído extra
DNS:localhost
como SAN para permitir testes via localhost com mais facilidade. Remova esse bit extra do script se não quiser.Crédito
A resposta de bcardarella é ótima (não pode comentar/votar devido a representante insuficiente). No entanto, a resposta usa um local de arquivo de configuração openssl existente que é específico da plataforma ... portanto:
Obviamente, bastaria encontrar o arquivo de configuração openssl para sua própria plataforma e substituí-lo pelo local correto.
Teste
Para uma maneira de testar, importe
test.cert.pem
para as autoridades do Chrome emchrome://settings/certificates
e:E depois de testar
Minha solução é manter o principal
openssl.cnf
como está e apenas no final adicionar uma nova seção como[ cert_www.example.com ]
onde www.example.com é o site para o qual desejo criar um certificado e, nele, colocar osubjectAltName
que eu precisaria (e algo mais). Claro que a seção pode ter o nome que você quiser.Depois disso, posso executar o
openssl req
comando como antes, apenas adicionando-extensions cert_www.example.com
para que seu conteúdo seja pego e adiciono-subj
para adicionar diretamente todas as informações do DN.Não se esqueça de verificar o conteúdo do certificado após a sua criação e antes da sua utilização, com
openssl x509 -text