Owlstead 部分正确。您最好的选择是使用 OpenSSL 创建自签名证书。但是,我会使用 Go TLS 库进行加密。以下是一些可能对您有所帮助的代码。
创建 x509 密钥对
我通常按照这里的说明进行操作。命令摘要(对客户端和服务器都执行):
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
使用 Go 的 TLS 库
首先,创建一个tls.Config
. 一个 TLS 配置适用于客户端和服务器,但一些选项只需要在其中一个上设置:
cert, err := tls.LoadX509KeyPair(cert, key)
config := &tls.Config{
Certificates: []Certificates{cert},
ClientAuth: tls.RequireAnyClientCert, // Must be done on server
InsecureSkipVerify: true, // Must be done on client
}
在服务器上,您需要设置一个 TLS 侦听器。这将其设置在端口 4443 上:
listener, err := tls.Listen("tcp", ":4443", config)
for {
conn, err := listener.Accept()
acceptConn(conn) // your code
}
在客户端:
conn, err := tls.Dial("tcp", serverAddr, config)
这将创建一个加密连接,但它不会验证对方是他们所说的人。最简单的方法是为每台服务器提供另一台服务器的公钥,并将其与刚刚连接的服务器进行比较。要在另一台服务器上查找公钥,您需要:
c := conn.(*tls.Conn) // convert net.Conn from listener to tls conn
err := c.Handshake() // ensure handshake is completed without error
state := c.ConnectionState()
pubKey, err := x509.MarshalPKIXPublicKey(state.PeerCertificates[0])
bytes.Equal(pubKey, knownKey) // compare to known value