SQL Server 2008 R2 Express + 通配符 SSL 证书

Nic*_*cki 5 ssl-certificate sql-server-2008

通配符证书(例如 *.example.com)在 SQL Server 2008 或更低版本中根本不起作用。但是加密连接到MSDN上的 SQL Server声明,就像白天一样,

SQL Server 2008 R2 支持通配符证书。

优秀。所以我在一台机器上设置了 SQL Server 2008 R2 Express,并配置了HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Certificate我的通配符 SSL 证书指纹的条目(因为在处理 SQL Server 的五年里,我从来没有在 Sql Server 中遇到过 #$@# 对话框配置以显示任何证书)。

然后 SQL Server 日志告诉我这一切都很好:

2010-08-31 11:46:04.04 服务器证书 [Cert Hash(sha1) "5DDD9E51B30E0CA6CE3656AE54EC6D0B8B75904A"] 已成功加载以进行加密。

不幸的是,如果我尝试使用 Microsoft SQL Server Management Studio(2008 R2 版本)或 .NET Framework 4.0 中提供的 Sql* 类,我总是收到以下异常:

已成功与服务器建立连接,但在登录前握手期间发生错误。(提供者:SSL 提供者,错误:0 - 证书的 CN 名称与传递的值不匹配。)(Microsoft SQL Server,错误:-2146762481)

以下是我尝试过的事情:

  • 确保主机名配置正确。(例如,主机名是prod,并且正确设置了 DNS 后缀:prod.example.com。)
  • 确保prod.example.com正确设置了PTR 记录。
  • TrustServerCertificate=Yes连接字符串中的设置。

有趣的是,如果我尝试通过 连接sqlcmd.exe,我不会收到有关证书的投诉。

我开始怀疑 SQL 服务器中的通配符证书将被服务器加载,但是没有可以正确运行的.NET SQL 客户端实例。

任何人都可以对此有所了解吗?


更新:有关通配符证书的一些附加信息:

  • 是的,它安装在本地计算机 > 个人 > 证书中。
  • 它具有Server Authentication (1.3.6.1.5.5.7.3.1)增强的密钥用法。
  • 它有Key Encipherment (a0)哪里(a0)手段AT_KEYEXCHANGE。(它适用于 FTP 服务器和 IIS 网站,所以如果这被搞砸了,我想它不会在那里工作。)
  • 证书的主题是CN = *.example.com(用“示例”代替我们的工作域)。也就是说,它被发布到*.example.com. 这是 2008 R2 之前版本中阻止 SQL Server 加载证书的交易破坏者。
  • 它有私钥。
  • 友好名称可以设置为任何东西——prod.example.com就是它现在的样子。

更新 2:所以这真的会炸你的大脑:

如果我通过 ODBC 建立连接:

Microsoft SQL Server 本机客户端版本 10.50.1600

Data Source Name: prod.example.com
Data Source Description: prod
Server: tcp:prod.example.com,8484\SQLEXPRESS
Use Integrated Security: No
Database: (Default)
Language: (Default)
Data Encryption: Yes
Trust Server Certificate: No
Multiple Active Result Sets(MARS): No
Translate Character Data: Yes
Log Long Running Queries: No
Log Driver Statistics: No
Use Regional Settings: No
Use ANSI Quoted Identifiers: Yes
Use ANSI Null, Paddings and Warnings: Yes
Run Code Online (Sandbox Code Playgroud)

然后我得到一个成功的结果:

Microsoft SQL Server Native Client Version 10.50.1600

Running connectivity tests...

Attempting connection
Connection established
Verifying option settings
INFO: Connection was encrypted with server certificate validation.
Disconnecting from server

TESTS COMPLETED SUCCESSFULLY!
Run Code Online (Sandbox Code Playgroud)

更新 3:好的,在我放弃通配符证书之前,最后一次尝试。这是我用 C# 编写的一个小示例程序:

    static void Main(string[] args)
    {
        Console.WriteLine(new string('-', 40));

        try
        {
            var connectionString = 
                @"Data Source=tcp:prod.example.com,8484\SQLEXPRESS; " +
                "User ID=ExampleDev;Password=ExamplePass; " +
                "Encrypt=True";

            Console.WriteLine("Trying SqlConnection...");

            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();

                Console.WriteLine("SUCCESS!");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("FAILED!");
            Console.WriteLine(e);
        }

        Console.WriteLine(new string('-', 40));

        try
        {
            var connectionString = 
                @"Driver={SQL Server Native Client 10.0}; " +
                "Server=tcp:prod.example.com,8484\SQLEXPRESS; " +
                "Uid=ExampleDev; Pwd=ExamplePass; Encrypt=yes";

            Console.WriteLine("Trying OdbcConnection...");

            using (var connection = new OdbcConnection(connectionString))
            {
                connection.Open();

                Console.WriteLine("SUCCESS!");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("FAILED!");
            Console.WriteLine(e);
        }

        Console.WriteLine(new string('-', 40));
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个程序的输出,在适当地替换用户名和密码后,在我的机器上运行,如下所示:

---------------------------
尝试 SqlConnection...
失败的!
System.Data.SqlClient.SqlException (0x80131904): 连接成功 e
与服务器建立,但在预登录时发生错误
摇。(提供者:SSL 提供者,错误:0 - 证书的 CN 名称不匹配
tch 传递的值。)
   在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常
, 布尔 breakConnection)
   在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   在 System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(布尔加密,
Boolean trustServerCert, Boolean& marsCapable)
   在 System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternal
ConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Bool
ean encrypt, Boolean trustServerCert, BooleanintegratedSecurity)
   >
---------------------------
正在尝试 OdbcConnection...
成功!
---------------------------

这就是我喝酒的原因。

我知道“选择通常不会坏”,但我不知道该怎么做。SqlClient在验证通配符证书时,似乎.NET Framework 4.0 中的类刚刚被破坏。这两种方法之间还有什么不同?

mrd*_*nny 3

证书没有显示在配置工具中这一事实提出了第一个问题。如果证书安装正确,那么它应该显示在该列表中。您将证书放置在证书存储中的哪个位置?它应该位于本地计算机的证书存储中的“个人”>“证书”下。

您还需要确保服务器身份验证证书具有证书的增强型密钥用法属性以指定服务器身份验证 (1.3.6.1.5.5.7.3.1)。还必须使用 AT_KEYEXCHANGE 的 KeySpec 选项创建证书,您可以选择设置密钥使用属性以包括密钥加密。