Como criar um certificado autoassinado para um nome de domínio para desenvolvimento?

122

Eu tenho subdomain.example.comque eu uso para fins de desenvolvimento. Minha solução de aplicativo da web contém uma API da web, etc, que eu preciso chamar de sistemas externos; portanto, não estou usando o host local.

Agora preciso testar o SSL e preciso de um certificado para o meu subdomain.example.comnome de domínio de desenvolvimento.

Tentei criar um certificado autoassinado, conforme descrito em http://technet.microsoft.com/en-us/library/cc753127(v=ws.10).aspx , mas esse certificado funciona apenas para o host local. Este certificado pode ser usado para minha finalidade ou terei que criar um autoassinado para meu subdomínio de desenvolvimento? Se eu tiver que criar uma certificação autoassinada para meu subdomínio de desenvolvimento, que utilitário ou serviço online (Grátis) posso usar para isso?

Moiz Tankiwala
fonte

Respostas:

133

Com o recurso de certificado autoassinado do IIS, você não pode definir o nome comum (CN) do certificado e, portanto, não pode criar um certificado vinculado à sua escolha de subdomínio.

Uma maneira de contornar o problema é usar o makecert.exe, fornecido com o .Net 2.0 SDK. No meu servidor, está em:

C:\Program Files\Microsoft.Net\SDK\v2.0 64bit\Bin\makecert.exe

Você pode criar uma autoridade de assinatura e armazená-la no repositório de certificados LocalMachine da seguinte maneira (esses comandos devem ser executados em uma conta de Administrador ou em um prompt de comando elevado):

makecert.exe -n "CN=My Company Development Root CA,O=My Company,
 OU=Development,L=Wallkill,S=NY,C=US" -pe -ss Root -sr LocalMachine
 -sky exchange -m 120 -a sha1 -len 2048 -r

Você pode criar um certificado vinculado ao seu subdomínio e assinado por sua nova autoridade:

(Observe que o valor do parâmetro -in deve ser o mesmo que o valor CN usado para gerar sua autoridade acima.)

makecert.exe -n "CN=subdomain.example.com" -pe -ss My -sr LocalMachine
 -sky exchange -m 120 -in "My Company Development Root CA" -is Root
 -ir LocalMachine -a sha1 -eku 1.3.6.1.5.5.7.3.1

Seu certificado deve aparecer no Gerenciador do IIS para ser vinculado ao seu site, conforme explicado na postagem de Tom Hall.

Parabéns a Mike O'Brien por esta excelente publicação no blog http://www.mikeobrien.net/blog/creating-self-signed-wildcard

jlmt
fonte
8
Eu fui capaz de fazer isso funcionar. Eu tive que usar o prompt de comando do Visual Studio 2010 makecert.exepara estar no meu caminho. Para os certificados, pensei que seria mais seguro e usar -a SHA512 -len 8192- demorou uma eternidade para gerar. E como eu suspeitava, não teve impacto sobre o nível de criptografia usado pelo IIS. Por padrão, o IIS usa 128 bits, você precisa fazer coisas de diretiva de grupo para alterar isso. Nota adicional para outros leitores: não altere os números mágicos depois -eku, eles são necessários.
BrainSlugs83
3
Execute todos os comandos acima em um prompt de comando com privilégios administrativos, caso contrário, você receberá a mensagem "Erro: salvar certificado codificado para armazenar com falha => 0x5".
Giles Roberts
1
Eu também gostaria de compartilhar um ótimo link Criando certificados autoassinados com o makecert.exe para desenvolvimento . O link explica a abordagem passo a passo para criar certificado raiz, certificado do servidor e certificado do cliente. Além disso, há um post para explicar como usá-los.
Vikram Singh Saini
3
Navegadores como o Chrome começaram a se tornar obsoletos sha1. Substitua -a sha512e considere adicionar -len 2048à segunda makecertinvocação e tudo deve estar bem.
O. Jones
2
Observe que isso não parece mais funcionar (pelo menos como mostrado acima) no Windows 10. Tive de usar o cmdlet do PowerShell, que funcionou sem nenhum problema.
DVK
119

