使用 go-mssqldb 的 SQL Server 和 Windows 身份验证

go-mssqldb驱动程序支持 SQL Server 认证、Windows 集成认证(SSPI)、NTLM 和 Kerberos。 本文介绍了每种方法,附有连接字符串示例和代码示例。

关于 Microsoft Entra ID 认证,请参见 Microsoft Entra ID 认证

选择身份验证方法

使用最适合你环境和身份平台的最强方法:

我更喜欢这个顺序 方法 在以下情况下使用
1 Microsoft Entra ID 你连接的是 Azure SQL,可以使用管理身份、工作负载身份或其他 Entra 流程,无需存储密码。
2 Windows集成认证(SSPI) 你的应用运行在Windows上,可以直接使用当前的Windows身份。
3 Kerberos 你使用的是 Linux 或 macOS,并且已经拥有 Kerberos 票证、密钥表或受管域环境。
4 NTLM 你需要域名认证,但Kerberos既不可用也不实用。
5 SQL Server 身份验证 你没有集成身份选项,必须使用SQL登录和密码。

如果多种方法有效,建议选择避免长期秘密且与主机平台原生身份系统匹配的。

SQL Server 身份验证

SQL Server 认证使用存储在 SQL Server 中的登录名和密码。 提供 user idpassword 参数:

URL 格式

注释

对于 URL 连接字符串,请对用户名或密码中的特殊字符进行百分号编码。 Windows 身份验证用户名使用%5C作为域分隔符,例如sqlserver://DOMAIN%5Cusername:password@host。 在 ADO 和 ODBC 连接字符串中,使用字面形式 DOMAIN\username

请在URL中指定用户名和密码:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true

ADO格式

在 ADO 风格的 连接字符串 中使用 user id and password 键:

server=<server>;user id=<user>;password=<password>;database=AdventureWorks2025;Encrypt=true

代码示例

连接SQL Server认证并验证连接:

package main

import (
    "database/sql"
    "log"

    _ "github.com/microsoft/go-mssqldb"
)

func main() {
    db, err := sql.Open("sqlserver",
        "sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    if err = db.Ping(); err != nil {
        log.Fatal(err)
    }
}

Windows集成认证(SSPI)

在 Windows 上,驱动使用 SSPI(安全支持提供者接口)通过当前 Windows 用户的凭证进行认证。 连接字符串不需要用户名或密码。

sqlserver://<server>?database=AdventureWorks2025&trusted_connection=yes&encrypt=true

注释

Windows通过SSPI集成认证仅在Go应用在Windows上运行且当前用户能够访问SQL Server实例时才有效。

NTLM 身份验证

NTLM认证可在所有平台(Windows、Linux和macOS)上运行。 提供一个符合域名的用户名和密码:

NTLM URL 格式

DOMAIN\<user> 中的反斜杠进行 URL 编码为 %5C

sqlserver://DOMAIN%5C<user>:<password>@<server>?database=AdventureWorks2025&encrypt=true

注释

在 URL 格式中,你必须将反斜线编码为 DOMAIN\<user>%5C

NTLM ADO格式

用户名中的反斜线向驱动程序传递NTLM认证信号:

server=<server>;user id=DOMAIN\<user>;password=<password>;database=AdventureWorks2025;Encrypt=true

驱动程序检测到用户名中的反斜杠,自动使用NTLM。

Kerberos 身份验证

当系统拥有有效的Kerberos配置时,Kerberos认证在Linux和macOS上是有效的。 驱动程序使用该 krb5 软件包进行Kerberos认证。 提供资质证明有三种方法。

先决条件

  • 一个有效 krb5.conf 文件(默认路径: /etc/krb5.conf)。
  • SQL Server必须注册服务主体名称(SPN)。

方法1:Keytab 文件

一个密钥标签文件包含加密的Kerberos主密钥。 指定键标签文件路径和用户的领域:

sqlserver://<user>@MYREALM@<server>:1433?database=AdventureWorks2025&krb5-realm=MYREALM&krb5-keytabfile=/path/to/user.keytab&encrypt=true

方法二:凭据缓存

使用由 kinit. 创建的现有 Kerberos 凭证缓存。

sqlserver://<user>@MYREALM@<server>:1433?database=AdventureWorks2025&krb5-realm=MYREALM&krb5-credcachefile=/tmp/krb5cc_1000&encrypt=true

方法三:原始资历

直接在连接字符串里输入密码。 驱动程序使用所提供的凭证完成 Kerberos 身份验证交换过程。

sqlserver://<user>@MYREALM:<password>@<server>:1433?database=AdventureWorks2025&krb5-realm=MYREALM&encrypt=true

Kerberos 参数

参数 违约 Description
krb5-configfile /etc/krb5.conf 通往Kerberos配置文件的路径。
krb5-realm - Kerberos 域名,例如 MYDOMAIN.COM
krb5-keytabfile - keytab 文件的路径。
krb5-credcachefile - 通往凭据缓存文件的路径。
krb5-dnslookupkdc true 使用 DNS SRV 记录来定位 KDC。
krb5-udppreferencelimit 1 切换到 TCP 前的最大消息大小。
ServerSPN - 覆盖自动生成的SPN。