原文連接: https://www.gitdig.com/genera...
自簽名證書雙向認證大量用於各種網絡集羣項目中,例如 Kubernetes
. 要實現服務間的證書雙向驗證,固然前提是要了解證書雙向驗證原理。相關原理介紹的文章,網上不少這裏就不詳細說明了。簡單貼張圖,自行理解。git
生成自簽名證書傳統工具是OpenSSL
。不過OpenSSL
不管是其複雜的命令選項,仍是更加複雜配置都會讓人頭皮發麻。這裏介紹一個更簡單的生成自簽名證書的工具: certstrap
, 項目地址:square/certstrap.具體安裝請參考其文檔。github
要進行證書自簽名,首先是生成一個自信任的CA認證證書。編程
$: certstrap init --common-name "ExampleCA" --expires "20 years"
命令完成後,會在當前目錄下建立一個新的out
目錄,生成的證書都在該目錄下.瀏覽器
$: tree out out ├── ExampleCA.crl ├── ExampleCA.crt └── ExampleCA.key
首先建立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證書進行簽名.bash
$: 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
.網絡
企業內部集羣,一般爲了保證服務之間的安全行,對客戶端請求須要進行雙向驗證。這個時候就須要客戶端也提供證書。dom
客戶端證書的生成過程同服務端相似,更簡單一點,不須要提供證書的IP與域名信息。tcp
$: certstrap request-cert -cn client $: certstrap sign client --CA ca
生成完的證書是否正確,能夠經過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
生成PKCS格式的證書能夠直接點擊安裝到系統證書簇中,方便一些應用(瀏覽器等)的使用。具體生成PKCS 格式證書,使用OpenSSL
命令以下:
$: openssl pkcs12 -export -out client.p12 -inkey out/client.key -in out/client.crt -certfile out/ExampleCA.crt
在Go語言編程過程當中,常常會對C/S交互進行雙向認證,以確保通訊安全。在服務端程序與客戶端程序部分須要進行相應的 tls.Config
網絡傳輸層的設置。至於具體雙向認證的原理,本文再也不贅述。這裏推薦我我的從不少項目中解耦出來的一個通用包,方便更加快速的實現C/S端的tls.Config
生成。具體項目地址: x-mod/tlsconfig
服務端開啓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(), )
客戶端 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
等各種實現,可自行代碼驗證。