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證書