以下代码摘自网上,设置一个server和client,client代码如下:
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
resp, err := http.Get("https://localhost:8081")
if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
server代码如下:
package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
pool := x509.NewCertPool()
caCertPath := "ca.crt"
caCrt, err := ioutil.ReadFile(caCertPath)
if err != nil {
fmt.Println("ReadFile err:", err)
return
}
pool.AppendCertsFromPEM(caCrt)
tr := &http.Transport{
TLSClientConfig: &tls.Config{RootCAs: pool},
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://localhost:8081")
if err != nil {
fmt.Println("Get error:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
生成密钥和数字签名方式如下:
openssl genrsa -out ca.key 2048 #生成CA私钥
openssl req -x509 -new -nodes -key ca.key -subj "/CN=charlie.com" -days 5000 -out ca.crt #使用CA私钥生成CA公钥
openssl genrsa -out server.key 2048 #生成server端私钥
openssl req -new -key server.key -subj "/CN=charlie.com" -out server.csr #生成签名请求
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000 #生成CA签名的server端数字签名
注意:-subj subj选项表示证书拥有者的信息值,取代证书请求文件中的申请者的信息值。/cn必须是服务端的域名,使用IP可能会报如下错误,可以使用修改/etc/hosts的方式做域名映射
如谷歌的subj内容为:
server执行如下:
client执行如下:
可以使用如下方式验证证书有效性:
1.openssl s_server -msg -verify -tls1_2 -state -cert cert.cer -key ..\privkey -accept 18444
使用上面的命令开启一个ssl测试服务器
2.openssl s_client -msg -verify -tls1_2 -state -showcerts -cert cert.cer -key ..\privkey -connect localhost:18444
使用这个命令连接ssl测试服务器,如果连接成功会打印出证书和私钥的信息,然后输入任何字符都会在服务器端echo出来。
再看下server端的数字证书,该数字证书经过charlie1.com的CA签发,可以看到签发者和使用者不一样。该证书中包含了server的公钥,用来后续与client端tls协商使用
来源:oschina
链接:https://my.oschina.net/u/4408350/blog/4244751