Usando o PowerShell

No Windows 8.1 e Windows Server 2012 R2 (Windows PowerShell 4.0) e superior, você pode criar um certificado autoassinado usando o novo New-SelfSignedCertificatecmdlet:

Exemplos:

New-SelfSignedCertificate -DnsName www.mydomain.com -CertStoreLocation cert:\LocalMachine\My

New-SelfSignedCertificate -DnsName subdomain.mydomain.com -CertStoreLocation cert:\LocalMachine\My

New-SelfSignedCertificate -DnsName *.mydomain.com -CertStoreLocation cert:\LocalMachine\My

Usando o Gerenciador do IIS

  1. Inicie o Gerenciador do IIS
  2. No nível do servidor, no IIS, selecione Certificados do Servidor
  3. No lado direito, em Ações, selecione Criar certificado autoassinado
  4. Onde diz "Especifique um nome amigável para o certificado", digite um nome apropriado para referência.
    1. Exemplos: www.domain.comousubdomain.domain.com
  5. Em seguida, selecione seu site na lista do lado esquerdo
  6. No lado direito, em Ações, selecione Ligações
  7. Adicione uma nova ligação HTTPS e selecione o certificado que você acabou de criar (se seu certificado for um certificado curinga, será necessário especificar um nome de host)
  8. Clique em OK e teste-o.
Tom Hall
fonte
7
+1 para a solução PowerShell. Rápido e fácil, e depois disso, o novo certificado apareceu no meu Gerenciador do IIS> Conexões> Sites> [Meu Aplicativo]> Editar Ligações> Editar> menu suspenso Certificado SSL.
Jon Schneider
3
Depois de seguir as instruções acima e visualizar o certificado, as instruções não preenchem o campo CN que ainda tinha o nome do host local.
DaveD
7
Exatamente. Isto está errado! "Nome amigável" não tem nada a ver com a CN. Não sei por que essa resposta tem tantos votos positivos?
C00000fd
25
Isso ganha votos porque o método Powershell está realmente funcionando. (Consulte a resposta @DivineOps) Aqui está o comando que usei: New-SelfSignedCertificate -FriendlyName *.mydomain.local -DnsName *.mydomain.local, localhost -CertStoreLocation Cert:\LocalMachine\MyIsso cria um certificado na loja pessoal. Em seguida, primeiro exportei o certificado para um arquivo e depois reimportei-o para o IIS via Gerenciador do IIS (para usá-lo na ligação https) e depois para CAs raiz confiáveis ​​via MMC (para evitar avisos do navegador).
Anton
3
A -NotAfteropção também é útil para especificar uma data de validade (sem ela, o padrão é apenas 1 ano). Exemplo que eu useiNew-SelfSignedCertificate -DnsName *.mydomain.com -FriendlyName *.mydomain.com -NotAfter (Get-Date).AddYears(15) -CertStoreLocation cert:\LocalMachine\My
Ben Amada
52

Para criar o novo certificado para seu domínio específico:

Abra o Powershell ISE como administrador, execute o comando:

New-SelfSignedCertificate -DnsName *.mydomain.com, localhost -CertStoreLocation cert:\LocalMachine\My

Para confiar no novo certificado:

  • Abra o mmc.exe
  • Vá para Raiz do console -> Certificados (computador local) -> Pessoal
  • Selecione o certificado que você criou, clique com o botão direito em -> Todas as tarefas -> Exportar e siga o assistente de exportação para criar um arquivo .pfx
  • Vá para Raiz do console -> Certificados -> Autoridades de certificação raiz confiáveis ​​e importe o novo arquivo .pfx

Para vincular o certificado ao seu site:

  • Abra o Gerenciador do IIS
  • Selecione seu site e escolha Editar site -> Ligações no painel direito
  • Adicione nova ligação https com o nome do host correto e o novo certificado
