该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 id 和 password 参数:
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。 |