我正在创建一个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中设置了许多证书,但这确实使我感到困惑。
openssl s_client -CApath /etc/ssl/certs/ -connect localhost:5555
verify error:num=20:unable to get local issuer certificate
该RootCAs字段用于客户端验证服务器证书。我假设您只想提供一个证书进行验证,因此您需要的任何内容都应加载到Certificates切片中。
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