DivineOps
fonte
2
Isso funciona apenas no Windows 8.1 e no Windows Server 2012 R2 (Windows PowerShell 4.0) ou posterior, embora você possa gerar o certificado em um desses sistemas operacionais e importá-lo posteriormente para outro computador (acabei de fazer isso para usar este certificado com o SSRS instalado no Windows Server 2008 R2).
mprost 24/09/2015
2
Em vez de Exportação e Importação para copiá-lo para Certificação Raiz Confiáveis Autoridades, você pode simplesmente copiar e colar
jk7
Copiar / Colar funciona apenas no mesmo servidor. Você também pode pressionar a tecla Ctrl e arrastar a pasta Pessoal para as autoridades de certificação raiz confiáveis ​​no mesmo servidor. Se você quiser que outro host possa acessar o site sem avisos, precisará exportá-lo e pedir que eles importem o certificado para o TRCA local (não é necessário incluir a chave privada).
jessewolfe
40

Eu tive que descobrir os certificados autoassinados no Windows, combinando partes das respostas fornecidas e outros recursos. Aqui está o meu próprio (e espero que completo) passo a passo. Espero que poupe um pouco da minha dolorosa curva de aprendizado. Ele também contém informações sobre tópicos relacionados que aparecerão mais cedo ou mais tarde quando você criar seus próprios certificados.

Crie um certificado autoassinado no Windows 10 e abaixo

Não use makecert.exe. Foi preterido pela Microsoft.
A maneira moderna usa um comando do PowerShell.

Windows 10:

Abra o PowerShell com privilégios de administrador:

New-SelfSignedCertificate  -DnsName "*.dev.local", "dev.local", "localhost"  -CertStoreLocation cert:\LocalMachine\My  -FriendlyName "Dev Cert *.dev.local, dev.local, localhost"  -NotAfter (Get-Date).AddYears(15)

Windows 8, Windows Server 2012 R2:

No Powershell nesses sistemas, os parâmetros -FriendlyName e -NotAfter não existem. Simplesmente remova-os da linha de comando acima.
Abra o PowerShell com privilégios de administrador:

New-SelfSignedCertificate  -DnsName "*.dev.local", "dev.local", "localhost"  -CertStoreLocation cert:\LocalMachine\My

Uma alternativa é usar o método para a versão mais antiga do Windows abaixo, que permite usar todos os recursos do Win 10 para criação de certificados ...

Versões mais antigas do Windows:

Minha recomendação para versões mais antigas do Windows é criar o certificado em uma máquina Win 10, exportá-lo para um arquivo .PFX usando uma instância mmc (consulte "Confiar no certificado" abaixo) e importá-lo para o armazenamento de certificados na máquina de destino com o sistema operacional Windows antigo. Para importar o certificado, NÃO clique com o botão direito do mouse. Embora exista um item "Importar certificado" no menu de contexto, todas as minhas tentativas falharam em usá-lo no Win Server 2008. Em vez disso, abra outra instância mmc na máquina de destino, navegue até "Certificados (Computador Local) / Pessoal / Certificados" , clique com o botão direito do mouse no painel do meio e selecione Todas as tarefas → Importar.

O certificado resultante

Ambos os comandos acima criam um certificado para os domínios localhoste *.dev.local.
A versão Win10 também possui um tempo de vida útil de 15 anos e um nome de exibição legível "Dev Cert * .dev.local, dev.local, localhost".

Atualização: Se você fornecer várias entradas de nome de host no parâmetro -DnsName(como mostrado acima), a primeira dessas entradas se tornará o Assunto do domínio (Nome Comum AKA). A lista completa de todas as entradas de nome de host será armazenada no campo Nome Alternativo do Assunto (SAN) do certificado. (Obrigado a BenBewards por apontar isso.)

Após a criação, o certificado estará imediatamente disponível em todas as ligações HTTPS do IIS (instruções abaixo).

Confie no certificado

O novo certificado não faz parte de nenhuma cadeia de confiança e, portanto, não é considerado confiável por nenhum navegador. Para mudar isso, copiaremos o certificado no armazenamento de certificados das CAs raiz confiáveis ​​em sua máquina:

Abra mmc.exe, Arquivo → Adicionar / Remover Snap-In → escolha "Certificados" na coluna esquerda → Adicionar → escolha "Conta do Computador" → Avançar → "Computador Local ..." → Concluir → OK

