Go 編程: 快速生成自簽名證書與雙向認證(mTLS)

原文鏈接: https://www.gitdig.com/genera...

自簽名證書雙向認證大量用於各類網絡集羣項目中,例如 Kubernetes. 要實現服務間的證書雙向驗證,當然前提是要了解證書雙向驗證原理。相關原理介紹的文章,網上很多這裏就不詳細說明了。簡單貼張圖,自行理解。

圖片描述

1. 快速生成自簽名證書

生成自簽名證書傳統工具是OpenSSL。不過OpenSSL不論是其複雜的命令選項,還是更加複雜配置都會讓人頭皮發麻。這裏介紹一個更簡單的生成自簽名證書的工具: certstrap, 項目地址:square/certstrap.具體安裝請參考其文檔。

1.1 CA證書

要進行證書自簽名,首先是生成一個自信任的CA認證證書。

$: certstrap init --common-name "ExampleCA" --expires "20 years"

命令完成後,會在當前目錄下創建一個新的out目錄,生成的證書都在該目錄下.

$: tree out
out
├── ExampleCA.crl
├── ExampleCA.crt
└── ExampleCA.key

1.2 服務端證書

首先創建CSR, 即證書籤名請求。

$: certstrap request-cert -cn server -ip 127.0.0.1 -domain "*.example.com"
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Created out/server.key
Created out/server.csr

生成CSR之後,通過剛剛生成的CA證書進行簽名.

$: certstrap sign server --CA ExampleCA
Enter passphrase for CA key (empty for no passphrase):
Created out/server.crt from out/server.csr signed by out/ExampleCA.key

這樣就完成了服務端證書的簽名,簽名後的證書就是:out/server.crt.

1.3 客戶端證書

企業內部集羣,通常爲了保證服務之間的安全行,對客戶端請求需要進行雙向驗證。這個時候就需要客戶端也提供證書。

客戶端證書的生成過程同服務端類似,更簡單一點,不需要提供證書的IP與域名信息。

$: certstrap request-cert -cn client
$: certstrap sign client --CA ca

1.4 查看證書

生成完的證書是否正確,可以通過certigo工具進行查詢。項目地址: square/certigo

安裝完成後,通過以下命令查詢證書的具體信息。

$: certigo dump out/server.crt
** CERTIFICATE 1 **
Valid: 2019-08-26 09:34 UTC to 2021-08-26 09:34 UTC
Subject:
    CN=server
Issuer:
    CN=ExampleCA
DNS Names:
    *.example.com
IP Addresses:
    127.0.0.1

1.5 PKCS 格式證書

生成PKCS格式的證書可以直接點擊安裝到系統證書簇中,方便一些應用(瀏覽器等)的使用。具體生成PKCS 格式證書,使用OpenSSL命令如下:

$: openssl pkcs12 -export -out client.p12 -inkey out/client.key -in out/client.crt -certfile out/ExampleCA.crt

2. 雙向認證(Mutual TLS Authentication)

在Go語言編程過程中,經常會對C/S交互進行雙向認證,以確保通信安全。在服務端程序與客戶端程序部分需要進行相應的 tls.Config 網絡傳輸層的設置。至於具體雙向認證的原理,本文不再贅述。這裏推薦我個人從很多項目中解耦出來的一個通用包,方便更加快速的實現C/S端的tls.Config生成。具體項目地址: x-mod/tlsconfig

2.1 mTLS 服務端設置

服務端開啓TLS,同時開啓客戶端驗證:


import "github.com/x-mod/tlsconfig"

cf := tlsconfig.New(
    //服務端 TLS 證書
    tlsconfig.CertKeyPair("out/server.crt", "out/server.key"), 
    //客戶端 TLS 證書籤名 CA
    tlsconfig.ClientCA("out/exampleCA.crt"), 
    //驗證客戶端證書
    tlsconfig.ClientAuthVerified(),
)

2.2 mTLS 客戶端設置

客戶端 TLS 設置:


import "github.com/x-mod/tlsconfig"

cf := tlsconfig.New(
    //服務端 TLS 證書籤名 CA
    tlsconfig.CA("out/exampleCA.crt"), 
    //客戶端證書 TLS 證書
    tlsconfig.CertKeyPair("out/client.crt", "out/client.key"), 
)

以上代碼是簡單的C/S各端的tls.Config對象的設置,C/S程序可以是tcp/http/grpc等各類實現,可自行代碼驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章