我正在try 使用自签名服务器证书建立TLS连接.

我使用以下示例代码生成了证书:http://golang.org/src/pkg/crypto/tls/generate_cert.go

我的相关客户端代码如下所示:

// server cert is self signed -> server_cert == ca_cert
CA_Pool := x509.NewCertPool()
severCert, err := ioutil.ReadFile("./cert.pem")
if err != nil {
    log.Fatal("Could not load server certificate!")
}
CA_Pool.AppendCertsFromPEM(severCert)

config := tls.Config{RootCAs: CA_Pool}

conn, err := tls.Dial("tcp", "127.0.0.1:8000", &config)
if err != nil {
    log.Fatalf("client: dial: %s", err)
}

以及相关的服务器代码,如下所示:

cert, err := tls.LoadX509KeyPair("./cert.pem", "./key.pem")
config := tls.Config{Certificates: []tls.Certificate{cert}}
listener, err := tls.Listen("tcp", "127.0.0.1:8000", &config)

for {
    conn, err := listener.Accept()
    if err != nil {
        log.Printf("server: accept: %s", err)
        break
    }
    log.Printf("server: accepted from %s", conn.RemoteAddr())
    go handleConnection(conn)
}

因为服务器证书是自签名的,所以对服务器和客户端CA_Pool使用相同的证书,但是这似乎不起作用,因为我总是收到以下错误:

client: dial: x509: certificate signed by unknown authority 
(possibly because of "x509: invalid signature: parent certificate
cannot sign this kind of certificate" while trying to verify 
candidate authority certificate "serial:0")

我犯了什么错误?

推荐答案

它最终与x509CreateCertificate内置的GO一起工作, 问题是I did not set the IsCA:true flag个, I only set the x509.KeyUsageCertSign可以创建自签名证书,但在验证证书链时崩溃.

Go相关问答推荐

ChromeDriver不存在(高朗selenium)

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

如何使redis池的等待超时

golang regex基于关键字拆分字符串

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

使用goroutines在Golang中验证 struct

Go time.Parse 无效的 ISO 日期

这是实现超时的常见方法,为什么 time.After 不起作用

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

你如何在 Golang 代码中测试 filepath.Abs​​ 失败?

如何使用 go-git 将特定分支推送到远程

具有两个参数的动态规划:天数和优惠券

使用自定义处理程序 nats golang 保留订阅方法

获取不带类型参数的泛型 struct 的类型名称

通过环境变量配置 OTLP 导出器

函数超时和 goroutine 泄漏

级联调用泛型函数时的泛型类型推断

如何在Golang中的差异函数中杀死命令Exec

Go 导入范围查找 protobuf 类型

行之间的模板交替设计