天天看點

使用openssl演練數字簽名

以下代碼摘自網上,設定一個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