Linux和macOS上的go-mssqldb

go-mssqldb 驱动是纯粹的 Go 库,能够在 Linux 和 macOS 上原生编译,无需外部 C 依赖。 本文介绍了针对认证和证书的平台特定配置。

Installation

所有平台的安装方式相同:

go get github.com/microsoft/go-mssqldb

无需 ODBC 驱动、FreeTDS 或其他 C 库。

SQL 身份验证

SQL 认证在 Linux、macOS 和 Windows 上工作方式相同:

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

NTLM 身份验证

NTLM认证支持所有平台。 提供一个符合域名的用户名:

URL 格式

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

sqlserver://CONTOSO%5C<user>:<password>@<server>:1433?database=mydb

ADO格式

用户名中的反斜杠会触发 NTLM 的身份验证:

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

驱动程序检测到用户名中的反斜杠,自动使用NTLM。 Linux 或 macOS 上无需额外配置。

Kerberos 身份验证

Linux和macOS上的Kerberos认证使用 krb5 驱动内置的包。 没有外部库依赖。

先决条件

  1. 一个有效的Kerberos配置文件。 默认路径为 /etc/krb5.conf

    [libdefaults]
        default_realm = MYDOMAIN.COM
        dns_lookup_kdc = true
    
    [realms]
        MYDOMAIN.COM = {
            kdc = dc1.mydomain.com
        }
    
  2. SQL Server实例必须注册服务主体名称(SPN)(例如,MSSQLSvc/<server>.mydomain.com:1433)。

用键盘连接

在连接字符串中指定 keytab 文件路径和 Kerberos 域:

sqlserver://<user>@MYDOMAIN.COM@<server>:1433?database=AdventureWorks2025&krb5-realm=MYDOMAIN.COM&krb5-keytabfile=/etc/<user>.keytab

连接到凭证缓存

首先,获取一张票:

kinit <user>@MYDOMAIN.COM

然后通过缓存的凭据连接:

sqlserver://<user>@MYDOMAIN.COM@<server>:1433?database=AdventureWorks2025&krb5-realm=MYDOMAIN.COM&krb5-credcachefile=/tmp/krb5cc_1000

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 前的最大 UDP 消息大小。

更多信息请参见SQL Server和Windows 身份验证

Windows 身份验证(SSPI)不可用

在 Linux 和 macOS 上,Windows 集成认证(SSPI / trusted_connection=yes)不可用。 请使用以下选项之一:

方法 连接字符串
NTLM sqlserver://DOMAIN%5Cuser:password@host?database=db
Kerberos(keytab) sqlserver://user@REALM@host?database=db&krb5-realm=REALM&krb5-keytabfile=/path
Kerberos(缓存) sqlserver://user@REALM@host?database=db&krb5-realm=REALM&krb5-credcachefile=/path
SQL 身份验证 sqlserver://user:password@host?database=db
Microsoft Entra ID sqlserver://host?database=db&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false(使用 azuresql 驱动程序)

证书配置

在 Linux 和 macOS 上,带 certificate or serverCertificate 参数的 TLS 证书必须是 PEM 编码的文件。 驱动程序通过直接使用 Go 的 crypto/tls 软件包读取它们。

系统信任存储区

驱动程序使用操作系统默认的证书信任存储。 在 Linux 上,这个信任存储通常位于 /etc/ssl/certs//etc/pki/tls/certs/。 在 macOS 上,使用的是系统钥匙串。

要向系统存储添加自定义CA证书:

Ubuntu/Debian:

sudo cp myca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

RHEL/Fedora:

sudo cp myca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

macOS:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain myca.crt

或者,使用 certificate 连接参数直接指定CA证书,而无需修改系统存储:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&certificate=/path/to/ca-cert.pem