Partilhar via


Noções básicas sobre o suporte à criptografia

Baixar driver JDBC

Ao se conectar ao SQL Server, se o aplicativo solicitar criptografia e a instância do SQL Server estiver configurada para oferecer suporte à criptografia TLS, o Microsoft JDBC Driver for 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 podem enviar os dados criptografados com segurança. Durante o handshake TLS, o servidor envia seu certificado de chave pública para o cliente. O emissor de um certificado de chave pública é conhecido como Autoridade de Certificação (CA). O cliente é responsável por validar que a autoridade de certificação é aquela em que o cliente confia.

Se o aplicativo não solicitar criptografia, o Microsoft JDBC Driver para SQL Server não forçará o SQL Server a oferecer 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á automaticamente a criptografia TLS ao ser executado na Java Virtual Machine (JVM) configurada corretamente, ou a conexão será encerrada e o driver gerará um erro.

Observação

Verifique se o valor passado para serverName corresponde exatamente ao nome comum (CN) ou ao nome DNS no nome alternativo da entidade (SAN) no certificado do servidor para que uma conexão TLS seja bem-sucedida.

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

Observações

Para permitir que os aplicativos usem criptografia TLS, o Microsoft JDBC Driver para SQL Server introduziu as seguintes propriedades de conexão a partir da versão 1.2: encrypt, trustServerCertificate, trustStore, trustStorePassword e hostNameInCertificate. Para permitir que o driver use 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, consulte Definindo as propriedades de conexão.

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

  • em branco: "A propriedade não existe na cadeia de conexão"
  • value: "A propriedade existe na cadeia de conexão e seu valor é válido"
  • qualquer: "Não importa se a propriedade existe na cadeia de conexão ou se seu valor é 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 propriedade Comportamento
criptografar = falso ou em branco
trustServerCertificate = qualquer
hostNameInCertificate = qualquer
trustStore = qualquer
trustStorePassword = qualquer
O driver não forçará o servidor a suportar 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 login) serão criptografadas.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS, o driver iniciará a troca de certificados TLS. O certificado TLS não será validado, mas toda a comunicação será criptografada.
criptografar = true
trustServerCertificate = verdadeiro
hostNameInCertificate = qualquer
trustStore = qualquer
trustStorePassword = qualquer
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados TLS. Se a propriedade trustServerCertificate estiver definida como "true", o driver não validará o certificado TLS.

Se o servidor não estiver configurado para suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = em branco
trustStore = em branco
trustStorePassword = em branco
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados TLS.

O driver usará a propriedade serverName especificada na URL de conexão para validar o certificado TLS do servidor e confiará nas regras de pesquisa da fábrica do gerenciador de confiança para determinar qual armazenamento de certificados usar.

Se o servidor não estiver configurado para suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = valor
trustStore = em branco
trustStorePassword = em branco
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados TLS.

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

Se o servidor não estiver configurado para suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = em branco
trustStore = valor
trustStorePassword = valor
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados 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 suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = em branco
trustStore = em branco
trustStorePassword = valor
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados 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 suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = em branco
trustStore = valor
trustStorePassword = em branco
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados TLS.

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

Se o servidor não estiver configurado para suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = valor
trustStore = em branco
trustStorePassword = valor
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados 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 suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = valor
trustStore = valor
trustStorePassword = em branco
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados 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 suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = true
trustServerCertificate = falso ou em branco
hostNameInCertificate = valor
trustStore = valor
trustStorePassword = valor
O driver solicita o uso da criptografia TLS com o servidor.

Se o servidor exigir que o cliente ofereça suporte à criptografia TLS ou se o servidor suportar criptografia, o driver iniciará a troca de certificados 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 suportar criptografia, o driver gerará um erro e encerrará a conexão.
criptografar = rigoroso
hostNameInCertificate = valor
trustStore = em branco
trustStorePassword = em branco
serverCertificate = valor
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 false no strict modo.

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

Se o servidor não estiver configurado para suportar conexões TDS 8.0, o driver gerará um erro e encerrará a conexão.

Se a propriedade encrypt estiver 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 suportar todos os recursos necessários para negociar a criptografia TLS com êxito. Por exemplo, o provedor de segurança padrão pode não oferecer suporte ao 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:

  • Configurar o SQL Server com um certificado de 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"
  • Usar uma JVM diferente

Validando o certificado TLS do servidor

Durante o handshake TLS, o servidor envia seu certificado de chave pública para o cliente. O driver JDBC ou cliente precisa validar se o certificado do servidor é emitido por uma autoridade de certificação em que o cliente confia. O driver requer o certificado do servidor para atender à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 Common Name (CN) no campo Subject ou um nome DNS no campo Subject Alternate Name (SAN) do certificado corresponde exatamente ao valor de serverName especificado na cadeia de conexão ou, se especificado, ao 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 oferece suporte ao uso de caracteres curinga. Ou seja, abc.com não corresponderá a *.com mas *.com corresponderá a *.com. Com a versão 7.2 e posteriores, a compatibilidade com caracteres curinga em certificados padrão é suportada.

Para o uso do TDS 8.0 com strict criptografia, o valor da propriedade serverCertificate fornece o caminho para um certificado de servidor a ser usado para validação de certificado de servidor. Este ficheiro tem de utilizar o formato de ficheiro PEM. O certificado recebido do servidor deve corresponder exatamente a esse certificado.

Consulte também

Usando criptografia
Protegendo aplicativos de driver JDBC