1. 程式人生 > >當Notification和Websocket遇到https、http

當Notification和Websocket遇到https、http

@[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不能使用,結果也還好最後解