Golang中Curl与证书认证时遇到的问题
Golang中Curl与证书认证时遇到的问题 我有一个使用证书作为凭证的网站,当我使用curl发起请求时能够成功…
curl --cert cert.pem --key key.pem --url 'https://test' -v
但我的Go程序一直失败,提示凭证错误…
不确定还需要做什么才能让它成功。尝试了以下代码,但没有成功。
package main
import (
"crypto/tls"
"crypto/x509"
"flag"
"io/ioutil"
"log"
"net/http"
)
非常感谢任何帮助。
更多关于Golang中Curl与证书认证时遇到的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
谢谢,是的,它正在从我的 Mac 电脑的 /etc/ssl/cert.pem 读取。让我试试。
更多关于Golang中Curl与证书认证时遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
错误信息:401 - 未经授权:由于凭据无效,访问被拒绝。
Curl命令可以正常工作并获取请求的数据,没有任何问题。问题仅出现在Golang中。
在Go中实现证书认证需要正确配置tls.Config。以下是修复后的示例代码:
package main
import (
"crypto/tls"
"crypto/x509"
"flag"
"io/ioutil"
"log"
"net/http"
)
func main() {
certFile := flag.String("cert", "cert.pem", "客户端证书文件")
keyFile := flag.String("key", "key.pem", "客户端私钥文件")
url := flag.String("url", "https://test", "请求URL")
flag.Parse()
// 加载客户端证书和私钥
cert, err := tls.LoadX509KeyPair(*certFile, *keyFile)
if err != nil {
log.Fatal("加载证书失败:", err)
}
// 创建自定义的TLS配置
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
// 如果需要验证服务器证书,添加根证书
// RootCAs: loadRootCA("ca.pem"),
// 如果服务器使用自签名证书,跳过验证
// InsecureSkipVerify: true,
}
// 创建HTTP客户端
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: tlsConfig,
},
}
// 发起请求
resp, err := client.Get(*url)
if err != nil {
log.Fatal("请求失败:", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("读取响应失败:", err)
}
log.Printf("响应状态: %d", resp.StatusCode)
log.Printf("响应内容: %s", body)
}
// 如果需要加载根证书
func loadRootCA(caFile string) *x509.CertPool {
caCert, err := ioutil.ReadFile(caFile)
if err != nil {
log.Fatal("读取CA证书失败:", err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
return caCertPool
}
如果服务器使用自签名证书,需要启用InsecureSkipVerify:
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
InsecureSkipVerify: true,
}
如果服务器需要双向TLS认证,且提供CA证书:
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: loadRootCA("ca.pem"),
}
确保证书文件格式正确。PEM格式的证书文件应包含:
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
私钥文件应包含:
-----BEGIN PRIVATE KEY-----
私钥内容
-----END PRIVATE KEY-----


