Descripción de la compatibilidad con cifrado

Descargar controlador JDBC

Al conectarse a SQL Server, si la aplicación solicita cifrado y la instancia de SQL Server está configurada para admitir el cifrado TLS, Microsoft JDBC Driver para SQL Server inicia el protocolo de enlace TLS. El protocolo de enlace permite al servidor y al cliente negociar los algoritmos criptográficos y de cifrado que se usarán para proteger los datos. Después de completar el protocolo de enlace TLS, el cliente y el servidor pueden enviar los datos cifrados de forma segura. Durante el protocolo de enlace TLS, el servidor envía su certificado de clave pública al cliente. El emisor de un certificado de clave pública se conoce como entidad de certificación (CA, Certificate Authority). El cliente es responsable de validar que la entidad de certificación sea una en la que el cliente confíe.

Si la aplicación no solicita el cifrado, Microsoft JDBC Driver para SQL Server no exige a SQL Server que admita el cifrado TLS. Si la instancia de SQL Server no está configurada para exigir el cifrado TLS, se establece una conexión sin cifrado. Si la instancia de SQL Server está configurada para exigir el cifrado TLS, el controlador habilita automáticamente el cifrado TLS cuando se ejecuta en una máquina virtual Java (JVM) configurada correctamente; de lo contrario, se finaliza la conexión y el controlador genera un error.

Nota:

Asegúrese de que el valor pasado a serverName coincida exactamente con el nombre común (CN) o con el nombre DNS del nombre alternativo de sujeto (SAN) del certificado de servidor para que la conexión TLS se establezca correctamente.

Para más información sobre cómo configurar TLS para SQL Server, consulte Habilitar conexiones cifradas en el motor de base de datos.

Observaciones

Para permitir que las aplicaciones usen el cifrado TLS, Microsoft JDBC Driver para SQL Server incorpora las siguientes propiedades de conexión a partir de la versión 1.2: encrypt, trustServerCertificate, trustStore, trustStorePassword y hostNameInCertificate. Para permitir que el controlador use TDS 8.0 con cifrado TLS, el servidor de propiedades de conexiónCertificate se ha introducido a partir de la versión 11.2. Para obtener más información, vea Establecimiento de las propiedades de conexión.

En la tabla siguiente se resume cómo se comporta la versión de Microsoft JDBC Driver para SQL Server en los posibles escenarios de conexión TLS. Cada escenario usa un conjunto diferente de propiedades de conexión TLS. La tabla incluye:

  • blank: "La propiedad no existe en la cadena de conexión"
  • value: "La propiedad existe en la cadena de conexión y su valor es válido"
  • any: "No importa si la propiedad existe en la cadena de conexión o si su valor es válido"

Nota:

El mismo comportamiento se aplica para la autenticación de usuario de SQL Server y la autenticación integrada de Windows.

Configuración de propiedades Comportamiento
encrypt = false o blank
trustServerCertificate = any
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
El controlador no obligará al servidor a admitir el cifrado TLS. Si el servidor tiene un certificado autofirmado, el controlador inicia el intercambio del certificado TLS. El certificado TLS no será validado y solo se cifran las credenciales (en el paquete de inicio de sesión).

Si el servidor requiere que el cliente sea compatible con el cifrado TLS, el controlador iniciará el intercambio de certificados TLS. El certificado TLS no será validado, pero se cifrará toda la comunicación.
encrypt = true
trustServerCertificate = true
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS. Si la propiedad trustServerCertificate se establece en "true", el controlador no valida el certificado TLS.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = blank
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa la propiedad serverName especificada en la dirección URL de conexión para validar el certificado TLS de servidor y confía en las reglas de búsqueda del generador del administrador de confianza con el fin de determinar qué almacén de certificados se va a usar.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador valida el valor del asunto del certificado TLS con el valor especificado para la propiedad hostNameInCertificate.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = value
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa el valor de la propiedad trustStore para buscar el archivo trustStore del certificado y el valor de la propiedad trustStorePassword para comprobar la integridad del archivo trustStore.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = value
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa el valor de la propiedad trustStorePassword para comprobar la integridad del archivo trustStore predeterminado.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = blank
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa el valor de la propiedad trustStore para buscar la ubicación del archivo trustStore.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = value
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa el valor de la propiedad trustStorePassword para comprobar la integridad del archivo trustStore predeterminado. Además, el controlador usa el valor de la propiedad hostNameInCertificate para validar el certificado TLS.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = blank
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa el valor de la propiedad trustStore para buscar la ubicación del archivo trustStore. Además, el controlador usa el valor de la propiedad hostNameInCertificate para validar el certificado TLS.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = true
trustServerCertificate = false o blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = value
El controlador solicita el uso del cifrado TLS con el servidor.

