Nginx ssl自簽名證書(shū)雙向認(rèn)證以及Golang https client和websocket訪問(wèn)

先說(shuō)雙向認(rèn)證吧,需要使用openssl生成相應(yīng)的證書(shū)(根證書(shū)、服務(wù)端證書(shū)、多套客戶(hù)端證書(shū))。(建議在linux環(huán)境下進(jìn)行操作),我是centos7。

部署模式大體如下:

客戶(hù)瀏覽器(或其他工具)《==ssl 雙向認(rèn)證的安全通道==》Nginx代理服務(wù)<-- 內(nèi)網(wǎng)非安全通道 -->web服務(wù)(tomcat 或其他)集群

一、Nginx雙向認(rèn)證

1.生成根秘鑰及證書(shū)

openssl genrsa -des3 -out ca.key 2048

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=CN/ST=HA/L=ZZ/O=topxx/OU=internet/CN=www.xx.top/emailAddress=xxxxxxx@qq.com"

2.生成服務(wù)端證書(shū)

openssl genrsa -des3 -out www.xxx.com.pem 1024

openssl rsa -in queue.qmx.top.pem -out www.xxx.com.key?

openssl req -new -key www.xxx.com.pem -out www.xxx.com.csr -subj "/C=CN/ST=HA/L=ZZ/O=xxx/OU=internet/CN=www.xxx.com/emailAddress=xxxxxx@qq.com"

3.根證書(shū)簽名服務(wù)端證書(shū)

openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in www.xxx.com.csr -out www.xxx.com.crt

cat ca.crt >>? www.xxx.com.crt?

4.生成客戶(hù)端證書(shū) (需要在客戶(hù)機(jī)器上安裝)

openssl genrsa -des3 -out client.pem 2048

openssl req -new -key client.pem -out client-req.csr -subj "/C=CN/ST=XZ/L=LS/O=gsj/OU=gss/CN=www.clientdomain.com/emailAddress=xxxx@126.com"

openssl ca -policy policy_anything -days 1460 -cert ca.crt? -keyfile ca.key -in client-req.csr -out client.crt?

openssl pkcs12 -export -clcerts -in client.crt -inkey client.pem -out client.p12

客戶(hù)機(jī)器上雙擊p12文件,進(jìn)行安裝。如需要其他格式文件,使用openssl導(dǎo)出。

5.Nginx安裝(支持ssl模塊,已安裝過(guò)的,可以搜索教程,單單更新安裝ssl模塊)

cd /usr/local/src #進(jìn)入用戶(hù)目錄

wget http://nginx.org/download/nginx-1.15.0.tar.gz #下載最新版本nginx

tar -zxvf nginx-1.15.0.tar.gz #解壓

cd nginx-1.15.0 #進(jìn)入目錄

./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-http_realip_module --with-http_image_filter_module #檢測(cè)

說(shuō)明--prefix 指定安裝目錄

make #編譯

make install #安裝

6.Nginx ssl雙向認(rèn)證配置

server {

? listen 443;?

? server_name test.com www.test.com;?

? root html;?

? index index.html index.htm;?

? ssl on; ? ? ? ?#開(kāi)啟ssl?

? ssl_certificate? /usr/ssl/light.cn.crt;? ? #服務(wù)器證書(shū)位置?

? ssl_certificate_key /usr/ssl/light.cn.key;? #服務(wù)器私鑰?

? ssl_client_certificate /usr/ssl/ca.crt;? ? #CA證書(shū)用于驗(yàn)證客戶(hù)端證書(shū)的合法性?

? ssl_verify_client? ? ? on;? ? ? ? ? ? ? ? ? ? ? #開(kāi)啟對(duì)客戶(hù)端的驗(yàn)證?

? ssl_session_timeout 5m;? ? ? ? ? ? ? ? ? ? ? ? #session有效期,5分鐘?

? ssl_protocols TLSv1 TLSv1.1 TLSv1.2;?

? ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';? ? ? #加密算法?

? ssl_prefer_server_ciphers on;?

? location / {?

? ? proxy_pass? http://127.0.0.1:8080;?

? }? ? ? ?

}

