HTTP轉HTTPS—使用OpenSSL創建自簽名SSL證書以及Tomcat配置SSL證書實戰
- 2019 年 12 月 23 日
- 筆記
1 背景
對於api伺服器,我們不能讓訪問者先登錄再進行訪問這樣不安全,也不友好。 http協議沒有任何的加密以及身份驗證的機制,即時是token認證,也非常容易遭遇竊聽、劫持、篡改,因此會造成個人隱私泄露,惡意的流量劫持等嚴重的安全問題。
1.1 https如何保證安全
HTTPS是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。它是一個URI scheme(抽象標識符體系),句法類同http:體系,用於安全的HTTP數據傳輸。https:URL表明它使用了HTTPS,但HTTPS存在不同於HTTP的默認埠及一個加密/身份驗證層(在HTTP與TCP之間)。
1.2 身份認證(CA數字證書)
https協議中身份認證的部分是由數字證書來完成的,證書由公鑰、證書主體、數字簽名等內容組成,在客戶端發起SSL請求後,服務端會將數字證書發給客戶端,客戶端會對證書進行驗證,並獲取用於秘鑰交換的非對稱密鑰。 數字證書有兩個作用:
1)身份授權。確保瀏覽器訪問的網站是經過CA驗證的可信任的網站。 2)分發公鑰。每個數字證書都包含了註冊者生成的公鑰。在SSL握手時會通過certificate消息傳輸給客戶端。
申請一個受信任的數字證書通常有如下流程:
1)終端實體(可以是一個終端硬體或者網站)生成公私鑰和證書請求。 2)RA(證書註冊及審核機構)檢查實體的合法性。如果個人或者小網站,這一步不是必須的。 3)CA(證書籤發機構)簽發證書,發送給申請者。 4)證書更新到repository(負責數字證書及CRL內容存儲和分發),終端後續從repository更新證書,查詢證書狀態等。
註冊備案過的域名,可以供我們使用,申請SSL證書,需要SSL證書進行認證。SSL證書有很多途徑都可以申請,比如中國的阿里雲,騰訊雲等都是比較方便的,而且還有免費的證書可以申請,都是一年的使用時間。本文中採用的是OpenSLL自簽名創建SLL,畢竟是免費的。
2 OpenSLL下載安裝
2.1 下載OpenSSL
本次安裝是在centos7上安裝,首先下載OpenSSL,如果需要window版本(https://oomake.com/download/openssl),我這邊下載了openssl-1.1.1d.tar.gz。
2.2 安裝OpenSSL
由於我是window10系統,使用Xshell遠程Linux系統,需要上傳和下載文件,命令安裝lrzsz
# yum -y install lrzsz
安裝完成後,可以開始使用 rz(上傳)和 sz(下載)指令。
#rz
上傳完成後即可依次執行以下指令安裝了 # 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 創建軟連接
# which openssl /usr/bin/openssl
為了使用方便,以及以後版本更新方便,可以創建軟連接,如下: # ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl 此步驟可能會報異常,我就忽略了,如果您能明白,歡迎指導!!!
2.4 執行以下命令
# 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 創建自簽名的SSL證書和私鑰
3.1 生成私鑰(key文件)
# -genra 生成RSA私鑰 # -des3 des3演算法 # -out server.key 生成的私鑰文件名 # -2048 私鑰長度 #openssl genrsa -des3 -out server.pass.key 2048 輸入一個4位以上的密碼。
3.2 去除私鑰中的密碼
# openssl rsa -in server.pass.key -out server.key
注意:有密碼的私鑰是server.pass.key,沒有密碼的私鑰是server.key 在第3.1步創建私鑰的過程中,由於必須要指定一個密碼。而這個密碼會帶來一個副作用,那就是在每次Apache啟動Web伺服器時,都會要求輸入密碼,這顯然非常不方便。所以要刪除私鑰中的密碼。
3.3 生成CSR(證書籤名請求)
# -req 生成證書籤名請求 # -new 新生成 # -key 私鑰文件 # -out 生成的CSR文件 # -subj 生成CSR證書的參數 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參數說明如下:
欄位 |
欄位含義 |
示例 |
---|---|---|
/C= |
Country 國家 |
CN |
/ST= |
State or Province 省 |
Shanghai |
/L= |
Location or City 城市 |
Shanghai |
/O= |
Organization 組織或企業 |
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證書包含三個文件:key,csr,crt。
- key是伺服器上的私鑰文件,用於對發送給客戶端數據的加密,以及對從客戶端接收到數據的解密
- csr是證書籤名請求文件,用於提交給證書頒發機構(CA)對證書籤名
- crt是由證書頒發機構(CA)簽名後的證書,或者是開發者自簽名的證書,包含證書持有人的資訊,持有的公鑰,以及簽署者的簽名等資訊 備註:在密碼學中,X.509是一個標準,規範了公開秘鑰認證、證書吊銷列表、授權憑證、憑證路徑驗證演算法等。
在這裡插入圖片描述
4 將.key和.crt文件轉換成.jks文件
4.1 先使用openssl 工具 將 crt和key格式的證書轉還成pfx:
#openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
其中:server.pfx (轉後的pfx)mycert.key,mycert.crt( crt和key格式的證書)
注意:該步驟需要輸入密碼passward,該密碼2與3均需要用到
4.2 查看證書別名
#keytool -list -v -keystore server.pfx
4.3 在使用jdk自帶的keytool將pfx格式文件轉為jks
#keytool -importkeystore -srckeystore server.pfx -srcstoretype pkcs12 -destkeystore mycert.jks -deststoretype JKS -alias 1
其中:-alias(設置別名) mycert.jks(轉還後jks) server.pfx(需轉還的pfx)
注意:該步驟需要輸入3次密碼,均採用1中的passward。
5 Tomcat配置SSL證書
此處我的Tomcat安裝在Windows10系統中;
在Server中配置:
- 聲明開啟HTTPS (SSL認證)
- 聲明偵聽443埠(並確保已在防火牆上打開443埠)
- 複製已簽名的SSL證書和私鑰到指定位置,並設置正確的文件許可權
- 配置已簽名的SSL證書(mycert.jks)的位置
- 配置將HTTP請求都重定向到HTTPS
5.1 將證書mycert.jks拷貝到conf文件夾下。
在這裡插入圖片描述
5.2 配置server.xml文件,需要修改三個地方
(1)把
在這裡插入圖片描述
改為:
在這裡插入圖片描述
其中第一個80埠是為HTTP(HyperText Transport Protocol)即超文本傳輸協議開放的,此為上網衝浪使用次數最多的協議,第二個443埠是SSL的專用埠;
(2)把
在這裡插入圖片描述
改為:
在這裡插入圖片描述
使用443埠的理由同上;
(3)把
在這裡插入圖片描述
改為:
在這裡插入圖片描述
首先去掉注釋,然後certificateKeystoreFile屬性是讓你告訴伺服器需要哪個SSL證書,後面就填複製過去的那個jks文件的名字(記得帶上jks後綴),然後加上certificateKeystorePassword這個屬性,後面的屬性值是同第4步中的密碼。(我全局都用一個密碼,免得出錯)
這就配置完成server.xml啦。
5.3 啟動Tomcat
到bin目錄下,雙擊執行startup.bat
6 在瀏覽器中訪問
在瀏覽器中打開https://localhost來訪問。
在這裡插入圖片描述
在Firefox瀏覽器中可以添加Security Exception來忽略HTTPS錯誤警告。
Chrome瀏覽器可以嘗試通過導入CA證書的方式來忽略HTTPS錯誤警告。
注意:Chrome瀏覽器可能有導入CA證書後仍然無法訪問的問題;不同瀏覽器對自簽名SSL證書的檢查和限制也有所區別。
注意
自簽名的SSL證書存在安全隱患,在生產環境上需要購買和使用經權威機構認證和辦法的證書。
參考文獻 OpenSSL下載安裝 使用OpenSSL生成自簽名SSL證書 自簽名證書生成過程 Tomcat安裝SSL證書