Configurando um certificado para ser usado no SSL

Os Serviços Web de XML nativos foram preteridos. Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

Nas comunicações SSL, um servidor HTTP deve ter um certificado registrado para cada soquete (combinação de endereço IP/porta) que está sendo habilitado para uso com SSL. Os certificados devem ser autorizados para a autenticação de servidor. Para isso, obtenha um certificado SSL de uma autoridade emissora de certificados, como a Verisign, ou se for para fins de teste, usando ferramentas para emitir e criar seu próprio certificado.

Independentemente se um certificado for obtido ou emitido por conta própria, ele deve ser registrado no servidor. Recomenda-se usar o utilitário de configuração de HTTP (HttpCfg.exe) para registrar, examinar e excluir certificados SSL.

Registrando certificados SSL

Para registrar um certificado, use o seguinte comando:

httpcfg set ssl /iIP:Port**/hHash/g**Guid

Argumentos

  • IP:Port
    A combinação de endereço IP e porta para a qual você está registrando o certificado.

  • Hash
    Hash do certificado.

    ObservaçãoObservação

    O hash do certificado pode ser obtido do repositório de certificados. Ele pode ser exibido usando o snap-in de Certificados ou uma ferramenta de linha de comando, como CertUtil.

  • Guid
    A cadeia de caracteres GUID que identifica a entidade que registra o certificado. Como uma prática recomendada, crie uma cadeia GUID para cada instância do SQL Server e use essa mesma cadeia para todos os registros de certificado feitos por essa instância.

O registro de um certificado SSL para uma IP:Port afeta todos os aplicativos que escutam nessa IP:Port. Por exemplo, se a instância do SQL Server e outro aplicativo, como IIS, estiverem escutando na mesma combinação IP:Port (10.0.0.1:80), a instância do SQL Server que está registrando um certificado SSL para 10.0.0.1:80 afetará o IIS; e o IIS e a instância do SQL Server terão que compartilhar o uso do mesmo certificado comum. Esta é uma limitação do driver HTTP (Http.sys) no modo kernel. Quando Http.sys recebe uma solicitação na combinação IP:Port 10.0.0.1:80, pelo fato de a solicitação estar criptografada, ele não pode examinar o URL a fim de determinar se a solicitação pertence ao SQL Server ou ao IIS. O Https.sys só pode rotear a solicitação depois que ela tiver sido descriptografada. Portanto, não pode usar um certificado SSL diferente para os aplicativos que escutam na mesma combinação IP:Port.

Se SQL Server estiver sendo executado no Windows Vista (ou em uma edição equivalente do Windows Server), você pode ter que registrar especificamente o certificado para o endereço IP local (IPv4: 127.0.0.1 ou IPv6: [::1]), assim como o endereço IP externo do computador, para habilitar a conectividade "locahost" no SSL. Como opção, é possível especificar o endereço não especificado (IPv4: 0.0.0.0 ou IPv6: [::]) durante o registro do certificado SSL. Além disso, o Windows Vista agora dispõe de uma ferramenta interna que auxilia o gerenciamento de registros de certificados SSL, em vez de usar a ferramenta httpcfg.exe; o novo comando tem a seguinte aparência:

netsh http add sslcert ipport=IP:Port certhash=Hash appid=Guid

Por exemplo:

netsh http add sslcert ipport=[::]:443 certhash=<hash> appid=<guid>Examples

O seguinte exemplo registra um certificado:

httpcfg set ssl /i 10.0.0.1:80 /h 2c8bfddf59a4a51a2a5b6186c22473108295624d 
/g "{2bb50d9c-7f6a-4d6f-873d-5aee7fb43290}"

Consultando certificados

Para exibir todos os certificados registrados, use o seguinte comando:

httpcfg query ssl

Para exibir um único certificado, use a opção /i:

httpcfg query ssl /iIP:Port

Argumentos

  • IP:Port
    Combinação de endereço IP e porta para a qual você está examinando o certificado.

Exemplo

httpcfg query ssl 
httpcfg query ssl /I 10.0.0.1:80

Excluindo certificados SSL

Para excluir um certificado, use a opção /i como segue:

httpcfg delete ssl /iIP:Port

Argumentos

  • IP:Port
    Combinação de endereço IP e porta para a qual você está excluindo o certificado.

Exemplo

httpcfg delete ssl /i 10.0.0.1:80

Obtendo certificados

Você pode obter certificados obrigatórios no SQL Server para comunicações SSL com clientes baseados na Internet de uma autoridade de certificação como Verisign.

Porém, para fins de teste, você pode criar um certificado de teste com uma ferramenta chamada MakeCert.exe. MakeCert.exe faz parte do SDK do .NET Framework. Essa ferramenta também está disponível no SDK da Plataforma. Para baixar os SDKs, vá para o Centro do Desenvolvedor do Microsoft .NET Framework e o Centro de Download da Microsoft, respectivamente. MakeCert.exe cria um certificado X.509. Ela cria um par de chaves pública e privada para assinaturas digitais e o armazena em um arquivo de certificado. Essa ferramenta também associa o par de chaves a um publicador especificado e cria um certificado X.509 que vincula um nome especificado pelo usuário a uma parte pública do par de chaves.