Na coluna da esquerda, escolha "Certificados (Computador Local) / Pessoal / Certificados".
Encontre o certificado recém-criado (no Win 10, a coluna "Nome amigável" pode ajudar).
Selecione este certificado e pressione Ctrl-C para copiá-lo para a área de transferência.

Na coluna esquerda, escolha "Certificados (computador local) / CAs / certificados raiz confiáveis".
Pressione Ctrl-V para colar seu certificado nesta loja.
O certificado deve aparecer na lista de autoridades raiz confiáveis ​​e agora é considerado confiável.

Use no IIS

Agora você pode acessar o Gerenciador do IIS, selecionar as ligações de um site local → Adicionar → https → inserir o nome do host do formulário myname.dev.local(seu *.dev.localcertificado é válido apenas ) e selecionar o novo certificado → OK.

Adicionar aos hosts

Adicione também o nome do seu host a C: \ Windows \ System32 \ drivers \ etc \ hosts:

127.0.0.1  myname.dev.local

Feliz

Agora, o Chrome e o IE devem tratar o certificado como confiável e carregar o site quando você abrir https://myname.dev.local.

O Firefox mantém seu próprio armazenamento de certificados. Para adicionar seu certificado aqui, você deve abrir seu site no FF e adicioná-lo às exceções quando o FF o avisar sobre o certificado.

Para o navegador Edge, pode haver mais ação necessária (veja mais abaixo).

Teste o certificado

Para testar seus conhecimentos, o Firefox é sua melhor escolha. (Acredite, eu também sou fã do Chrome, mas FF é melhor nesse caso.)

Aqui estão os motivos:

  • O Firefox usa seu próprio cache SSL, que é eliminado na recarga de turno. Portanto, qualquer alteração no conteúdo de seus sites locais será refletida imediatamente nos avisos do FF, enquanto outros navegadores podem precisar de uma reinicialização ou de uma limpeza manual do cache SSL do Windows.
  • Além disso, o FF fornece algumas dicas valiosas para verificar a validade do seu certificado: Clique em Avançado quando o FF mostrar seu aviso de certificado. O FF mostrará um pequeno bloco de texto com um ou mais avisos possíveis nas linhas centrais do bloco de texto:

O certificado não é confiável porque é autoassinado.

Este aviso está correto! Como observado acima, o Firefox não usa o armazenamento de certificados do Windows e confiará apenas neste certificado, se você adicionar uma exceção. O botão para fazer isso está logo abaixo dos avisos.

O certificado não é válido para o nome ...

Este aviso mostra que você fez algo errado. O domínio (curinga) do seu certificado não corresponde ao domínio do seu site. O problema deve ser resolvido alterando o (sub-) domínio do site ou emitindo um novo certificado que corresponda. Na verdade, você pode adicionar uma exceção no FF, mesmo que o certificado não corresponda, mas você nunca obteria um símbolo de cadeado verde no Chrome com essa combinação.

O Firefox pode exibir muitos outros avisos de certificação agradáveis ​​e compreensíveis neste local, como certificados expirados, certificados com algoritmos de assinatura desatualizados etc. Não encontrei outro navegador que me desse esse nível de feedback para solucionar qualquer problema.

Qual padrão de (sub) domínio devo escolher desenvolver?

No comando New-SelfSignedCertificate acima, usamos o domínio curinga *.dev.local.

Você pode pensar: por que não usar *.local?

Motivo simples: é ilegal como um domínio curinga.
Os certificados curinga devem conter pelo menos um nome de domínio de segundo nível.

Portanto, os domínios do formulário *.localsão bons para desenvolver sites HTTP. Mas não muito para HTTPS, porque você seria forçado a emitir um novo certificado correspondente para cada novo projeto iniciado.

