當Notification和Websocket遇到https、http
@
本次遇到的坑是在一個需求中的坑。
先講一下問題背景吧:
首先本項目的一個請求是屬於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不能使用,結果也還好最後解決了。

