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