問題
golang 1.15+版本上,用 gRPC通過TLS實現資料傳輸加密時,會報錯證照的問題
rpc error: code = Unavailable desc = connection error: desc = "transport: authentication ha
ndshake failed: x509: certificate is valid for www.eline.com, not xxx"
panic: rpc error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: x509: certificate is valid for www.eline.com, not xxx"
造成的原因是因為我們用的證照,並沒有開啟SAN擴充套件(預設是沒有開啟SAN擴充套件)所生成的,
導致客戶端和服務端無法建立連線
開始解決問題
使用開啟擴充套件SAN的證照
什麼是 SAN
SAN(Subject Alternative Name) 是 SSL 標準 x509 中定義的一個擴充套件。使用了 SAN 欄位的 SSL 證照,可以擴充套件此證照支援的域名,使得一個證照可以支援多個不同域名的解析。
生成CA根證照
新建 ca.conf
vim ca.conf
寫入內容如下:
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
localityName = Locality Name (eg, city)
localityName_default = NanJing
organizationName = Organization Name (eg, company)
organizationName_default = Sheld
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = Ted CA Test
生成ca祕鑰,得到ca.key
openssl genrsa -out ca.key 4096
生成ca證照籤發請求,得到ca.csr
openssl req \
-new \
-sha256 \
-out ca.csr \
-key ca.key \
-config ca.conf
shell互動時一路回車就行
生成ca根證照,得到ca.crt
openssl x509 \
-req \
-days 3650 \
-in ca.csr \
-signkey ca.key \
-out ca.crt
生成終端使用者證照
準備配置檔案,得到server.conf
新建 server.conf
vim server.conf
寫入內容如下:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
localityName = Locality Name (eg, city)
localityName_default = NanJing
organizationName = Organization Name (eg, company)
organizationName_default = Sheld
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = xiamotong # 此處尤為重要,需要用該服務名字填寫到客戶端的程式碼中
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.eline.com
IP = 127.0.0.1
生成祕鑰,得到server.key
openssl genrsa -out server.key 2048
生成證照籤發請求,得到server.csr
openssl req \
-new \
-sha256 \
-out server.csr \
-key server.key \
-config server.conf
shell互動時一路回車就行
用CA證照生成終端使用者證照,得到server.crt
openssl x509 \
-req \
-days 3650 \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-in server.csr \
-out server.pem\
-extensions req_ext \
-extfile server.conf
現在證照已經生成完畢, server.pem 和 server.key就是我們需要的證照和金鑰
服務端程式碼:
creds, err := credentials.NewServerTLSFromFile("./keys/server.pem", "./keys/server.key")
客戶端程式碼:
creds, err := credentials.NewClientTLSFromFile("./keys/server.pem", "xiaomotong")
好了,本次就到這裡,下一次分享 gRPC的interceptor
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~
本作品採用《CC 協議》,轉載必須註明作者和本文連結