Notas laterais importantes:

  • Domínios de host válidos podem conter SOMENTE letras a z, dígitos, hífens e pontos. Não são permitidos sublinhados! Alguns navegadores são muito exigentes quanto a esses detalhes e podem dificultar quando se recusam a corresponder seu domínio motör_head.dev.localao seu padrão curinga *.dev.local. Eles cumprirão quando você alternar para motoer-head.dev.local.
  • Um curinga em um certificado corresponderá apenas a UM rótulo (= seção entre dois pontos) em um domínio, nunca mais. *.dev.local corresponde, myname.dev.local mas NÃO other.myname.dev.local!
  • Curingas de vários níveis ( *.*.dev.local) NÃO são possíveis em certificados. Portanto, other.myname.dev.localsó pode ser coberto por um curinga do formulário *.myname.dev.local. Como resultado, é melhor não usar uma parte do domínio de quarto nível. Coloque todas as suas variações na parte do terceiro nível. Dessa forma, você se dará bem com um único certificado para todos os seus sites de desenvolvimento.

O problema com o Edge

Não se trata realmente de certificados autoassinados, mas ainda relacionados a todo o processo:
Após seguir as etapas acima, o Edge pode não mostrar nenhum conteúdo quando você abre myname.dev.local.
O motivo é um recurso característico do gerenciamento de rede do Windows 10 para aplicativos modernos, chamado "Isolamento de rede".

Para resolver esse problema, abra um prompt de comando com privilégios de administrador e digite o seguinte comando uma vez:

CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe

Mais informações sobre o isolamento de borda e rede podem ser encontradas aqui: https://blogs.msdn.microsoft.com/msgulfcommunity/2015/07/01/how-to-debug-localhost-on-microsoft-edge/

Jpsy
fonte
2
Gostaria de observar aqui que o primeiro nome DNS também é salvo como o Nome do Assunto, que talvez você não queira que seja o curinga.
Ben Sewards
@ BenSewards: Obrigado por apontar isso, Ben. Atualizei a resposta para incluir os detalhes do campo assunto / SAN. Você vê algum problema em ter um nome de host curinga no campo Assunto, em vez do campo SAN?
Jpsy
@Jpsy - Funciona para mim localmente no servidor em que o certificado autoassinado foi criado, mas não no Firefox ou Chrome nas minhas máquinas (clientes). Entendo appname.dev has a security policy called HTTP Strict Transport Security (HSTS), which means that Firefox can only connect to it securely. You can’t add an exception to visit this site.que, como afirma, não permite que você adicione a exceção do cliente, ao contrário de suas instruções. Essa é uma configuração incorreta no próprio IIS em relação às configurações de SSL, Exigir SSL e as opções de certificados de cliente?
Code Maverick
@ CodeMaverick: Poderia haver algum software bloqueador de anúncios ou antivírus envolvido no seu problema, por acaso? Outra opção pode ser que o certificado não corresponda ao nome de domínio que você usa. Lembre-se de que o * no CN ou SAN do certificado pode representar apenas um segmento no nome do domínio ( sem pontos). Portanto, a CN *.mydomain.compode ser um certificado válido para, me.mydomain.commas não para me.at.mydomain.com.
Jpsy
14

Encontrei esse mesmo problema quando queria habilitar o SSL para um projeto hospedado no IIS 8. Finalmente, a ferramenta que usei foi o OpenSSL , depois de muitos dias lutando com os comandos makecert. O certificado é gerado no Debian, mas eu poderia importá-lo perfeitamente para IIS 7 e 8.

Faça o download do OpenSSL compatível com seu sistema operacional e este arquivo de configuração. Defina o arquivo de configuração como configuração padrão do OpenSSL.

Primeiro, geraremos a chave privada e o certificado da Autoridade de Certificação (CA). Este certificado é para assinar a solicitação de certificado (CSR).

Você deve preencher todos os campos necessários neste processo.

  1. openssl req -new -x509 -days 3650 -extensions v3_ca -keyout root-cakey.pem -out root-cacert.pem -newkey rsa:4096

Você pode criar um arquivo de configuração com configurações padrão como esta: Agora, geraremos a solicitação de certificado, que é o arquivo enviado às autoridades de certificação.

O Nome comum deve ser definido como o domínio do seu site, por exemplo: public.organization.com .

  1. openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:4096

Agora, a solicitação de certificado é assinada com o certificado CA gerado.

  1. openssl x509 -req -days 365 -CA root-cacert.pem -CAkey root-cakey.pem -CAcreateserial -in server-csr.pem -out server-cert.pem

