You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用X.509证书通过ODBC 18驱动认证连接SQL Server 2022?

SQL Server 2022 客户端证书认证问题解析

核心结论

SQL Server 2022不支持通过X.509客户端证书直接完成登录认证,ODBC Driver 18中的ClientCertificate和ClientKey选项并非用于SQL Server的登录授权,二者属于完全独立的流程。

ODBC驱动客户端证书选项的真实用途

这两个选项仅作用于TLS握手阶段:当网络层(如防火墙、代理服务器)要求客户端提供TLS证书才能建立到SQL Server所在主机的连接时,用于向网络设备证明客户端身份。SQL Server本身不会将该TLS证书映射到数据库登录账户,也不会以此作为登录认证的依据。

测试失败原因分析

你在SQL Server中创建证书并映射登录名的操作,属于服务器端证书的典型用法(比如用于加密数据、签名存储过程),和客户端TLS证书没有关联。测试时出现的错误:

错误: ERROR [28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server] 用户 '' 登录失败。

本质是SQL Server完成TLS握手后,无法找到与客户端证书对应的登录账户,因此拒绝登录请求。

支持客户端证书的场景

ODBC驱动的这两个选项仅适用于以下场景:

  • 网络架构(如企业防火墙、反向代理)强制要求客户端提供TLS证书才能访问SQL Server所在服务器
  • SQL Server部署在需要客户端TLS证书的环境中,但证书仅用于网络层验证,不参与SQL Server的登录授权流程

替代方案

如果需要基于证书的身份认证,SQL Server支持的合法方案为:

  • Azure AD证书认证:仅适用于Azure SQL Database或已加入Azure AD的SQL Server实例
  • 结合TLS加密使用传统认证方式:SQL登录、Windows集成认证等,通过TLS保障连接传输安全

你的测试步骤

1. 服务器端创建证书并映射登录名

USE MASTER;

-- 创建证书
CREATE CERTIFICATE coolCert
ENCRYPTION BY PASSWORD = ''
WITH SUBJECT = 'coolLogin',
EXPIRY_DATE = '12/31/2026';

-- 基于证书创建登录名
CREATE LOGIN coolLogin FROM CERTIFICATE coolCert;

GO

-- 将证书备份为PFX文件
BACKUP CERTIFICATE coolCert TO FILE = 'c:\certs\coolCert.pfx'   
    WITH FORMAT = 'PFX', PRIVATE KEY ( 
    ENCRYPTION BY PASSWORD = '',
    DECRYPTION BY PASSWORD = '',
    ALGORITHM = 'AES_256');  
GO  

2. 客户端C#测试代码

string connectionString = "" +
    "Driver={ODBC Driver 18 for SQL Server};" +
    "Server=SomeCoolServer;" +
    "Database=master;" +
    "TrustServerCertificate=yes;" + // 尝试过yes和no两种设置
    "Encrypt=yes;" +
    "ClientCertificate=file:C:\\certs\\coolCert.pfx,password:thePassword;" +
    "ClientKey=file:C:\\certs\\sqlcert.key;";

using (OdbcConnection connection = new OdbcConnection(connectionString))
{
    try
    {
        connection.Open();
        Console.WriteLine("连接成功!");

        string query = "select SUSER_SNAME()";
        OdbcCommand command = new OdbcCommand(query, connection);

        using (OdbcDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine(reader[0].ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("错误: " + ex.Message);
    }
}

内容的提问来源于stack exchange,提问作者Brandon M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:04:55