Para criar um certificado SSL para um servidor que responde a um nome de host (MySQLServer), você pode executar MakeCert com as seguintes opções:

makecert -r -pe -nCN="MySQLServer**"-eku1.3.6.1.5.5.7.3.1-ssmy-srlocalmachine**

-skyexchange-sp"Microsoft RSA SChannel Cryptographic Provider"-sy12

Opções de linha de comando

  • -r
    Cria um certificado autoassinado. Um certificado autoassinado é um certificado que não é assinado por uma autoridade de certificação. Por esse motivo, ele pode ser usado para a criptografia obrigatória em SSL, mas não pode ser usado para a autenticação do servidor.

  • -n
    Especifica o nome do servidor. Esse nome deve estar em conformidade com o padrão X.500. O método mais simples é especificar o nome em aspas duplas, precedido por CN=.

  • -eku
    Especifica uma lista de identificadores de objetos (OIDs) separados por vírgulas e de uso avançado de chaves no certificado. Para o SQL Server, é necessário um certificado SSL válido para autenticação do servidor e que tenha um OID de 1.3.6.1.5.5.7.3.1 (szOID_PKIX_KP_SERVER_AUTH).

  • -ss
    Especifica o repositório de certificados onde o certificado criado é salvo. Recomenda-se salvá-lo no repositório my, embora possa ser salvo em qualquer lugar no repositório de certificados.

  • -sr
    Especifica o repositório de certificados onde o certificado está localizado. O local ou pode ser: currentuser (o padrão) ou localmachine. Como esse certificado está sendo criado para um serviço, ele deve ser colocado no computador local.

  • -sky
    Especifica o tipo de chave de certificado. O tipo deve ser signature, exchange ou um valor inteiro, como 4. Para o algoritmo de troca de chave pública RSA, exchange é o tipo necessário. Este é o tipo de chave usada para criptografar e descriptografar chaves de sessão.

  • -sp
    Especifica o nome do provedor de CryptoAPI. Para certificados criados para o SQL Server, é possível definir no Provedor de criptografia Microsoft RSA SChannel.

  • -sy
    Especifica o tipo de provedor de CryptoAPI. Quando o provedor for o Provedor de criptografia Microsoft RSA SChannel, este valor é 12.

Opções adicionais de linha de comando

  • -b
    Valor de data no formato mm/dd/aaaa que especifica o início do período de validade do certificado. O padrão é a data de criação do certificado.

  • -e
    O valor de data no formato mm/dd/aaaa que especifica o término do período de validade do certificado. Caso não esteja definido, o padrão será 12/31/2039 11:59:59 GMT.

Exemplos

O exemplo a seguir mostra como criar um certificado usando MakeCert com as opções adicionais.

makecert -r -pe -n "CN= MySQLServerName" -b 01/01/2000 -e 01/01/2036 
    -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange 
    -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

Uma vez criado o certificado, você pode obter seu hash do MMC do certificado ou por meio de uma ferramenta, como CertUtil. Usando CertUtil, você pode listar o certificado recém-criado.

C:\>certutil -store "my" "MySQLServerName"

================ Certificate 2 ================
Serial Number: e302d3a7a831c9884c0dd736f24825e6
Issuer: CN=MySQLServerName
Subject: CN=MySQLServerName
Signature matches Public Key
Root Certificate: Subject matches Issuer
Cert Hash(sha1): d2 2f 9a 7f 18 cb ed 13 a1 3e be e5 32 69 6c 4b ad ba b9 30
  Key Container = 956cbc46-f005-4aeb-b521-7c313f2ccd10
  Provider = Microsoft RSA SChannel Cryptographic Provider
Encryption test passed
CertUtil: -store command completed successfully.

O hash obtido dos resultados executando CertUtil pode ser passado à ferramenta Httpcfg.exe para registrar o certificado autoassinado.

Antes de usar MakeCert para criar um certificado SSL autoassinado e registrá-lo com Http.sys, verifique se o computador já tem o IIS instalado. O IIS dispõe de um assistente que facilita o registro de certificados SSL. Portanto, se o IIS já estiver instalado no computador, um certificado SSL já pode ter sido registrado com Http.sys. Caso contrário, você poderá usar o assistente do IIS para criar e registrar o certificado.

Pelo fato de os certificados SSL terem um efeito em todo o computador, não é importante usar o IIS para registrar um certificado que vai ser usado pelo SQL Server.

Considerações

  • Quando você desinstalar uma instância do SQL Server, qualquer associação de certificado SSL criada com Httpcfg.exe permanecerá, a menos que seja excluída manualmente. Como essas configurações não foram criadas com o Programa de Instalação do SQL Server, elas não serão removidas por ele. Portanto, se uma instância do SQL Server for desinstalada, as associações também deverão ser removidas.

  • Embora o uso de SSL por meio de HTTP com SQL Server não exija o IIS, depois que o IIS for instalado junto com uma instância do SQL Server, o serviço HTTP SSL vincula-se ao uso do IIS. Por exemplo, quando você interrompe o IIS, usando net stop iisadmin em um prompt de comando, o IIS também para o serviço HTTP SSL. Além disso, depois que o IIS é instalado no Windows, você não pode iniciar o serviço HTTP SSL sem também iniciar o IIS (Inetinfo.exe).