Noções básicas sobre suporte à criptografia

Baixar o JDBC Driver

Ao estabelecer conexão com o SQL Server, se o aplicativo solicitar criptografia e a instância do SQL Server estiver configurada para dar suporte à criptografia TLS, o Microsoft JDBC Driver para SQL Server iniciará o handshake TLS. O handshake permite que o servidor e o cliente negociem a criptografia e os algoritmos criptográficos a serem usados para proteger os dados. Após a conclusão do handshake TLS, o cliente e o servidor poderão enviar com segurança os dados criptografados. Durante o handshake TLS, o servidor envia seu certificado de chave pública ao cliente. O emissor de um certificado de chave pública é conhecido como uma Autoridade de Certificação (CA). O cliente é responsável por validar que a autoridade de certificação é de sua confiança.

Se o aplicativo não solicitar criptografia, o Microsoft JDBC Driver para SQL Server não forçará o SQL Server a dar suporte à criptografia TLS. Se a instância do SQL Server não estiver configurada para forçar a criptografia TLS, uma conexão será estabelecida sem criptografia. Se a instância do SQL Server estiver configurada para forçar a criptografia TLS, o driver habilitará a criptografia TLS automaticamente na execução em JVM (Máquina Virtual Java) configurada adequadamente; caso contrário, a conexão será encerrada e o driver gerará um erro.

Observação

Verifique se o valor passado para serverName corresponde exatamente ao CN (Nome Comum) ou ao nome DNS na rede SAN (Nome Alternativo da Entidade) no certificado do servidor para que uma conexão TLS tenha êxito.

Para obter mais informações sobre como configurar o TLS para SQL Server, confira Habilitar conexões criptografadas no Mecanismo de Banco de Dados.

Comentários

Para permitir que os aplicativos usem a criptografia TLS, o Microsoft JDBC Driver para SQL Server introduziu as seguintes propriedades de conexão da versão 1.2 em diante: encrypt, trustServerCertificate, trustStore, trustStorePassword e hostNameInCertificate. Para permitir que o driver use o TDS 8.0 com criptografia TLS, a propriedade de conexão serverCertificate foi introduzida a partir da versão 11.2. Para obter mais informações, veja Configuração das propriedades de conexão.

A tabela a seguir resume o comportamento da versão do Microsoft JDBC Driver para SQL Server em possíveis cenários de conexão TLS. Cada cenário usa um conjunto diferente de propriedades de conexão TLS. A tabela inclui:

  • blank: "A propriedade não existe na cadeia de conexão"
  • value: "A propriedade existe na cadeia de conexão e o valor dela é válido"
  • any: "Não importa se a propriedade existe na cadeia de conexão nem se o valor dela é válido"

Observação

O mesmo comportamento se aplica à autenticação de usuário do SQL Server e à autenticação integrada do Windows.

Configurações de propriedades Comportamento
Encrypt = false ou blank
trustServerCertificate = any
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
O driver não forçará o servidor a dar suporte à criptografia TLS. Se o servidor tiver um certificado autoassinado, o driver iniciará a troca de certificados TLS. O certificado TLS não será validado, e apenas as credenciais (no pacote de logon) são criptografadas.

Se o servidor exigir que o cliente dê suporte à criptografia TLS, o driver iniciará a troca de certificado TLS. O certificado TLS não será validado, mas a comunicação inteira será criptografada.
encrypt = true
trustServerCertificate = true
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS. Se a propriedade trustServerCertificate for definida como "true", o driver não validará o certificado TLS.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = blank
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará a propriedade serverName especificada na URL da conexão para validar o certificado TLS do servidor e contará com as regras de procura da fábrica do gerenciador de confiança para determinar qual repositório de certificados deve usar.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver validará o valor de entidade do certificado TLS usando o valor especificado para a propriedade hostNameInCertificate.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = value
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará o valor da propriedade trustStore para localizar o arquivo trustStore do certificado e o valor da propriedade trustStorePassword para verificar a integridade do arquivo trustStore.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = value
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará o valor da propriedade trustStorePassword para verificar a integridade do arquivo trustStore padrão.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = blank
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará o valor da propriedade trustStore para procurar o local do arquivo trustStore.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = value
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará o valor da propriedade trustStorePassword para verificar a integridade do arquivo trustStore padrão. Além disso, o driver usará o valor da propriedade hostNameInCertificate para validar o certificado TLS.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = blank
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará o valor da propriedade trustStore para procurar o local do arquivo trustStore. Além disso, o driver usará o valor da propriedade hostNameInCertificate para validar o certificado TLS.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = value
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente dê suporte à criptografia TLS ou se o servidor der suporte à criptografia, o driver iniciará a troca de certificado TLS.

