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库兼容性良好。

