Golang中有没有好用的NTLM认证包?

Golang中有没有好用的NTLM认证包? 有没有好的NTLM认证包推荐?类似下面这种:

Transport: &http.Transport{
    Dial: func(network, addr string) (net.Conn, error) {
        return (&ntlm.Client{
            Domain:      "example.com",
            Workstation: "go-ntlm-example",
            Username:    "user",
            Password:    "pass",
        }).Dial(network, addr)
    },
    TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},

更多关于Golang中有没有好用的NTLM认证包?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中有没有好用的NTLM认证包?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,推荐使用 github.com/Azure/go-ntlmssp 包来实现NTLM认证。这个包提供了完整的NTLMv2支持,并且与标准库的 http.Client 集成良好。

以下是使用示例:

package main

import (
    "crypto/tls"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    
    "github.com/Azure/go-ntlmssp"
)

func main() {
    // 创建NTLM认证的Transport
    client := &http.Client{
        Transport: ntlmssp.Negotiator{
            RoundTripper: &http.Transport{
                TLSClientConfig: &tls.Config{
                    InsecureSkipVerify: true,
                },
            },
        },
    }
    
    // 设置代理(如果需要通过代理进行NTLM认证)
    proxyURL, _ := url.Parse("http://proxy.example.com:8080")
    client.Transport = ntlmssp.Negotiator{
        RoundTripper: &http.Transport{
            Proxy: http.ProxyURL(proxyURL),
            TLSClientConfig: &tls.Config{
                InsecureSkipVerify: true,
            },
        },
    }
    
    // 创建带有认证信息的请求
    req, _ := http.NewRequest("GET", "http://target.example.com/api", nil)
    req.SetBasicAuth("domain\\username", "password")
    
    // 发送请求
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("请求失败: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Printf("响应状态: %d\n", resp.StatusCode)
    fmt.Printf("响应内容: %s\n", string(body))
}

对于更底层的NTLM连接,可以使用以下方式:

package main

import (
    "crypto/tls"
    "fmt"
    "net/http"
    
    "github.com/Azure/go-ntlmssp"
)

func main() {
    // 创建自定义的Transport
    transport := &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    }
    
    // 包装Transport以支持NTLM认证
    ntlmTransport := ntlmssp.Negotiator{
        RoundTripper: transport,
    }
    
    client := &http.Client{
        Transport: ntlmTransport,
    }
    
    // 使用Basic Auth,NTLM会自动处理认证协商
    req, _ := http.NewRequest("GET", "https://ntlm-protected-site.com/data", nil)
    req.SetBasicAuth("DOMAIN\\User", "Password")
    
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("错误: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    fmt.Printf("状态码: %d\n", resp.StatusCode)
}

如果需要直接处理NTLM握手,可以使用底层API:

package main

import (
    "fmt"
    "net"
    
    "github.com/Azure/go-ntlmssp"
)

func main() {
    // 创建NTLM客户端
    client := ntlmssp.NewClient(ntlmssp.SetUserInfo("DOMAIN\\User", "Password"))
    
    // 建立连接并进行NTLM认证
    conn, err := net.Dial("tcp", "server.example.com:80")
    if err != nil {
        fmt.Printf("连接失败: %v\n", err)
        return
    }
    defer conn.Close()
    
    // 执行NTLM握手
    authenticatedConn, err := client.Authenticate(conn, "server.example.com")
    if err != nil {
        fmt.Printf("认证失败: %v\n", err)
        return
    }
    
    // 使用认证后的连接进行通信
    // authenticatedConn 现在是一个经过NTLM认证的net.Conn
    fmt.Printf("认证成功,连接已建立\n")
}

github.com/Azure/go-ntlmssp 包支持完整的NTLMv2协议,包括消息签名和加密,并且与Go的标准HTTP库兼容性良好。

回到顶部