O driver usará o valor da propriedade trustStore para localizar o arquivo trustStore do certificado e o valor da propriedade trustStorePassword para verificar a integridade do arquivo trustStore. Além disso, o driver usará o valor da propriedade hostNameInCertificate para validar o certificado TLS.

Se o servidor não estiver configurado para dar suporte à criptografia, o driver gerará um erro e encerrará a conexão.
encrypt = strict
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
serverCertificate = value
O driver solicita o uso da criptografia TDS 8.0 strict TLS com o servidor.

O driver iniciará o handshake TLS e a troca de certificados com o servidor como a primeira ação.

A configuração trustServerCertificate é ignorada e tratada como falsa no modo strict.

O driver usará as propriedades opcionais hostNameInCertificate ou serverCertificate para validar o certificado TLS do servidor.

Se o servidor não estiver configurado em suporte a conexões TDS 8, o driver gerará um erro e encerrará a conexão.

Se a propriedade de criptografia for definida como true, o Microsoft JDBC Driver para SQL Server usará o provedor de segurança JSSE padrão da JVM para negociar a criptografia TLS com o SQL Server. O provedor de segurança padrão pode não dar suporte a todos os recursos necessários para negociar a criptografia TLS com êxito. Por exemplo, o provedor de segurança padrão pode não ser compatível com o tamanho da chave pública RSA usada no certificado TLS do SQL Server. Nesse caso, o provedor de segurança padrão pode gerar um erro que fará com que o driver JDBC encerre a conexão. Para resolver esse problema, uma das seguintes opções pode ser usada:

  • Configure o SQL Server com um certificado do servidor que tenha uma chave pública RSA menor
  • Configure a JVM para usar um provedor de segurança JSSE diferente no arquivo de propriedades de segurança "<java-home>/lib/security/java.security"
  • Use uma JVM diferente

Como validar o certificado TLS do servidor

Durante o handshake TLS, o servidor envia seu certificado de chave pública ao cliente. O JDBC Driver ou o cliente precisa validar que o certificado do servidor é emitido por uma autoridade de certificação de confiança do cliente. O Driver requer que o certificado do servidor atenda às seguintes condições:

  • O certificado foi emitido por uma autoridade de certificação confiável.
  • O certificado deve ser emitido para autenticação do servidor.
  • O certificado não expirou.
  • O CN (Nome Comum) na Entidade ou um nome DNS na rede SAN (Nome Alternativo da Entidade) do certificado coincide com o valor serverName especificado na cadeia de conexão ou, caso especificado, com o valor da propriedade hostNameInCertificate.
  • Um nome DNS pode incluir caracteres curinga. Antes da versão 7.2, o Microsoft JDBC Driver para SQL Server não dá suporte à correspondência de caracteres curinga. Ou seja, abc.com não corresponderá a *.com, mas *.com corresponderá a *.com. A partir da versão 7.2, a correspondência de curingas de certificado padrão tem suporte.

Para uso do TDS 8.0 com criptografia strict, o valor da propriedade serverCertifcate fornece o caminho para um certificado do servidor a ser usado para validação do certificado do servidor. Esse arquivo deve usar o formato de PEM. O certificado recebido do servidor deve corresponder exatamente a este certificado.

Confira também

Usando criptografia
Protegendo aplicativos do JDBC Driver