Estou adicionando suporte HTTPS a um dispositivo Linux incorporado. Eu tentei gerar um certificado autoassinado com estas etapas:
openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
Isso funciona, mas eu recebo alguns erros com, por exemplo, o Google Chrome:
Este provavelmente não é o site que você está procurando!
O certificado de segurança do site não é confiável!
Estou esquecendo de algo? Essa é a maneira correta de criar um certificado autoassinado?
ssl
openssl
certificate
ssl-certificate
x509certificate
michelemarcon
fonte
fonte
alternate_names
seção e passá-lo com a-config
opção Além disso, a colocação de um nome DNS no Nome Comum (CN) é preterida (mas não proibida) pelos IETF e pelos Fóruns da CA / Navegador. Qualquer nome DNS na CN também deve estar presente na SAN. Não há como evitar o uso da SAN. Veja a resposta abaixo.Respostas:
Você pode fazer isso em um comando:
Você também pode adicionar
-nodes
(abreviação deno DES
) se não quiser proteger sua chave privada com uma senha. Caso contrário, ele solicitará a senha "pelo menos 4 caracteres".O
days
parâmetro (365) pode ser substituído por qualquer número para afetar a data de validade. Em seguida, será solicitado itens como "Nome do país", mas você pode simplesmente clicar Entere aceitar os padrões.Adicione
-subj '/CN=localhost'
para suprimir perguntas sobre o conteúdo do certificado (substitualocalhost
pelo domínio desejado).Os certificados autoassinados não são validados com terceiros, a menos que você os importe para os navegadores anteriormente. Se você precisar de mais segurança, use um certificado assinado por uma autoridade de certificação (CA).
fonte
-subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=www.example.com"
-sha256
para gerar o certificado baseado em SHA-256.É fácil criar um certificado autoassinado. Você acabou de usar o
openssl req
comando Pode ser complicado criar um que possa ser consumido pela maior seleção de clientes, como navegadores e ferramentas de linha de comando.É difícil porque os navegadores têm seu próprio conjunto de requisitos e são mais restritivos que o IETF . Os requisitos usados pelos navegadores estão documentados nos fóruns da CA / navegador (consulte as referências abaixo). As restrições surgem em duas áreas principais: (1) âncoras confiáveis e (2) nomes DNS.
Os navegadores modernos (como o warez que estamos usando em 2014/2015) desejam um certificado que seja vinculado a uma âncora de confiança e desejam que os nomes DNS sejam apresentados de maneiras específicas no certificado. E os navegadores estão se movendo ativamente contra certificados de servidor autoassinado.
Alguns navegadores não facilitam exatamente a importação de um certificado de servidor autoassinado. Na verdade, você não pode usar alguns navegadores, como o Android. Portanto, a solução completa é se tornar sua própria autoridade.
Na ausência de se tornar sua própria autoridade, é necessário acertar os nomes DNS para dar ao certificado a maior chance de sucesso. Mas eu encorajaria você a se tornar sua própria autoridade. É fácil tornar-se sua própria autoridade e contornar todos os problemas de confiança (em quem é melhor confiar do que você?).
Isso ocorre porque os navegadores usam uma lista predefinida de âncoras confiáveis para validar certificados de servidor. Um certificado autoassinado não volta para uma âncora confiável.
A melhor maneira de evitar isso é:
Etapa 1 - Crie sua própria autoridade significa apenas criar um certificado autoassinado com
CA: true
o uso adequado da chave. Isso significa que o Assunto e o emissor são a mesma entidade, a CA é configurada como verdadeira em Restrições básicas (também deve ser marcada como crítica), o uso da chave ékeyCertSign
ecrlSign
(se você estiver usando CRLs) e o Identificador de chave do sujeito (SKI) é o mesmo que o AKI ( Authority Key Identifier ).Para se tornar sua própria autoridade de certificação, consulte * Como você assina uma solicitação de assinatura de certificado com sua autoridade de certificação? no estouro de pilha. Em seguida, importe sua CA para o Trust Store usado pelo navegador.
As etapas 2 a 4 são basicamente o que você faz agora para um servidor público ao recrutar os serviços de uma CA como a Startcom ou CAcert . As etapas 1 e 5 permitem evitar a autoridade de terceiros e agir como sua própria autoridade (em quem é melhor confiar do que você?).
A próxima melhor maneira de evitar o aviso do navegador é confiar no certificado do servidor. Mas alguns navegadores, como o navegador padrão do Android, não permitem isso. Portanto, nunca funcionará na plataforma.
A questão de navegadores (e outros agentes de usuário semelhantes) não confiarem em certificados autoassinados será um grande problema na Internet das Coisas (IoT). Por exemplo, o que acontecerá quando você se conectar ao termostato ou à geladeira para programá-lo? A resposta é: nada de bom no que diz respeito à experiência do usuário.
O grupo de trabalho WebAppSec do W3C está começando a analisar o problema. Consulte, por exemplo, Proposta: Marcando HTTP como Não Seguro .
Os comandos abaixo e o arquivo de configuração criam um certificado autoassinado (também mostra como criar uma solicitação de assinatura). Eles diferem de outras respostas em um aspecto: os nomes DNS usados para o certificado autoassinado estão no Nome Alternativo do Assunto (SAN) e não no Nome Comum (CN) .
Os nomes DNS são colocados na SAN através do arquivo de configuração com a linha
subjectAltName = @alternate_names
(não há como fazê-lo através da linha de comando). Depois, há umaalternate_names
seção no arquivo de configuração (você deve ajustar isso de acordo com o seu gosto):É importante colocar o nome DNS na SAN e não o CN, porque ambos o IETF eo CA / Fórum do navegador especificar a prática. Eles também especificam que os nomes DNS na CN são preteridos (mas não proibidos). Se você colocar um nome DNS no CN, ele deverá ser incluído na SAN nas políticas da CA / B. Portanto, você não pode evitar o uso do Nome alternativo do assunto.
Se você não colocar nomes DNS na SAN, o certificado falhará na validação em um navegador e outros agentes de usuário que sigam as diretrizes do CA / Forum do navegador.
Relacionado: os navegadores seguem as políticas do CA / Browser Forum; e não as políticas da IETF. Essa é uma das razões pelas quais um certificado criado com o OpenSSL (que geralmente segue o IETF) às vezes não é validado em um navegador (os navegadores seguem o CA / B). São padrões diferentes, têm políticas de emissão diferentes e requisitos de validação diferentes.
Crie um certificado autoassinado (observe a adição da
-x509
opção):Crie uma solicitação de assinatura (observe a falta de
-x509
opção):Imprima um certificado autoassinado :
Imprima uma solicitação de assinatura :
Arquivo de configuração (passado via
-config
opção)Pode ser necessário fazer o seguinte no Chrome. Caso contrário, o Chrome poderá reclamar que um Nome Comum é inválido (
ERR_CERT_COMMON_NAME_INVALID
) . Não tenho certeza de qual é a relação entre um endereço IP na SAN e uma CN nessa instância.Existem outras regras relacionadas ao tratamento de nomes DNS nos certificados X.509 / PKIX. Refira estes documentos para as regras:
As RFC 6797 e RFC 7469 são listadas, porque são mais restritivas que os outros RFCs e documentos CA / B. Os RFCs 6797 e 7469 também não permitem um endereço IP.
fonte
alternate_names
seção? Particularmente sub-sub domínios. Eu tenho uma pergunta referenciando esta resposta aqui: serverfault.com/questions/711596/...Aqui estão as opções descritas na resposta do @ diegows , descritas em mais detalhes, na documentação :
A documentação é realmente mais detalhada que a anterior; Acabei de resumir aqui.
fonte
XXX
comando original deve ser substituído pelo 'número de dias para certificação do certificado'. O padrão é 30 dias. Por exemplo,-days XXX
torna--days 365
se se você deseja que seu certificado seja válido por 365 dias. Veja os documentos para mais .A partir de 2020, o comando a seguir atende a todas as suas necessidades, incluindo SAN:
No OpenSSL ≥ 1.1.1, isso pode ser reduzido para:
Ele cria um certificado que é
example.com
eexample.net
(SAN),10.0.0.1
(SAN),3650
dias (~ 10 anos).Ele cria os seguintes arquivos:
example.key
example.crt
Todas as informações são fornecidas na linha de comando. Não há entrada interativa que o irrite. Não há arquivos de configuração com os quais você precise mexer. Todas as etapas necessárias são executadas por uma única chamada OpenSSL : da geração da chave privada até o certificado autoassinado.
Observação 1: parâmetros de criptografia
Como o certificado é autoassinado e precisa ser aceito pelos usuários manualmente, não faz sentido usar uma expiração curta ou criptografia fraca.
No futuro, convém usar mais de
4096
bits para a chave RSA e um algoritmo de hash mais forte quesha256
, mas, a partir de 2020, esses são valores sãos. Eles são suficientemente fortes enquanto são suportados por todos os navegadores modernos.Observação 2: Parâmetro "
-nodes
"Teoricamente, você poderia deixar de fora o
-nodes
parâmetro (que significa "sem criptografia DES"), caso em queexample.key
seria criptografado com uma senha. No entanto, isso quase nunca é útil para uma instalação do servidor, porque você também precisará armazenar a senha no servidor ou inseri-la manualmente em cada reinicialização.Observação 3: Veja também
fonte
//CN=localhost
não/CN=localhost
? A fuga adequada ajudará aqui? Por exemplo, a substituição/CN=localhost
por"/CN=localhost"
resolve o problema de maneira limpa?Não posso comentar, por isso vou colocar isso como uma resposta separada. Encontrei alguns problemas com a resposta de uma linha aceita:
Aqui está uma versão simplificada que remove a frase secreta, aumenta a segurança para suprimir avisos e inclui uma sugestão nos comentários para passar em -subj para remover a lista de perguntas completa:
Substitua 'localhost' pelo domínio que você precisar. Você precisará executar os dois primeiros comandos, um por um, pois o OpenSSL solicitará uma senha.
Para combinar os dois em um arquivo .pem:
fonte
cat server.crt server.key >foo-cert.pem
. Trabalha com o exemplo emopenssl-1.0.2d/demos/ssl/
FreeBSD 10
OpenLDAP 2.4
comTLS
Os navegadores modernos agora lançam um erro de segurança para certificados autoassinados, de outra forma bem formados, se houver uma SAN (Nome Alternativo do Assunto). O OpenSSL não fornece uma maneira da linha de comando para especificar isso , de modo que muitos tutoriais e indicadores de desenvolvedores estão subitamente desatualizados.
A maneira mais rápida de executar novamente é um arquivo conf curto e independente:
Crie um arquivo OpenSSL config (exemplo:
req.cnf
)Crie o certificado referenciando este arquivo de configuração
Exemplo de configuração de https://support.citrix.com/article/CTX135602
fonte
-sha256
.-extension 'subjectAltName = DNS:dom.ain, DNS:oth.er'
see github.com/openssl/openssl/pull/4986-addext
agora.Eu recomendaria adicionar o parâmetro -sha256 , para usar o algoritmo de hash SHA-2, porque os principais navegadores estão considerando mostrar "certificados SHA-1" como não seguros.
A mesma linha de comando da resposta aceita - @diegows with -sha256 adicionado
Mais informações no blog do Google Security .
Atualização em maio de 2018. Como muitos observaram nos comentários, o uso do SHA-2 não adiciona nenhuma segurança a um certificado autoassinado. Mas eu ainda recomendo usá-lo como um bom hábito de não usar funções hash criptográficas desatualizadas / inseguras. A explicação completa está disponível em Por que é bom que os certificados acima do certificado da entidade final sejam baseados em SHA-1? .
fonte
Este é o script que eu uso nas caixas locais para definir a SAN (subjectAltName) em certificados autoassinados.
Esse script pega o nome de domínio (exemplo.com) e gera a SAN para * .exemplo.com e exemplo.com no mesmo certificado. As seções abaixo estão comentadas. Nomeie o script (por exemplo
generate-ssl.sh
) e dê a ele permissões executáveis. Os arquivos serão gravados no mesmo diretório que o script.O Chrome 58 em diante exige que a SAN seja definida em certificados autoassinados.
Esse script também grava um arquivo de informações, para que você possa inspecionar o novo certificado e verificar se a SAN está configurada corretamente.
Se você estiver usando o Apache, poderá fazer referência ao certificado acima no seu arquivo de configuração da seguinte maneira:
Lembre-se de reiniciar o servidor Apache (ou Nginx ou IIS) para que o novo certificado entre em vigor.
fonte
localhost
ou o127.0.0.1:port#
que seria o correspondenteCN
para algo assim.2017 one-liner:
Isso também funciona no Chrome 57, pois fornece a SAN, sem ter outro arquivo de configuração. Foi retirado de uma resposta aqui .
Isso cria um único arquivo .pem que contém a chave privada e o certificado. Você pode movê-los para separar arquivos .pem, se necessário.
fonte
/etc/ssl/openssl.conf
obras atuais do UbuntuNão posso comentar, então adiciono uma resposta separada. Tentei criar um certificado autoassinado para o NGINX e foi fácil, mas quando quis adicioná-lo à lista branca do Chrome, tive um problema. E minha solução foi criar um certificado raiz e assinar um certificado filho por ele.
Então passo a passo. Criar arquivo config_ssl_ca.cnf Observe que o arquivo de configuração possui uma opção basicConstraints = CA: true, o que significa que esse certificado deve ser root.
Próximo arquivo de configuração para o seu certificado filho.
A primeira etapa - criar chave e certificado raiz
A segunda etapa cria a chave filha e o arquivo CSR - Certificate Signing Request. Como a idéia é assinar o certificado filho pela raiz e obter um certificado correto
Abra o terminal Linux e execute este comando eco 0
O arquivo de texto ca.srl contendo o próximo número de série a ser usado em hexadecimal. Obrigatório. Este arquivo deve estar presente e conter um número de série válido.
Última etapa, crie mais um arquivo de configuração e chame-o de config_ca.cnf
Você pode perguntar, por que tão difícil, por que precisamos criar mais uma configuração para assinar o certificado filho pela raiz. A resposta é simples porque o certificado filho deve ter um bloco SAN - Nomes Alternativos para o Assunto. Se assinarmos o certificado filho pelos utilitários "openssl x509", o certificado raiz excluirá o campo SAN no certificado filho. Portanto, usamos "openssl ca" em vez de "openssl x509" para evitar a exclusão do campo SAN. Nós criamos um novo arquivo de configuração e dizemos para copiar todos os campos estendidos copy_extensions = copy .
O programa faz duas perguntas: 1. Assine o certificado? Diga "Y" 2. 1 de 1 solicitações de certificado certificadas, confirma? Diga "Y"
No terminal você pode ver uma frase com a palavra "Banco de Dados", significa o arquivo index.txt que você cria com o comando "touch". Ele conterá todas as informações de todos os certificados que você criar pelo utilitário "openssl ca". Para verificar o certificado válido, use:
Se você quiser ver o que há dentro do CRT:
Se você quiser ver o que há no CSR:
fonte
Você tem o procedimento geral correto. A sintaxe para o comando está abaixo.
No entanto, os avisos são exibidos, porque o navegador não conseguiu verificar a identificação validando o certificado com uma CA (Autoridade de Certificação) conhecida.
Como este é um certificado autoassinado, não há CA e você pode ignorar com segurança o aviso e prosseguir. Se você deseja obter um certificado real que possa ser reconhecido por qualquer pessoa na Internet pública, o procedimento está abaixo.
Tenho mais detalhes sobre isso em uma postagem em Protegendo a conexão: Criando um certificado de segurança com o OpenSSL
fonte
Um forro FTW. Eu gosto de simplificar. Por que não usar um comando que contenha TODOS os argumentos necessários? É assim que eu gosto - isso cria um certificado x509 e sua chave PEM:
Esse comando único contém todas as respostas que você normalmente forneceria para os detalhes do certificado. Dessa forma, você pode definir os parâmetros e executar o comando, obter sua saída e depois tomar um café.
>> Mais aqui <<
fonte
Versão one-liner 2017:
CentOS:
Ubuntu:
Edit: adicionada a adição de Slash à opção 'subj' do Ubuntu.
fonte
Na minha configuração, o servidor Ubuntu logou em:
/var/log/mysql/error.log
Notas de acompanhamento:
SSL error: Unable to get certificate from '...'
Pode ser negado ao MySQL acesso de leitura ao seu arquivo de certificado se ele não estiver na configuração de aparentes . Como mencionado nas etapas anteriores ^, salve todos os nossos certificados como
.pem
arquivos no/etc/mysql/
diretório que é aprovado por padrão pelo apparmor (ou modifique seu apparmor / SELinux para permitir acesso a onde você os armazenou.)SSL error: Unable to get private key
Sua versão do servidor MySQL pode não suportar o
rsa:2048
formato padrãoConverter gerado
rsa:2048
em comumrsa
com:Verifique se o servidor local suporta SSL :
A verificação de uma conexão com o banco de dados é criptografada em SSL :
Exigir ssl para conexão de usuário específico ('require ssl'):
Link alternativo: tutorial longo em Secure PHP Connections to MySQL with SSL .
fonte
Como foi discutido em detalhes, os certificados autoassinados não são confiáveis para a Internet . Você pode adicionar seu certificado autoassinado a muitos, mas não a todos os navegadores . Como alternativa, você pode se tornar sua própria autoridade de certificação .
A principal razão pela qual não se deseja obter um certificado assinado de uma autoridade de certificação é o custo - a Symantec cobra entre US $ 995 e US $ 1.999 por ano pelos certificados - apenas para um certificado destinado à rede interna, a Symantec cobra US $ 399 por ano . Esse custo é fácil de justificar se você estiver processando pagamentos com cartão de crédito ou trabalhando para o centro de lucro de uma empresa altamente lucrativa. É mais do que muitos podem pagar por um projeto pessoal que você está criando na Internet, ou por uma organização sem fins lucrativos, com um orçamento mínimo, ou se trabalha no centro de custos de uma organização - os centros de custo sempre tentam fazer mais com menos.
Uma alternativa é usar o certbot (consulte sobre o certbot ). O Certbot é um cliente automático fácil de usar que busca e implanta certificados SSL / TLS para o seu servidor web.
Se você configurar o certbot, poderá habilitá-lo para criar e manter um certificado emitido pela autoridade de certificação Let's Encrypt .
Fiz isso no fim de semana para a minha organização. Instalei os pacotes necessários para o certbot no meu servidor (Ubuntu 16.04) e, em seguida, executei o comando necessário para configurar e ativar o certbot. Provavelmente, é necessário um plug-in DNS para o certbot - atualmente estamos usando o DigitalOcean, embora possamos estar migrando para outro serviço em breve.
Observe que algumas das instruções não estavam certas e demoraram um pouco para descobrir o Google. Isso levou uma boa quantidade de tempo da primeira vez, mas agora acho que posso fazê-lo em minutos.
Para o DigitalOcean, uma área em que lutei foi quando fui solicitado a inserir o caminho para o arquivo INI das credenciais do DigitalOcean. O que o script está se referindo é a página Aplicativos e API e a guia Tokens / Chave nessa página. Você precisa ter ou gerar um token de acesso pessoal (leitura e gravação) para a API do DigitalOcean - essa é uma sequência hexadecimal de 65 caracteres. Essa sequência precisa ser colocada em um arquivo no servidor da web do qual você está executando o certbot. Esse arquivo pode ter um comentário como primeira linha (os comentários começam com #). A linha seccond é:
Depois que eu descobri como configurar um token de leitura + gravação para a API do DigitalOcean, era muito fácil usar o certbot para configurar um certificado curinga . Observe que não é necessário configurar um certificado curinga, pode-se especificar cada domínio e subdomínio ao qual deseja que o certificado seja aplicado. Era o certificado curinga que exigia o arquivo INI de credenciais que continha o token de acesso pessoal do DigitalOcean.
Observe que os certificados de chave pública (também conhecidos como certificados de identidade ou certificados SSL) expiram e exigem renovação. Portanto, você precisará renovar seu certificado periodicamente (de forma recorrente). A documentação do certbot abrange a renovação de certificados .
Meu plano é escrever um script para usar o comando openssl para obter a data de validade do meu certificado e acionar a renovação quando tiver 30 dias ou menos até que expire. Vou adicionar esse script ao cron e executá-lo uma vez por dia.
Aqui está o comando para ler a data de validade do seu certificado:
fonte