March 27, 2018 SQLCORE

Erro de SSL com certificados ao inicializar serviço do SQL Server

Olá Pessoal,

Algum tempo sem escrever por aqui, hoje vou descrever como fiz o troubleshooting de um problema em um cliente.

Foi reportado que o serviço do SQL Server não iniciava. Primeira ação é tentar subir o serviço e verificar os erros no Event Viewer. Ao fazer isso, recebi as seguintes mensagens:

Initializing the FallBack certificate failed with error code: 1, state: 20, error number: 0.

Unable to initialize SSL encryption because a valid certificate could not be found, and it is not possible to create a self-signed certificate.

TDSSNIClient initialization failed with error 0x80092004, status code 0x80. Reason: Unable to initialize SSL support. Cannot find object or property.

TDSSNIClient initialization failed with error 0x80092004, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. Cannot find object or property.

Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log.

SQL Server could not spawn FRunCommunicationsManager thread. Check the SQL Server error log and the Windows event logs for information about possible related problems.

Anteriormente havia acontecido um problema semelhante em outro servidor onde a correção foi trocar a conta de serviço que iniciava o serviço do SQL Server. Tentei esse procedimento e não deu certo… Vamos investigar.

De acordo com as mensagens o problema tinha algo relacionado com o certificado que o SQL Server estava utilizando. A segunda mensagem de erro foi a que para mim mais ajudou a esclarecer o problema:

Unable to initialize SSL encryption because a valid certificate could not be found, and it is not possible to create a self-signed certificate.

Destaquei alguns termos chave para analisar o problema… Eu que não acredito em troubleshooting no estilo “tentativa-erro”, fui pesquisar sobre como o SQL utiliza SSL para entender a cadeia de eventos que ocorreram e geraram o erro.

De acordo com a documentação do SQL Server, ao inicializar o serviço do SQL, ele tenta utilizar um certificado válido e confiável (trusted) existente, caso não exista um, ele cria um certificado (self-signed certificate) para criptografar os dados que serão trocados entre a aplicação e o SQL Server. Entretando, a mensagem de erro diz que não foi possível criar esse certificado.

A próxima mensagem de erro nos diz onde verificar essa questão do certificado. Veja esse trecho da mensagem: TDSSNIClient initialization failed. TDS que significa Tabular Data Stream é o formato de dados que o SQL utiliza para transmitir informações entre o Engine e a aplicação. SNI significa SQL Server Network Interface e é a camada de protocolo por onde “navega” as informações no formato TDS. Referência aqui. Entendendo essa parte, podemos deduzir que estamos falando da camada de protocolos do SQL Server. Vamos então para o Configuration Manager verificar estas informações.

Como podemos observar nas propriedades da camada de protocolos do SQL Server, não há nenhum certificado associado e neste caso, mesmo na lista suspensa, não aparece nenhum certificado disponível para uso.

Pesquisando um pouco, cheguei até este artigo que explica como criar e registrar certificados SSL para o SQL Server. Eu utilizei o método com Powershell. Ao invés de simplesmente executar o comando simplesmente mudando alguns parâmetros, vale a pena a leitura desta documentação, na parte de requisitos para certificados no SQL Server.

Caso o certificado tenha sido criado com sucesso, podemos voltar ao Configuration Manager, ir nas propriedades dos protocolos de rede e associar o nosso certificado ao SQL. No meu caso, ao fazer isso e iniciar o serviço do SQL, ele subiu normalmente. Problema resolvido.

Adicionais:

Você pode verificar a criação do certificado abrindo o Snap-in “Certificates”. Abra uma janela do MMC e siga as instruções abaixo:

Adicione um novo Snap-In no MMC:

Escolha o Snap-In Certificates para ser adicionado:

Este Snap-In pede algumas configurações. Escolha “Computer Account” para visualizar os certificados locais:

Confirme a inclusão deste Snap-In para visualizar os certificados:

Certificados locais criados no servidor e o último criado:

Propriedades do certificado. Destaque para a propriedade “Thumbprint”:

Ao escolher o certificado nas propriedades de protocolos do SQL Server, essa propriedade “Thumbprint” fica salva na seguinte chave de registro do SQL Server: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer\SuperSocketNetLib. No caso do certificado não aparecer na lista suspensa, um troubleshooting seria alterar essa chave de registro manualmente. 😉

Bem, é isso. Espero que o conteúdo ajude em seus próximos troubleshootings.

Bons estudos.
Erickson Ricci

,

Leave a Reply

Your email address will not be published. Required fields are marked *