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中。

我有一个使用证书作为凭证的网站,当我使用curl发起请求时成功了…

curl --cert cert.pem --key key.pem --url 'https://test' -v

但我的Go程序一直失败,提示凭证错误…

那个curl调用中的CA证书在哪里?它是嵌入在cert.pem文件里的吗?如果是,请把它分离出来,单独存为一个文件供Go程序使用。

在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-----
回到顶部