Connessione tramite la crittografia

Scaricare il driver JDBC

Gli esempi in questo articolo descrivono come usare le proprietà della stringa di connessione che consentono alle applicazioni di usare la crittografia TLS (Transport Layer Security) in un'applicazione Java. Per altre informazioni sulle nuove proprietà della stringa di connessione, ad esempio encrypt, trustServerCertificate, trustStore, trustStorePassword e hostNameInCertificate, vedere Impostazione delle proprietà delle connessioni.

Configurazione della connessione

Se la proprietà encrypt è impostata su true e la proprietà trustServerCertificate è impostata su true, il driver Microsoft JDBCper SQL Server non convalida il certificato TLS di SQL Server. Questa impostazione viene usata comunemente per consentire le connessioni in ambienti di test, ad esempio nel caso in cui l'istanza di SQL Server disponga solo di un certificato autofirmato.

L'esempio di codice seguente illustra come impostare la proprietà trustServerCertificate in una stringa di connessione:

String connectionUrl =
    "jdbc:sqlserver://localhost:1433;" +
     "databaseName=AdventureWorks;integratedSecurity=true;" +
     "encrypt=true;trustServerCertificate=true";

Se la proprietà encrypt è impostata su true e la proprietà trustServerCertificate è impostata su false, il driver Microsoft JDBCper SQL Server convalida il certificato TLS di SQL Server. La convalida del certificato del server fa parte dell'handshake TLS e assicura che il server a cui si esegue la connessione sia quello corretto. Per la convalida del certificato del server è necessario che in fase di connessione venga fornito il materiale relativo all'attendibilità usando in modo esplicito le proprietà di connessione trustStore e trustStorePassword oppure usando in modo implicito l'archivio di scopi predefinito di JVM (Java Virtual Machine) sottostante.

La proprietà trustStore specifica il percorso (incluso il nome file) del file trustStore, che contiene l'elenco di certificati considerati attendibili dal client. La proprietà trustStorePassword specifica la password usata per verificare l'integrità dei dati del file trustStore. Per altre informazioni sull'uso dell'archivio di attendibilità predefinito di JVM, vedere Configurazione del client per la crittografia.

L'esempio di codice seguente illustra come impostare le proprietà trustStore e trustStorePassword in una stringa di connessione:

String connectionUrl =
    "jdbc:sqlserver://localhost:1433;" +
     "databaseName=AdventureWorks;integratedSecurity=true;" +
     "encrypt=true; trustServerCertificate=false;" +
     "trustStore=storeName;trustStorePassword=storePassword";

Il driver JDBC è dotato di un’altra proprietà, hostNameInCertificate, che specifica il nome host del server. Il valore di questa proprietà deve corrispondere alla proprietà relativa al soggetto del certificato.

L'esempio di codice seguente illustra come usare la proprietà hostNameInCertificate in una stringa di connessione:

String connectionUrl =
    "jdbc:sqlserver://localhost:1433;" +
     "databaseName=AdventureWorks;integratedSecurity=true;" +
     "encrypt=true; trustServerCertificate=false;" +
     "trustStore=storeName;trustStorePassword=storePassword;" +
     "hostNameInCertificate=hostName";

Nota

In alternativa, è possibile impostare il valore delle proprietà di connessione usando i metodi setter appropriati offerti dalla classe SQLServerDataSource.

Se la proprietà encrypt è true, la proprietà trustServerCertificate è false e il nome del server nella stringa di connessione non corrisponde al nome del server nel certificato TLS, viene restituito l'errore seguente: 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.". Con la versione 7.2 e successive, il driver supporta la corrispondenza dei criteri di ricerca con caratteri jolly nell'etichetta all'estrema sinistra del nome del server nel certificato TLS.