Informazioni sul supporto della crittografia
Quando si esegue la connessione a SQL Server, se l'applicazione richiede la crittografia e l'istanza di SQL Server è configurata per supportare la crittografia TSL, Microsoft JDBC Driver per SQL Server avvia l'handshake TSL. L'handshake consente al server e al client di negoziare la crittografia e gli algoritmi di crittografia da utilizzare per proteggere i dati. Al termine dell'handshake TLS, il client e il server possono inviare in modo protetto i dati crittografati. Durante l'handshake TLS, il server invia il certificato di chiave pubblica al client. L'emittente di un certificato a chiave pubblica è noto come Autorità di certificazione (CA). Il client è responsabile della convalida dell'attendibilità dell'Autorità di certificazione per il client stesso.
Se l'applicazione non richiede la crittografia, Microsoft JDBC Driver per SQL Server non impone a SQL Server il supporto della crittografia TLS. Se l'istanza di SQL Server non è configurata in modo da imporre la crittografia TLS, viene stabilita una connessione senza crittografia. Se l'istanza di SQL Server è configurata per la forzatura della crittografia TLS, il driver abilita questo tipo di crittografia automaticamente durante l'esecuzione in Java Virtual Machine (JVM) correttamente configurato. In caso contrario, la connessione viene terminata e il driver genera un errore.
Nota
Perché una connessione TLS riesca, assicurarsi che il valore passato a serverName corrisponda esattamente al nome comune o al nome DNS nel nome soggetto alternativo (SAN, Subject Alternate Name) nel certificato del server.
Per altre informazioni su come configurare TLS per SQL Server, vedere Abilitare le connessioni crittografate al motore di database.
Osservazioni:
Per consentire alle applicazioni di usare la crittografia TLS, a partire dalla versione 1.2 di Microsoft JDBC Driver per SQL Server sono state introdotte le proprietà di connessione seguenti: encrypt, trustServerCertificate, trustStore, trustStorePassword e hostNameInCertificate. Per consentire al driver di usare TDS 8.0 con la crittografia TLS, è stata introdotta la proprietà di connessione serverCertificate a partire dalla versione 11.2. Per altre informazioni, vedere Impostazione delle proprietà di connessione.
La tabella seguente offre un riepilogo del comportamento della versione di Microsoft JDBC Driver per SQL Server per i possibili scenari di connessione TLS. In ogni scenario viene usato un set di proprietà di connessione TLS diverso. La tabella include i valori seguenti:
- blank: "la proprietà non esiste nella stringa di connessione"
- valore: "La proprietà esiste nella stringa di connessione e il suo valore è valido"
- any: "non è importante se la proprietà esiste nella stringa di connessione o se il relativo valore è valido"
Nota
Lo stesso comportamento si applica all'autenticazione utente di SQL Server e all'autenticazione integrata di Windows.
Impostazioni delle proprietà | Comportamento |
---|---|
encrypt = false o blank trustServerCertificate = any hostNameInCertificate = any trustStore = any trustStorePassword = any |
Il driver non impone al server di supportare la crittografia TLS. Se il server dispone di un certificato autofirmato, tramite il driver viene avviato lo scambio del certificato TLS. Il certificato TLS non viene convalidato e vengono crittografate solo le credenziali nel pacchetto di accesso. Se il server richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il certificato TLS non viene convalidato, ma viene crittografata l'intera comunicazione. |
encrypt = true trustServerCertificate = true hostNameInCertificate = any trustStore = any trustStorePassword = any |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Se la proprietà trustServerCertificate è impostata su "true", il driver non convalida il certificato TLS. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = blank trustStore = blank trustStorePassword = blank |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. La proprietà serverName specificata nell'URL di connessione viene usata dal driver per convalidare il certificato TLS del server e le regole di ricerca della factory del gestore di attendibilità vengono usate per determinare l'archivio certificati da usare. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = value trustStore = blank trustStorePassword = blank |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver convalida il valore del soggetto del certificato TLS tramite il valore specificato per la proprietà hostNameInCertificate. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = blank trustStore = value trustStorePassword = value |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver usa il valore della proprietà trustStore per cercare il file trustStore del certificato e il valore della proprietà trustStorePassword per controllare l'integrità del file trustStore. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = blank trustStore = blank trustStorePassword = value |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver usa il valore della proprietà trustStorePassword per controllare l'integrità del file trustStore predefinito. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = blank trustStore = value trustStorePassword = blank |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver usa il valore della proprietà trustStore per cercare la posizione del file trustStore. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = value trustStore = blank trustStorePassword = value |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver usa il valore della proprietà trustStorePassword per controllare l'integrità del file trustStore predefinito. Il driver usa inoltre il valore della proprietà hostNameInCertificate per convalidare il certificato TLS. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = value trustStore = value trustStorePassword = blank |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver usa il valore della proprietà trustStore per cercare la posizione del file trustStore. Il driver usa inoltre il valore della proprietà hostNameInCertificate per convalidare il certificato TLS. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = true trustServerCertificate = false o blank hostNameInCertificate = value trustStore = value trustStorePassword = value |
Il driver richiede di usare la crittografia TLS con il server. Se il server supporta la crittografia o richiede il supporto della crittografia TLS da parte del client, tramite il driver viene avviato lo scambio del certificato TLS. Il driver usa il valore della proprietà trustStore per cercare il file trustStore del certificato e il valore della proprietà trustStorePassword per controllare l'integrità del file trustStore. Il driver usa inoltre il valore della proprietà hostNameInCertificate per convalidare il certificato TLS. Se il server non è configurato per supportare la crittografia, il driver genera un errore e termina la connessione. |
encrypt = strict hostNameInCertificate = value trustStore = blank trustStorePassword = blank serverCertificate = value |
Il driver richiede di usare la crittografia TLS strict TDS 8.0 con il server.Il driver avvierà lo scambio di handshake e certificato TLS con il server come prima azione. L'impostazione trustServerCertificate viene ignorata e considerata false in modalità strict .Il driver userà le proprietà hostNameInCertificate o serverCertificate facoltative per convalidare il certificato TLS del server. Se il server non è configurato per supportare le connessioni TDS 8, il driver genera un errore e termina la connessione. |
Se la proprietà di crittografia è impostata su true, Microsoft JDBC Driver per SQL Server usa il provider di sicurezza JSSE predefinito di JVM per negoziare la crittografia TLS con SQL Server. È possibile che il provider di sicurezza predefinito non supporti tutte le funzionalità necessarie per negoziare la crittografia TLS. Il provider di sicurezza predefinito può ad esempio non supportare la dimensione della chiave pubblica RSA usata nel certificato TLS di SQL Server. In questo caso, è possibile che venga generato un errore dal provider di sicurezza predefinito, a causa del quale la connessione viene terminata dal driver JDBC. Per risolvere questo problema, è possibile usare una delle opzioni seguenti:
- Configurare SQL Server con un certificato del server con una chiave pubblica RSA più piccola
- Configurare JVM per l'uso di un provider di sicurezza JSSE diverso nel file delle proprietà di sicurezza "<java-home>/lib/security/java.security"
- Utilizzare una versione di JVM diversa.
Convalida del certificato TLS del server
Durante l'handshake TLS, il server invia il certificato di chiave pubblica al client. Il driver JDBC o il client deve verificare che il certificato del server sia stato emesso da un'Autorità di certificazione considerata attendibile dal client. Il driver richiede che il certificato del server soddisfi le condizioni seguenti:
- Il certificato è stato emesso da un'Autorità di certificazione attendibile.
- Il certificato deve essere emesso per l'autenticazione del server.
- Il certificato non è scaduto.
- Il nome comune nell'oggetto o un nome DNS nel nome alternativo del soggetto (SAN, Subject Alternate Name) del certificato corrisponde esattamente al valore serverName specificato nella stringa di connessione o, se specificato, al valore della proprietà hostNameInCertificate.
- Un nome DNS può includere caratteri jolly. Nella versione precedente 7.2 di Microsoft JDBC Driver per SQL Server la corrispondenza con caratteri jolly non è supportata. In altre parole, abc.com non corrisponderà a *.com, ma *.com corrisponderà a *.com. Con la versione 7.2 e versioni successive, è supportata la corrispondenza con caratteri jolly del certificato standard.
Per l'uso di TDS 8.0 con la crittografia strict
, il valore della proprietà serverCertificate contiene il percorso di un certificato del server da usare per la convalida del certificato del server. Questo file deve usare il formato di file PEM. Il certificato ricevuto dal server deve corrispondere esattamente a questo certificato.
Vedi anche
Uso della crittografia
Protezione delle applicazioni del driver JDBC