當Notification和Websocket遇到https、http
阿新 • • 發佈:2020-08-17
@[toc](前言)
本次遇到的坑是在一個需求中的坑。
先講一下問題背景吧:
首先本專案的一個請求是屬於http,且部署是直接部署到公司內網中的專案(所以用ip+埠訪問)。
本專案的需求坑為:使用websocket與後臺建立長連結,定時接收後臺訊息,並使用Notification訊息提示。
**Notification:** 使用Notification的時候在本地使用是沒有任何毛病的,直到...部署到公司伺服器(Centos7)上,就發現原本的Notification的訊息提示沒有了!!經過查詢,才發現原來[Chrome釋出了新版本62,Notification API不再支援http](https://www.zhihu.com/question/67534604),所以接下來就得把原本部署在tomcat上的服務請求給換成https請求。
**換成https請求:** 在切換的時候呢,發現很多部落格的提議都是安裝ngnix,要不就是購買域名下載證書..... 但是呢,一個身為內網中的專案需要個啥域名哦。所以就得自己生成一個證書,湊合著用就行了(生成證書的方式有很多種,這我會提供兩種方式)
**Websocket:** 在把因為Notification而導致使用https之後的專案中,又出現了某個新問題...,就是Websocket又不能使用了,所以需要也需要找對應的解決方案。
---
# 一、http轉為https請求
先說明證書的類別,不過我本次只會部署在tomcat上所以就需要jks的一個型別。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807132948890.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MzU0OA==,size_16,color_FFFFFF,t_70)
## (1)生成證書1(crt證書轉tomcat使用的jks)
**第一步:生成一個帶密碼的私鑰 :server.pass.key(需要輸入一個4位以上的密碼)**
```bash
# genra 生成RSA私鑰
# -des3 des3演算法
# -out server.key (server.key 為生成的私鑰檔名)
# 2048 私鑰長度
openssl genrsa -des3 -out server.pass.key 2048
```
**第二步:生成一個不帶密碼的私鑰: server.key**
```bash
openssl rsa -in server.pass.key -out server.key
```
**第三步:生成一個證書籤名請求: server.csr**
```bash
# 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"
```
有需求改,沒需求可以不改
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807134224335.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MzU0OA==,size_16,color_FFFFFF,t_70)
**第四步:生成自簽名SSL證書:server.crt**
```bash
# -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**
```bash
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name server
```
```bash
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore server.jks
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807135540606.png)
## (2)配置證書1
```xml
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807135928668.png)
## (3)生成證書2
模板:
```yml
keytool -genkeypair -alias [user] -keyalg [認證型別] -keystore [file]
```
我的:
```yml
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**:不新增儲存證書的密碼
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807140937137.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MzU0OA==,size_16,color_FFFFFF,t_70)
## (4)配置證書2
```xml
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807141048840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MzU0OA==,size_16,color_FFFFFF,t_70)
# 二、Websocket改為https連線
有點簡單:就把原來的ws 給改為wss
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200807141722875.png)
# 後言
額,在開始的時候是因為不知道為什麼notifcation不能使用,結果也還好最後解