【问题标题】:Golang SSL TCP socket certificate configurationGolang SSL TCP 套接字证书配置
【发布时间】:2015-05-08 01:18:15
【问题描述】:

我正在创建一个 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。有关完整输出,请参阅here。我似乎对中间证书做错了什么,但我不知道是什么。我已经为此工作了几天,进行了大量的谷歌搜索和 SO'ing,但似乎没有什么适合我的情况。我在 Apache 和 HAProxy 中设置了很多证书,但这真的让我很难过。

【问题讨论】:

  • 不要使用error 作为错误值,因为这会掩盖内置接口名称。
  • 谢谢,我会改正的!

标签: ssl tcp go


【解决方案1】:

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 开始逐步完成服务器设置可能仍然有用。

【讨论】:

  • 那么中间证书是否应该添加到example.com.pem文件中?所以它加载了主证书?
  • @kkhugs:我没有需要中间人方便的证书,但我相当肯定你应该将它们链接到你的example.com.pem,就像你在 nginx 中一样(文档说Certificates contains one or more certificate chains).
  • 谢谢,将中间体添加到证书文件中并按照建议使用效果很好!
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 2021-01-19
  • 2013-04-15
  • 1970-01-01
  • 2014-08-30
  • 2015-07-04
  • 1970-01-01
  • 2017-05-08
相关资源
最近更新 更多