簡體   English   中英

Golang SSL TCP套接字證書配置

[英]Golang SSL TCP socket certificate configuration

我正在創建一個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 請參閱此處獲取完整輸出 我似乎對中間證書做錯了,但我不知道是什么。 我已經在這方面工作了幾天,大量的谷歌搜索和SO'ing,但似乎沒有什么比我的情況更合適。 我已經在Apache和HAProxy中設置了許多證書,但這確實令我難過。

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開始http.ListenAndServeTLS服務器設置仍然很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM