當Notification和Websocket遇到https、http

陌陌卡上發表於2020-08-17

@


本次遇到的坑是在一個需求中的坑。

先講一下問題背景吧:
首先本專案的一個請求是屬於http,且部署是直接部署到公司內網中的專案(所以用ip+埠訪問)。

本專案的需求坑為:使用websocket與後臺建立長連結,定時接收後臺訊息,並使用Notification訊息提示。
Notification: 使用Notification的時候在本地使用是沒有任何毛病的,直到...部署到公司伺服器(Centos7)上,就發現原本的Notification的訊息提示沒有了!!經過查詢,才發現原來Chrome釋出了新版本62,Notification API不再支援http,所以接下來就得把原本部署在tomcat上的服務請求給換成https請求。

換成https請求: 在切換的時候呢,發現很多部落格的提議都是安裝ngnix,要不就是購買域名下載證書..... 但是呢,一個身為內網中的專案需要個啥域名哦。所以就得自己生成一個證書,湊合著用就行了(生成證書的方式有很多種,這我會提供兩種方式)

Websocket: 在把因為Notification而導致使用https之後的專案中,又出現了某個新問題...,就是Websocket又不能使用了,所以需要也需要找對應的解決方案。


一、http轉為https請求

先說明證書的類別,不過我本次只會部署在tomcat上所以就需要jks的一個型別。
在這裡插入圖片描述

(1)生成證書1(crt證書轉tomcat使用的jks)

第一步:生成一個帶密碼的私鑰 :server.pass.key(需要輸入一個4位以上的密碼)

# genra	生成RSA私鑰
# -des3	des3演算法
# -out server.key (server.key 為生成的私鑰檔名)
# 2048 私鑰長度
openssl genrsa -des3 -out server.pass.key 2048

第二步:生成一個不帶密碼的私鑰: server.key

openssl rsa -in server.pass.key -out server.key

第三步:生成一個證書籤名請求: server.csr

# req 生成證書籤名請求
# -new 新生成
# -key 私鑰檔案
# -out 生成的CSR檔案
# -subj 生成CSR證書的引數
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=xdevops/OU=xdevops/CN=gitlab.xdevops.cn"

有需求改,沒需求可以不改
在這裡插入圖片描述
第四步:生成自簽名SSL證書:server.crt

# -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是一個標準,規範了公開祕鑰認證、證書吊銷列表、授權憑證、憑證路徑驗> 證演算法等。

第五步:生成jks 證書 :server.jks

openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name server
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore server.jks

在這裡插入圖片描述

(2)配置證書1

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" maxHttpHeaderSize="3097152" maxPostSize="-1"   URIEncoding="UTF-8"  />
               

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
              maxThreads="150" scheme="https" secure="true" 
              keystoreFile="/home/server.jks" 
              keystorePass="123456" 
              clientAuth="false" sslProtocol="TLS" 
              connectionTimeout="20000" />

在這裡插入圖片描述

(3)生成證書2

模板:

keytool -genkeypair -alias [user]  -keyalg [認證型別] -keystore [file]

我的:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/tomcat/conf/.keystore

常用引數介紹:

  • keytool -genkey :自動使用預設的演算法生成公鑰和私鑰

  • -alias[名稱]:給證書取個別名

  • -keyalg:制定金鑰的演算法,如果需要制定金鑰的長度,可以再加上keysize引數,金鑰長度預設為1024位,使用DSA演算法時,金鑰長度必須在512到1024之間,並且是64的整數倍

  • -keystore:引數可以指定金鑰庫的名稱。金鑰庫其實是存放迷藥和證書檔案,金鑰庫對應的檔案如果不存在會自動建立。

  • -validity:證書的有效日期,預設是90天

  • -keypass: changeit:不新增證書密碼

  • -storepass changeit:不新增儲存證書的密碼
    在這裡插入圖片描述

(4)配置證書2

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" maxHttpHeaderSize="3097152" maxPostSize="-1"   URIEncoding="UTF-8"  />
               

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="/home/tomcat/conf/.keystore"
                         type="RSA" certificateKeystorePassword="123456" />
        </SSLHostConfig>
    </Connector>

在這裡插入圖片描述

二、Websocket改為https連線

有點簡單:就把原來的ws 給改為wss
在這裡插入圖片描述

後言

額,在開始的時候是因為不知道為什麼notifcation不能使用,結果也還好最後解決了。

相關文章