7.吊銷(xiāo)證書(shū)

openssl ca -revoke client.crt -cert ca.crt -keyfile ca.key

openssl x509 -in rkz_client.crt -noout -serial -subject #查看證書(shū)序列號(hào)

echo 02 >> crlnumber #02是要吊銷(xiāo)的證書(shū)序號(hào)?

openssl ca -gencrl -out private/ca.crl #生成crl文件

openssl verify -crl_check -CRLfile ca.crl -CAfile ca.crt rkz_client.crt #檢查吊銷(xiāo)狀態(tài)

nginx 要想吊銷(xiāo)證書(shū)生效,需要加入: ssl_crl /opt/mykeys/ca.crl;

吊銷(xiāo)證書(shū)后nginx reload即可。

二、Golang https client 自簽名證書(shū)使用

package main

import (

? "crypto/tls"

? "crypto/x509"

? "fmt"

? "io/ioutil"

? "net/http"

)

func main() {

? pool := x509.NewCertPool()

? addTrust(pool, "./ca.crt") //添加信任的證書(shū),最好是服務(wù)端對(duì)應(yīng)的根證書(shū)

? cliCrt, err := tls.LoadX509KeyPair("./client.crt", "./client.key")

? if err != nil {

? ? ? fmt.Println("Loadx509keypair err:", err)

? ? ? return

? }

? tr := &http.Transport{

? ? ? TLSClientConfig: &tls.Config{

? ? ? ? RootCAs:? ? ? pool,

? ? ? ? Certificates: []tls.Certificate{cliCrt},

? ? ? ? //InsecureSkipVerify: true, //跳過(guò)驗(yàn)證服務(wù)端證書(shū)

? ? ? },

? }

? client := &http.Client{Transport: tr}

? resp, err := client.Get("https://www.xxx.com/myaction.do") //此處必須使用域名或者h(yuǎn)ost內(nèi)的別名

? if err != nil {

? ? ? fmt.Println("Get error:", err)

? ? ? return

? }

? defer resp.Body.Close()

? body, err := ioutil.ReadAll(resp.Body)

? fmt.Println(string(body))

}

func addTrust(pool *x509.CertPool, path string) {

? aCrt, err := ioutil.ReadFile(path)

? if err != nil {

? ? ? fmt.Println("ReadFile err:", err)

? ? ? return

? }

? pool.AppendCertsFromPEM(aCrt)

}

三、雙向認(rèn)證的websocket服務(wù)訪問(wèn)

package main

import (

????"crypto/tls"

????"crypto/x509"

????"io/ioutil"

????"log"

????"golang.org/x/net/websocket"

)

var origin = "https://queue.qmx.top/"

var url = "wss://queue.qmx.top/ws"

//

func addTrust(pool *x509.CertPool, path string) {

????aCrt, err := ioutil.ReadFile(path)

????if err != nil {

????????log.Println("ReadFile err:", err)

????????return

????}

????pool.AppendCertsFromPEM(aCrt)

}

//

func main() {

????//放置證書(shū)的目錄,僅需要跟證書(shū),客戶(hù)證書(shū)及客戶(hù)key即可

????capath := "/Users/myname/Downloads/ssl/demoCA/"

????pool := x509.NewCertPool()

????addTrust(pool, capath+"ca.crt")

????cliCrt, err := tls.LoadX509KeyPair(capath+"client.crt", capath+"client.key")

????if err != nil {

????????log.Println("Loadx509keypair err:", err)

????????return

????}

????//

????ws_cfg, err := websocket.NewConfig(url, origin)

????ws_cfg.TlsConfig = &tls.Config{RootCAs: pool,

????????Certificates: []tls.Certificate{cliCrt},

????}

????if err != nil {

????????log.Println("tls error:", err)

????????return

????}

????//構(gòu)建websocket連接

????ws, err := websocket.DialConfig(ws_cfg)

????if err != nil {

????????log.Println("dial error:", err)

????????return

????}

????log.Println(ws)

????//TODO websocket后續(xù)代碼可參考網(wǎng)上教程

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容