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
。有关完整输出,请参阅 here。我似乎对中间证书做错了什么,但我不知道是什么。我已经为此工作了几天,进行了大量的谷歌搜索和 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
开始逐步完成服务器设置可能仍然有用。
我正在创建一个 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 中设置了很多证书,但这真的让我很困惑。
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
开始逐步完成服务器设置可能仍然有用。