Conectando-se com criptografia
Os exemplos deste artigo descrevem como usar propriedades de cadeia de conexão que permitem aos aplicativos usar a criptografia de protocolo TLS em um aplicativo Java. Veja mais informações sobre essas novas propriedades de cadeia de conexão, como criptografia, trustServerCertificate, trustStore, trustStorePassword e hostNameInCertificate, em Definindo as propriedades de conexão.
Configurar a conexão
Quando a propriedade encrypt estiver definida como true e a propriedade trustServerCertificate estiver definida como true, o Microsoft JDBC Driver para SQL Server não validará o certificado TLS do SQL Server. Essa configuração é comum para permitir conexões em ambientes de teste, como naqueles em que a instância do SQL Server tem apenas um certificado autoassinado.
O seguinte exemplo de código demonstra como definir a propriedade trustServerCertificate em uma cadeia de conexão:
String connectionUrl =
"jdbc:sqlserver://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;" +
"encrypt=true;trustServerCertificate=true";
Quando a propriedade encrypt estiver definida como true e a propriedade trustServerCertificate estiver definida como false, o Microsoft JDBC Driver para SQL Server validará o certificado TLS do SQL Server. A validação do certificado do servidor é parte do handshake TLS e garante que o servidor é o servidor correto para a conexão. Para validar o certificado do servidor, o material de confiança precisa ser fornecido no tempo de conexão usando as propriedades de conexão trustStore e trustStorePassword explicitamente ou usando o repositório de confiança padrão da JVM (Máquina Virtual Java) subjacente.
A propriedade trustStore especifica o caminho (incluindo o nome de arquivo) para o arquivo trustStore do certificado, que contém a lista de certificados na qual o cliente confia. A propriedade trustStorePassword especifica a senha usada para verificar a integridade dos dados de trustStore. Obtenha mais informações sobre como usar o repositório confiável padrão da JVM em Configurar o cliente para criptografia.
O seguinte exemplo de código demonstra como definir as propriedades trustStore e trustStorePassword em uma cadeia de conexão:
String connectionUrl =
"jdbc:sqlserver://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;" +
"encrypt=true; trustServerCertificate=false;" +
"trustStore=storeName;trustStorePassword=storePassword";
O JDBC Driver fornece outra propriedade, hostNameInCertificate, que especifica o nome do host do servidor. O valor dessa propriedade deve corresponder à propriedade subject do certificado.
O seguinte exemplo de código demonstra como usar a propriedade hostNameInCertificate em uma cadeia de conexão:
String connectionUrl =
"jdbc:sqlserver://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;" +
"encrypt=true; trustServerCertificate=false;" +
"trustStore=storeName;trustStorePassword=storePassword;" +
"hostNameInCertificate=hostName";
Observação
Como alternativa, você pode definir o valor das propriedades de conexão usando os métodos setter apropriados fornecidos pela classe SQLServerDataSource.
Se a propriedade encrypt for true, a propriedade trustServerCertificate for false e o nome do servidor na cadeia de conexão não corresponder ao nome do servidor no certificado TLS, o seguinte erro será emitido: The driver couldn't establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "java.security.cert.CertificateException: Failed to validate the server name in a certificate during Secure Sockets Layer (SSL) initialization."
. Com a versão 7.2 e posterior, o driver dá suporte à correspondência de padrão de caractere curinga no rótulo à extrema esquerda do nome do servidor no certificado TLS.