原文鏈接: 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
等各類實現,可自行代碼驗證。