Solução de problemas relacionados ao SSL (Certificado do Servidor)
Ferramentas usadas nesta solução de problemas:
- SSLDiag
- Monitor de Rede 3.4/Wireshark
Esse material é fornecido somente para fins informativos. A Microsoft não oferece nenhuma garantia, expressa ou implícita.
Visão geral
Este documento ajudará você a solucionar problemas de SSL relacionados somente ao IIS. A solução de problemas de Certificados do Cliente não será abordada neste documento. Os Certificados de Servidor são destinados à Autenticação de Servidor e estaremos lidando apenas com certificados de servidor neste documento.
Se a seção Certificados do Cliente estiver definida como "Exigir" e você tiver problemas, não consulte este documento. Isso destina-se apenas à solução de problemas de certificados do SSL Server.
É importante saber que cada certificado é composto por uma chave pública (usada para criptografia) e uma chave privada (usada para descriptografia). A chave privada é conhecida apenas pelo servidor.
A porta padrão para https é 443.
Estou sob a suposição de que o leitor é bem versado no Handshake SSL e no processo de Autenticação do Servidor durante o handshake SSL.
Descrição do Handshake da Camada de Soquetes Seguros (SSL):
<https://support.microsoft.com/kb/257591
>
Descrição do processo de autenticação do servidor durante o Handshake SSL:
<https://support.microsoft.com/kb/257587
>
Cenários
A seguinte mensagem de erro é vista ao navegar pelo site por https:
A primeira coisa que precisa ser verificada é se o site está acessível por http. Se não for, provavelmente haverá um problema separado não abordado aqui. Você precisará ter o site funcionando em http primeiro antes de continuar com essa solução de problemas.
Agora vamos supor que o site esteja acessível por http e obtemos o erro acima ao tentar navegar por https. O problema é visto porque o handshake SSL falhou e, portanto, a mensagem de erro foi vista. Pode haver muitas razões. Seguiremos uma abordagem passo a passo para resolver esse problema.
Cenário 1
Verifique se o certificado do servidor tem a chave privada correspondente a ele. Consulte a imagem abaixo:
Se a chave privada estiver ausente, você precisará obter um certificado contendo a chave privada, que é essencialmente um . Arquivo PFX. Há um comando que podemos tentar executar para associar a chave privada ao certificado:
C:\>certutil –repairstore my "1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33"
Se a associação for bem-sucedida, você verá a seguinte janela:
Observação: 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33 é a impressão digital do certificado. Abra o certificado e clique na guia detalhes. Role para baixo para encontrar a seção de impressão digital. Selecione a seção de impressão digital e clique no texto abaixo. Faça um "Ctrl+A" e, em seguida, "Ctrl+C" para selecioná-lo e copiá-lo. Abaixo está um instantâneo para sua referência:
Observação: esse comando nem sempre é bem-sucedido. Se isso falhar, você precisará obter um certificado contendo a chave privada da AC. A extensão de arquivo de um certificado que contém chave privada é .pfx.
Cenário 2
Passamos o primeiro obstáculo e agora temos um certificado de servidor contendo a chave privada instalada no site. No entanto, ainda temos o mesmo erro que acima. O site ainda não está acessível por https.
A ferramenta SSLDiag é útil aqui.
Windows Server 2003:
Baixar X64 (https://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5329
)
Baixar X86 (https://www.microsoft.com/download/en/details.aspx?displaylang=en&id=674
)
Para o IIS 7 e o IIS 7.5, use a ferramenta de Diagnóstico de SSL doFursk. Veja abaixo o link:
https://blogs.msdn.com/b/vijaysk/archive/2009/09/20/ssl-diagnostics-tool-for-iis-7.aspx
Instale a ferramenta e execute-a no servidor. Se você tiver um certificado contendo chave privada e ainda não conseguir acessar o site, talvez queira executar essa ferramenta ou verificar os logs de eventos do sistema para obter avisos/erros relacionados ao SChannel.
Ao executar a ferramenta SSLDiag, você pode receber o seguinte erro:
Você tem uma chave privada que corresponde a este certificado, mas CryptAcquireCertificatePrivateKey falhou
Também haverá um aviso SChannel nos logs de eventos do sistema, conforme mostrado abaixo:
Tipo de Evento: Erro |
---|
Fonte do evento: Schannel |
Categoria do Evento: Nenhum |
ID do evento: 36870 |
Data: 11/02/2012 |
Hora: 12:44:55 AM |
Usuário: N/A |
Computador: |
Descrição: ocorreu um erro fatal ao tentar acessar a chave privada de credencial do servidor SSL. O código de erro retornado do módulo criptográfico é 0x80090016. |
Esse evento/erro indica que houve um problema ao adquirir a chave privada do certificado. Portanto, vamos tentar as etapas abaixo uma a uma:
Em primeiro lugar, verifique as permissões na pasta de chaves de máquina de acordo com o artigo do KB: https://support.microsoft.com/kb/278381. Todas as chaves privadas são armazenadas dentro da pasta de chaves de máquina, portanto, precisamos garantir que tenhamos as permissões necessárias.
Se as permissões estiverem em vigor e se o problema ainda não estiver corrigido. Em seguida, deve ser um problema com o certificado. Ele pode ter sido corrompido (você pode ver um código de erro de 0x8009001a no log de eventos do SChannel).
Tipo de Evento: Erro Fonte do evento: Schannel Categoria do Evento: Nenhum ID do evento: 36870 Data: 11/02/2012 Hora: 12:44:55 AM Usuário: N/A Computador: Ocorreu um erro fatal ao tentar acessar a chave privada de credencial do servidor SSL. O código de erro retornado do módulo criptográfico é 0x8009001a. Testaremos se o site funciona com um certificado de teste. Faça backup do certificado existente e substitua-o por um certificado autoassinado. Tente acessar o site por meio de https. Se funcionar, o certificado usado anteriormente foi corrompido e deve ser substituído por um novo certificado de trabalho.
Às vezes, o problema pode não ser com o certificado, mas com o emissor. Você pode ver o seguinte erro no SSLDiag:
CertVerifyCertificateChainPolicy falhará com CERT_E_UNTRUSTEDROOT (0x800b0109), se o certificado de autoridade de certificação raiz não for uma raiz confiável.
Para corrigir isso, adicione o certificado da AC ao repositório "AC raiz confiável" em Minha conta de computador no servidor.
Você também pode receber o seguinte erro:
CertVerifyCertificateChainPolicy retornou o erro -2146762480(0x800b0110).
Se o erro acima for recebido, precisamos verificar o tipo de uso do certificado. Abra o certificado, clique na guia "Detalhes" e clique em "Editar Propriedades..." Botão. Na guia Geral, verifique se "Habilitar todas as finalidades para esse certificado" está selecionado e, mais importante, "Autenticação de Servidor" deve estar presente na lista.
Cenário 3
As primeiras 2 etapas verificam a integridade do certificado. Depois de confirmarmos que não há problemas com o certificado, um grande problema será resolvido. Mas, e se o site ainda não estiver acessível por https. Verifique as associações HTTPS do site e determine em qual porta e IP ele está escutando. Você pode executar o comando a seguir para garantir que nenhum outro processo esteja escutando na porta SSL usada pelo site.
netstat -ano" or "netstat -anob
Se houver outro processo escutando nessa porta, verifique por que esse processo está consumindo essa porta. Tente alterar a combinação de IP-Port para verificar se o site está acessível ou não.
Cenário 4
Agora temos certeza de que temos um certificado de trabalho adequado instalado no site e não há outro processo usando a porta SSL para este site. No entanto, ainda recebo o erro "Página não pode ser exibida" ao acessar https. Quando um cliente se conecta e inicia uma negociação SSL, HTTP.sys procura em sua configuração SSL o par "IP:Port" ao qual o cliente se conectou. A configuração do HTTP.sys SSL deve incluir um hash de certificado e o nome do repositório de certificados antes que a negociação SSL seja bem-sucedida. O problema pode ser com o ouvinte do SSL HTTP.SYS.
O hash de certificado registrado com HTTP.SYS pode ser NULL ou pode conter GUID inválido. Execute o seguinte em um prompt de comando:
IIS 6: "httpcfg.exe query ssl" IIS 7/7.5: "netsh http show ssl"
Observação
O httpcfg faz parte das ferramentas de suporte do Windows e está presente no disco de instalação. Você também pode baixá-lo daqui:
https://www.microsoft.com/download/en/details.aspx?id=7911
Veja abaixo um exemplo de um cenário de trabalho e não funcionando:
Cenário de trabalho:
Configuração Configuração IP 0.0.0.0:443 Hash Guid {00000000-0000-0000-0000-000000000000} CertStoreName MY CertCheckMode 0 RevocationFreshnessTime 0 UrlRetrievalTimeout 0 SslCtlIdentifier 0 SslCtlStoreName 0 Flags 0 Cenário de não trabalho:
Configuração Configuração IP 0.0.0.0:443 Hash c09b416d6b 8d615db22 64079d15638e96823d Guid {4dc3e181-e14b-4a21-b022-59fc669b0914} CertStoreName MY CertCheckMode 0 RevocationFreshnessTime 0 UrlRetrievalTimeout 0 SslCtlIdentifier 0 SslCtlStoreName 0 Flags 0 O valor hash visto acima é a impressão digital do certificado SSL. Observe que o Guid é zero em um cenário que não funciona. Você pode ver o Hash tendo algum valor ou em branco. Mesmo que removamos o certificado do site e executemos "httpcfg query ssl", o site ainda listará Guid como todos os 0. Se você vir o GUID como "{0000..................000}, há um problema.
Precisamos remover essa entrada executando o comando:
httpcfg delete ssl -i "IP:Port Number"
Por exemplo:
httpcfg delete ssl –i 0.0.0.0:443
Exclua todas as entradas na lista de escuta de IP.
Para determinar se os endereços IP estão listados, abra um prompt de comando e execute o seguinte comando:
IIS 6: httpcfg query iplisten
IIS 7/7.5: netsh http show iplisten
Se a lista de escuta de IP estiver vazia, o comando retornará a seguinte cadeia de caracteres:
HttpQueryServiceConfiguration completed with 1168.
Se o comando retornar uma lista de endereços IP, remova cada endereço IP na lista usando o seguinte comando:
httpcfg delete iplisten -i x.x.x.x
Observação
reinicie o IIS após isso por meio do comando "net stop http /y"
Cenário 5
Depois de tudo isso, se você ainda não conseguir navegar pelo site em https, capture um rastreamento de rede do cliente ou do servidor. Filtre o rastreamento por "SSL ou TLS" para examinar o tráfego SSL.
Veja abaixo um instantâneo de rastreamento de rede de um cenário que não funciona:
Cenário de trabalho:
Bem, isso é definitivamente agora como você olha para um rastreamento de rede. Você precisa expandir os detalhes do quadro e ver qual protocolo e codificação foram escolhidos pelo servidor. Selecione "Server Hello" na descrição para obter esses detalhes.
No cenário de não funcionamento, o cliente foi configurado para usar somente o TLS 1.1 e o TLS 1.2. No entanto, o servidor Web era o IIS 6, que pode dar suporte até o TLS 1.0 e, portanto, o handshake falhou.
Verifique as chaves do Registro para determinar quais protocolos estão habilitados ou desabilitados. Este é o caminho:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
O DWORD "Habilitado" deve ser definido como "1". Se "0" for desabilitado, o protocolo será desabilitado.
Por exemplo, o SSL 2.0 está desabilitado por padrão.
Cenário 6
Se tudo tiver sido verificado e se você ainda estiver enfrentando problemas ao acessar o site por https, provavelmente será uma atualização que está fazendo com que o handshake SSL falhe.
A Microsoft lançou uma atualização para a implementação do SSL no Windows:
MS12-006: Vulnerability in SSL/TLS could allow information disclosure: January 10, 2012
Há potencial para essa atualização afetar os clientes que usam o Internet Explorer ou usar um aplicativo que usa o Internet Explorer para executar solicitações HTTPS.
Na verdade, foram feitas duas alterações para resolver a vulnerabilidade de divulgação de informações no SSL 3.0/TLS 1.0. A atualização MS12-006 implementa um novo comportamento no schannel.dll, que envia um registro extra usando uma codificação de bloco encadeado SSL comum, quando os clientes solicitam esse comportamento. A outra alteração foi em Wininet.dll, parte da atualização cumulativa de dezembro para o Internet Explorer (MS11-099), para que o IE solicite o novo comportamento.
Se houver um problema, ele poderá se manifestar como uma falha ao se conectar a um servidor ou uma solicitação incompleta. O Internet Explorer 9 pode exibir um erro "O Internet Explorer não pode exibir a página da Web". As versões anteriores do IE podem simplesmente exibir uma página em branco.
O Fiddler não usa o registro extra quando captura e encaminha solicitações HTTPS para o servidor. Portanto, se o Fiddler for usado para capturar o tráfego HTTPS, as solicitações terão êxito.
Chaves do Registro
Conforme documentado, https://support.microsoft.com/kb/2643584há um valor de registro SendExtraRecord, que pode:
- Desabilitar globalmente o novo comportamento SSL
- Habilitá-lo globalmente ou
- (Padrão) habilite-o para clientes SChannel que optam pelo novo comportamento.
Para o Internet Explorer e para clientes que consomem componentes do IE, há uma chave do Registro na seção FeatureControl, FEATURE_SCH_SEND_AUX_RECORD_KB_2618444, que determina se iexplore.exe ou qualquer outro aplicativo nomeado aceita o novo comportamento. Por padrão, isso está habilitado para o Internet Explorer e desabilitado para outros aplicativos.
Outros recursos
- Descrição do Handshake da Camada de Soquetes Seguros (SSL) (
https://support.microsoft.com/kb/257591
) - Descrição do processo de autenticação do servidor durante o handshake SSL (
https://support.microsoft.com/kb/257587
) - Corrigindo a Besta
- Doming the Beast (Browser Exploit Against SSL/TLS)
- EXTENSÕES DE ARQUIVO DE CERTIFICADO SSL
- Suporte para protocolos SSL/TLS no Windows
- Solução de problemas relacionados ao SSL com o IIS
- PRB: Não é possível visitar sites SSL depois de habilitar criptografia em conformidade com FIPS
- Não há suporte para cabeçalhos de host HTTP 1.1 quando você usa SSL (
https://support.microsoft.com/kb/187504
) - Configurando cabeçalhos de host SSL (IIS 6.0)