Si el servidor requiere que el cliente sea compatible con el cifrado TLS o si admite el cifrado, el controlador iniciará el intercambio de certificados TLS.

El controlador usa el valor de la propiedad trustStore para buscar el archivo trustStore del certificado y el valor de la propiedad trustStorePassword para comprobar la integridad del archivo trustStore. Además, el controlador usa el valor de la propiedad hostNameInCertificate para validar el certificado TLS.

Si el servidor no está configurado para ser compatible con el cifrado SSL, el controlador generará un error y terminará la conexión.
encrypt = strict
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
serverCertificate = value
El controlador solicita el uso del cifrado strictTLS 8.0con el servidor.

El controlador iniciará el protocolo de enlace TLS y el intercambio de certificados con el servidor como primera acción.

La configuración trustServerCertificate se omite y se trata como false en modo strict.

El controlador usará las propiedades opcionales hostNameInCertificate o serverCertificate para validar el certificado TLS del servidor.

Si el servidor no está configurado para ser compatible con las conexiones TDS 8, el controlador generará un error y terminará la conexión.

Si la propiedad encrypt se establece en true, Microsoft JDBC Driver para SQL Server usa el proveedor de seguridad JSSE predeterminado de JVM para negociar el cifrado TLS con SQL Server. El proveedor de seguridad predeterminado puede no admitir todas las características necesarias para negociar el cifrado TLS correctamente. Por ejemplo, es posible que el proveedor de seguridad predeterminado no admita el tamaño de la clave pública RSA que se usa en el certificado TLS de SQL Server. En este caso, el proveedor de seguridad predeterminado podría generar un error que ocasionará que el controlador JDBC termine la conexión. Para resolver este problema, puede usar una de las opciones siguientes:

  • Configurar SQL Server con un certificado de servidor que tenga una clave pública RSA más pequeña
  • Configurar la JVM para usar un proveedor de seguridad JSSE diferente en el archivo de propiedades de seguridad "<java-home>/lib/security/java.security".
  • Usar una JVM distinta

Validar un certificado TLS de servidor

Durante el protocolo de enlace TLS, el servidor envía su certificado de clave pública al cliente. El controlador JDBC o el cliente tienen que validar que una entidad de certificación en la que el cliente confíe emita el certificado de servidor. El controlador requiere que el certificado de servidor cumpla las condiciones siguientes:

  • Una entidad de certificación de confianza emita el certificado.
  • El certificado debe haberse emitido para la autenticación de servidor.
  • El certificado no ha expirado.
  • El nombre común (CN) del asunto o un nombre DNS del nombre alternativo de sujeto (SAN) del certificado debe coincidir exactamente con el valor serverName especificado en la cadena de conexión o, si se ha especificado, con el valor de la propiedad hostNameInCertificate.
  • Un nombre DNS puede incluir caracteres comodín. La versión anterior 7.2, Microsoft JDBC Driver para SQL Server, no admite la coincidencia de caracteres comodín. Es decir, abc.com no coincidirá con *.com, pero *.com coincidirá *.com. Con la versión 7.2 y versiones posteriores, se admite la coincidencia de caracteres comodín de certificado estándar.

Para el uso de TDS 8.0 con strict cifrado, el valor de la propiedad serverCertificate proporciona la ruta de acceso a un certificado de servidor que se usará para la validación de certificados de servidor. Este archivo debe usar el formato de archivo PEM. El certificado recibido del servidor debe coincidir exactamente con este certificado.

Consulte también

Uso de cifrado
Protección de las aplicaciones del controlador JDBC