以下代碼摘自網上,設定一個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出來。
檢視CA的數字證書,可以看到CA為自簽發的,簽發者和使用者是同一人,此外在數字簽名檔案中可以看到CA的公鑰資訊,使用該公鑰後續可以驗證CA簽發的檔案的正确性
再看下server端的數字證書,該數字證書經過charlie1.com的CA簽發,可以看到簽發者和使用者不一樣。該證書中包含了server的公鑰,用來後續與client端tls協商使用
以上資訊也可以在windows的證書中檢視:
本次生成的密鑰和代碼參見:https://files.cnblogs.com/files/charlieroro/%E5%8F%8C%E5%90%91%E8%AE%A4%E8%AF%81%E4%BB%A3%E7%A0%81%E5%92%8C%E8%AF%81%E4%B9%A6.rar
參考:https://studygolang.com/articles/4461