本主题中的示例描述如何使用连接字符串属性允许应用程序在 Java 应用程序中使用安全套接字层 (SSL) 加密。有关这些新的连接字符串属性(如 encrypttrustServerCertificatetrustStoretrustStorePasswordhostNameInCertificate)的详细信息,请参阅设置连接属性

encrypt 属性设置为 truetrustServerCertificate 属性设置为 true 时,Microsoft JDBC Driver for SQL Server 将不验证 SQL Server SSL 证书。这一点对于允许在测试环境中建立连接通常是必需的,如 SQL Server 实例只具有自签名证书的情况。

下面的代码示例演示如何在连接字符串中设置 trustServerCertificate 属性:

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

encrypt 属性设置为 truetrustServerCertificate 属性设置为 false 时,Microsoft JDBC Driver for SQL Server 将验证 SQL Server SSL 证书。验证服务器证书是 SSL 握手过程的一部分,这可确保服务器是要连接到的正确服务器。为了验证服务器证书,在连接时必须提供信任材料,既可以使用 trustStoretrustStorePassword 连接属性显式提供材料,也可以使用基础 Java 虚拟机 (JVM) 的默认信任存储区隐式提供材料。

trustStore 属性指定指向证书 trustStore 文件的路径(包括文件名),该文件中包含客户端信任的证书的列表。trustStorePassword 属性指定用来检查 trustStore 数据完整性的密码。有关使用 JVM 的默认信任存储区的详细信息,请参阅为 SSL 加密配置客户端

下面的代码示例演示如何在连接字符串中设置 trustStoretrustStorePassword 属性:

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

JDBC Driver 提供了一个附加属性 hostNameInCertificate,该属性指定服务器的主机名。此属性的值必须与证书的 subject 属性一致。

下面的代码示例演示如何在连接字符串中使用 hostNameInCertificate 属性:

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

或者,您可以使用由 SQLServerDataSource 类提供的适当的 setter 方法来设置连接属性的值。

encrypt 属性设置为 truetrustServerCertificate 属性设置为 false 的情况下,如果连接字符串中的服务器名称与 SQL Server SSL 证书中的服务器名称不符,则将出现以下错误: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“java.security.cert.CertificateException: 在安全套接字层(SSL)初始化过程中验证证书中的服务器名称失败。”

请参阅