1 背景
對(duì)于api服務(wù)器,我們不能讓訪問者先登錄再進(jìn)行訪問這樣不安全惯疙,也不友好。 http協(xié)議沒有任何的加密以及身份驗(yàn)證的機(jī)制对碌,即時(shí)是token認(rèn)證蒿偎,也非常容易遭遇竊聽诉位、劫持、篡改叁丧,因此會(huì)造成個(gè)人隱私泄露岳瞭,惡意的流量劫持等嚴(yán)重的安全問題寝优。
1.1 https如何保證安全
HTTPS是以安全為目標(biāo)的HTTP通道枫耳,簡(jiǎn)單講是HTTP的安全版。即HTTP下加入SSL層钻心,HTTPS的安全基礎(chǔ)是SSL垄开,因此加密的詳細(xì)內(nèi)容就需要SSL长搀。它是一個(gè)URI scheme(抽象標(biāo)識(shí)符體系)璃饱,句法類同http:體系,用于安全的HTTP數(shù)據(jù)傳輸苍柏。https:URL表明它使用了HTTPS试吁,但HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)楼咳。
1.2 身份認(rèn)證(CA數(shù)字證書)
https協(xié)議中身份認(rèn)證的部分是由數(shù)字證書來完成的烛恤,證書由公鑰缚柏、證書主體碟贾、數(shù)字簽名等內(nèi)容組成,在客戶端發(fā)起SSL請(qǐng)求后粱锐,服務(wù)端會(huì)將數(shù)字證書發(fā)給客戶端怜浅,客戶端會(huì)對(duì)證書進(jìn)行驗(yàn)證蔬崩,并獲取用于秘鑰交換的非對(duì)稱密鑰。
數(shù)字證書有兩個(gè)作用:
1)身份授權(quán)跨琳。確保瀏覽器訪問的網(wǎng)站是經(jīng)過CA驗(yàn)證的可信任的網(wǎng)站脉让。
2)分發(fā)公鑰功炮。每個(gè)數(shù)字證書都包含了注冊(cè)者生成的公鑰。在SSL握手時(shí)會(huì)通過certificate消息傳輸給客戶端滚澜。
申請(qǐng)一個(gè)受信任的數(shù)字證書通常有如下流程:
1)終端實(shí)體(可以是一個(gè)終端硬件或者網(wǎng)站)生成公私鑰和證書請(qǐng)求设捐。
2)RA(證書注冊(cè)及審核機(jī)構(gòu))檢查實(shí)體的合法性塘淑。如果個(gè)人或者小網(wǎng)站朴爬,這一步不是必須的。
3)CA(證書簽發(fā)機(jī)構(gòu))簽發(fā)證書母赵,發(fā)送給申請(qǐng)者。
4)證書更新到repository(負(fù)責(zé)數(shù)字證書及CRL內(nèi)容存儲(chǔ)和分發(fā))师倔,終端后續(xù)從repository更新證書周蹭,查詢證書狀態(tài)等凶朗。
注冊(cè)備案過的域名,可以供我們使用搓萧,申請(qǐng)SSL證書宛畦,需要SSL證書進(jìn)行認(rèn)證次和。SSL證書有很多途徑都可以申請(qǐng),比如國(guó)內(nèi)的阿里云石蔗,騰訊云等都是比較方便的读规,而且還有免費(fèi)的證書可以申請(qǐng)束亏,都是一年的使用時(shí)間阵具。本文中采用的是OpenSLL自簽名創(chuàng)建SLL,畢竟是免費(fèi)的怕敬。
2 OpenSLL下載安裝
2.1 下載OpenSSL
本次安裝是在centos7上安裝东跪,首先下載OpenSSL,如果需要window版本(https://oomake.com/download/openssl)丁恭,我這邊下載了openssl-1.1.1d.tar.gz斋日。
2.2 安裝OpenSSL
由于我是window10系統(tǒng)恶守,使用Xshell遠(yuǎn)程Linux系統(tǒng),需要上傳和下載文件庸毫,命令安裝lrzsz
# yum -y install lrzsz
安裝完成后岔绸,可以開始使用 rz(上傳)和 sz(下載)指令橡伞。
#rz
上傳完成后即可依次執(zhí)行以下指令安裝了
# tar -xzf openssl-1.1.1d.tar.gz
# cd openssl-1.1.1d
# mkdir /usr/local/openssl
# ./config --prefix=/usr/local/openssl
# make
# make install
這樣就安裝完成了兑徘,接下來一些輔助步驟。
2.3 創(chuàng)建軟連接
# which openssl
/usr/bin/openssl
為了使用方便藕漱,以及以后版本更新方便崭闲,可以創(chuàng)建軟連接刁俭,如下:
# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
此步驟可能會(huì)報(bào)異常,我就忽略了侮繁,如果您能明白如孝,歡迎指導(dǎo)5谖1蜃妗涧至!
2.4 執(zhí)行以下命令
# cd /usr/local/openssl
# ldd /usr/local/openssl/bin/openssl
linux-vdso.so.1 => (0x00007fff7b9e5000)
libssl.so.1.1 => not found
libcrypto.so.1.1 => not found
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7faa7aa000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7faa58e000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7faa1c1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7faa9ae000)
安裝OK
2.5 查看版本
# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
3 創(chuàng)建自簽名的SSL證書和私鑰
3.1 生成私鑰(key文件)
# -genra 生成RSA私鑰
# -des3 des3算法
# -out server.key 生成的私鑰文件名
# -2048 私鑰長(zhǎng)度
#openssl genrsa -des3 -out server.pass.key 2048
輸入一個(gè)4位以上的密碼南蓬。
3.2 去除私鑰中的密碼
# openssl rsa -in server.pass.key -out server.key
注意:有密碼的私鑰是server.pass.key哑了,沒有密碼的私鑰是server.key
在第3.1步創(chuàng)建私鑰的過程中弱左,由于必須要指定一個(gè)密碼拆火。而這個(gè)密碼會(huì)帶來一個(gè)副作用,那就是在每次Apache啟動(dòng)Web服務(wù)器時(shí)币叹,都會(huì)要求輸入密碼模狭,這顯然非常不方便嚼鹉。所以要?jiǎng)h除私鑰中的密碼。
3.3 生成CSR(證書簽名請(qǐng)求)
# -req 生成證書簽名請(qǐng)求
# -new 新生成
# -key 私鑰文件
# -out 生成的CSR文件
# -subj 生成CSR證書的參數(shù)
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Shanghai/L=Shanghai/O=cetc/OU=cetc/CN=gitlab.cetc.cn"
subj參數(shù)說明如下:
字段 | 字段含義 | 示例 |
---|---|---|
/C= | Country 國(guó)家 | CN |
/ST= | State or Province 省 | Shanghai |
/L= | Location or City 城市 | Shanghai |
/O= | Organization 組織或企業(yè) | cetc |
/OU= | Organization Unit 部門 | wlst |
/CN= | Common Name 域名或IP | wlst.com |
3.4 生成自簽名SSL證書
# -days 證書有效期
#openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
X.509證書包含三個(gè)文件:key,csr线脚,crt酒贬。
- key是服務(wù)器上的私鑰文件,用于對(duì)發(fā)送給客戶端數(shù)據(jù)的加密,以及對(duì)從客戶端接收到數(shù)據(jù)的解密
- csr是證書簽名請(qǐng)求文件零如,用于提交給證書頒發(fā)機(jī)構(gòu)(CA)對(duì)證書簽名
- crt是由證書頒發(fā)機(jī)構(gòu)(CA)簽名后的證書,或者是開發(fā)者自簽名的證書祸憋,包含證書持有人的信息蚯窥,持有的公鑰塞帐,以及簽署者的簽名等信息
備注:在密碼學(xué)中葵姥,X.509是一個(gè)標(biāo)準(zhǔn),規(guī)范了公開秘鑰認(rèn)證允乐、證書吊銷列表削咆、授權(quán)憑證拨齐、憑證路徑驗(yàn)證算法等奏黑。
4 將.key和.crt文件轉(zhuǎn)換成.jks文件
4.1 先使用openssl 工具 將 crt和key格式的證書轉(zhuǎn)還成pfx:
#openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
其中:server.pfx (轉(zhuǎn)后的pfx)mycert.key,mycert.crt( crt和key格式的證書)
注意:該步驟需要輸入密碼passward馁害,該密碼2與3均需要用到
4.2 查看證書別名
#keytool -list -v -keystore server.pfx
4.3 在使用jdk自帶的keytool將pfx格式文件轉(zhuǎn)為jks
#keytool -importkeystore -srckeystore server.pfx -srcstoretype pkcs12 -destkeystore mycert.jks -deststoretype JKS -alias 1
其中:-alias(設(shè)置別名) mycert.jks(轉(zhuǎn)還后jks) server.pfx(需轉(zhuǎn)還的pfx)
注意:該步驟需要輸入3次密碼碘菜,均采用1中的passward限寞。
5 Tomcat配置SSL證書
此處我的Tomcat安裝在Windows10系統(tǒng)中履植;
在Server中配置:
- 聲明開啟HTTPS (SSL認(rèn)證)
- 聲明偵聽443端口(并確保已在防火墻上打開443端口)
- 復(fù)制已簽名的SSL證書和私鑰到指定位置玫霎,并設(shè)置正確的文件權(quán)限
- 配置已簽名的SSL證書(mycert.jks)的位置
- 配置將HTTP請(qǐng)求都重定向到HTTPS
5.1 將證書mycert.jks拷貝到conf文件夾下妈橄。
5.2 配置server.xml文件眷蚓,需要修改三個(gè)地方
(1)把
改為:
其中第一個(gè)80端口是為HTTP(HyperText Transport Protocol)即超文本傳輸協(xié)議開放的,此為上網(wǎng)沖浪使用次數(shù)最多的協(xié)議罢缸,第二個(gè)443端口是SSL的專用端口祖能;
(2)把
改為:
使用443端口的理由同上养铸;
(3)把
改為:
首先去掉注釋兔甘,然后certificateKeystoreFile屬性是讓你告訴服務(wù)器需要哪個(gè)SSL證書鳞滨,后面就填復(fù)制過去的那個(gè)jks文件的名字(記得帶上jks后綴)拯啦,然后加上certificateKeystorePassword這個(gè)屬性,后面的屬性值是同第4步中的密碼唁情。(我全局都用一個(gè)密碼甸鸟,免得出錯(cuò))
這就配置完成server.xml啦兵迅。
5.3 啟動(dòng)Tomcat
到bin目錄下,雙擊執(zhí)行startup.bat
6 在瀏覽器中訪問
在瀏覽器中打開https://localhost來訪問刻恭。
在Firefox瀏覽器中可以添加Security Exception來忽略HTTPS錯(cuò)誤警告吠各。
Chrome瀏覽器可以嘗試通過導(dǎo)入CA證書的方式來忽略HTTPS錯(cuò)誤警告贾漏。
注意:Chrome瀏覽器可能有導(dǎo)入CA證書后仍然無法訪問的問題藕筋;不同瀏覽器對(duì)自簽名SSL證書的檢查和限制也有所區(qū)別隐圾。
注意
自簽名的SSL證書存在安全隱患,在生產(chǎn)環(huán)境上需要購(gòu)買和使用經(jīng)權(quán)威機(jī)構(gòu)認(rèn)證和辦法的證書蜜笤。
參考文獻(xiàn)
OpenSSL下載安裝
使用OpenSSL生成自簽名SSL證書
自簽名證書生成過程
Tomcat安裝SSL證書