为了账号安全,请及时绑定邮箱和手机立即绑定

Golang SSL TCP socket证书配置

Golang SSL TCP socket证书配置

Go
忽然笑 2021-09-20 11:00:18
我正在创建一个 Go TCP 服务器(不是 http/s)并且我正在尝试将其配置为使用 SSL。我有一个 StartCom 免费 SSL 证书,我正试图用它来实现这一点。我的服务器代码如下所示:    cert, err := tls.LoadX509KeyPair("example.com.pem", "example.com.key")    if err != nil {        fmt.Println("Error loading certificate. ",err)    }    trustCert, err := ioutil.ReadFile("sub.class1.server.ca.pem")    if err != nil {        fmt.Println("Error loading trust certificate. ",err)    }    validationCert, err := ioutil.ReadFile("ca.pem")    if err != nil {        fmt.Println("Error loading validation certificate. ",err)    }    certs := x509.NewCertPool()    if !certs.AppendCertsFromPEM(validationCert) {        fmt.Println("Error installing validation certificate.")    }    if !certs.AppendCertsFromPEM(trustCert) {        fmt.Println("Error installing trust certificate.")    }    sslConfig := tls.Config{RootCAs: certs,Certificates: []tls.Certificate{cert}}    service := ":5555"    tcpAddr, error := net.ResolveTCPAddr("tcp", service)    if error != nil {        fmt.Println("Error: Could not resolve address")    } else {        netListen, error := tls.Listen(tcpAddr.Network(), tcpAddr.String(), &sslConfig)        if error != nil {            fmt.Println(error)        } else {            defer netListen.Close()            for {                fmt.Println("Waiting for clients")                connection, error := netListen.Accept()我试过切换证书的顺序,不包括一些证书等,但输出openssl s_client -CApath /etc/ssl/certs/ -connect localhost:5555基本上保持不变,verify error:num=20:unable to get local issuer certificate. 有关完整输出,请参见此处。我似乎对中间证书做错了什么,但我不知道是什么。我已经为此工作了几天,进行了大量的谷歌搜索和搜索,但似乎没有什么适合我的情况。我已经在 Apache 和 HAProxy 中设置了许多证书,但这确实让我感到困惑。
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

该RootCAs字段用于客户端验证服务器证书。我假设您只想提供一个证书进行验证,因此您需要的任何内容都应该加载到Certificates切片中。


这是一个最小的例子:


cert, err := tls.LoadX509KeyPair("example.com.pem", "example.com.key")

if err != nil {

    log.Fatal("Error loading certificate. ", err)

}


tlsCfg := &tls.Config{Certificates: []tls.Certificate{cert}}


listener, err := tls.Listen("tcp4", "127.0.0.1:5555", tlsCfg)

if err != nil {

    log.Fatal(err)

}

defer listener.Close()


for {

    log.Println("Waiting for clients")

    conn, err := listener.Accept()

    if err != nil {

        log.Fatal(err)

    }

    go handle(conn)

}

即使您没有使用 HTTPS,从http.ListenAndServeTLS.


查看完整回答
反对 回复 2021-09-20
  • 1 回答
  • 0 关注
  • 423 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信