O certificado gerado deve ser exportado para um arquivo .pfx que pode ser importado para o IIS.

  1. openssl pkcs12 -export -out server-cert.pfx -inkey server-key.pem -in server-cert.pem -certfile root-cacert.pem -name "Self Signed Server Certificate"

Nesta etapa, importaremos o certificado CA.

  1. No servidor, você deve importar o certificado da CA para as Autoridades de Certificação Raiz Confiáveis, para que o IIS possa confiar na importação do certificado. Lembre-se de que o certificado a ser importado para o IIS foi assinado com o certificado da CA.

    • Abra o prompt de comando e digite mmc .
    • Clique no arquivo .
    • Selecione Adicionar / Remover Snap em ... .
    • Clique duas vezes em Certificados .
    • Selecione Conta do computador e Avançar -> .
    • Selecione Computador Local e Concluir .
    • Ok .
    • Vá para Certificados -> Autoridades de certificação raiz confiáveis -> Certificados , clique em Certificados e selecione Todas as tarefas -> Importar ...

insira a descrição da imagem aqui

  • Selecione Próximo -> Procurar ...
  • Você deve selecionar Todos os arquivos para procurar o local do arquivo root-cacert.pem .
  • Clique em Avançar e selecione Colocar todos os certificados no seguinte armazenamento : Autoridades de certificação raiz confiáveis .
  • Clique em Next e Finish .

insira a descrição da imagem aqui

Com esta etapa, o IIS confia na autenticidade do nosso certificado.

  1. Em nossa última etapa, importaremos o certificado para o IIS e adicionaremos o site de ligação.

    • Abra o Gerenciador do Internet Information Services (IIS) ou digite inetmgr no prompt de comando e vá para Certificados do servidor .
    • Clique em Importar ... .
    • Defina o caminho do arquivo .pfx, a senha e o armazenamento de certificados Select no Host da Web .

insira a descrição da imagem aqui

  • Clique em OK .
  • Agora vá ao seu site no Gerenciador do IIS e selecione Ligações ... e Adicione uma nova ligação.

  • Selecione https como o tipo de ligação e você poderá ver o certificado importado.

  • Clique em OK e tudo está pronto.

insira a descrição da imagem aqui

Joseph
fonte
Eu queria ter uma validade mais longa com um certificado autoassinado e o Windows SDK com makecert.exe não estava disponível no host do Windows. Um host Linux e esta resposta forneceram a solução.
richk
Fico feliz que você tenha achado útil minha resposta.
Joseph
Onde colocar esse "public.organization.com" no comando openssl?
Aquele
2

Outra opção é criar um certificado autoassinado que permita especificar o nome de domínio por site. Isso significa que você pode usá-lo em vários nomes de domínio.

No Gerenciador do IIS

  1. Clique no nó do nome da máquina
  2. Certificados de servidor aberto
  3. No painel Ações, escolha 'Criar certificado autoassinado'
  4. Em 'Especifique um nome amigável ...' nomeie-o * Dev (selecione 'Pessoal' na lista de tipos)
  5. Salve 

Agora, no seu site no IIS ...

  1. Gerenciar as ligações
  2. Crie uma nova ligação para Https
  3. Escolha seu certificado autoassinado da lista
  4. Uma vez selecionada, a caixa de nome de domínio será ativada e você poderá inserir seu nome de domínio.

insira a descrição da imagem aqui

Padrão de teste
fonte
Obrigado a resposta mais útil até agora. Pelo menos para usá-lo no desenvolvimento, isso é rápido.
Cabaji99
0

Outra maneira fácil de gerar um certificado autoassinado é usar o Jexus Manager,

Jexus Manager

  1. Escolha um nó do servidor no painel Conexões.
  2. No painel do meio, clique no ícone Certificados do Servidor para abrir a página de gerenciamento.
  3. No painel Ações, clique no item de menu "Gerar certificado autoassinado ...".

https://www.jexusmanager.com/en/latest/tutorials/self-signed.html

Lex Li
fonte