HTTPS證書的生成與配置

一、環境說明

內網環境,前後端分離,nginx部署前端服務,springbot部署後端服務。

二、證書獲取途徑

1、正規機構頒發

優點:正規,瀏覽器校驗通過。
缺點:需要通過真實的域名去申請,並按年交納一定費用。

2、自行簽發

優點:自行通過證書生成工具生成,無需綁定域名方便免費,使用服務器IP即可生成證書。
缺點:因無法校驗頒發機構,,瀏覽器提示不安全。

三、keytool生成證書

原因

因爲是內網環境,沒有域名,無法從各個收費(免費)的機構申請證書。
【頒發證書的流程就是證書頒發機構需要到服務器上檢驗該網站的確屬於你,這是一個必要步驟,這也是內網申請不到證書的原因。】
諮詢正規機構可知,有兩種方法:
1、自簽證書(本人使用jdk自帶的keytool工具生成,還可用openssl等途徑)
2、自搭認證證書服務器(未深入探究,求教)

步驟

1、生成私鑰key.pem

定位到密鑰文件夾下運行cmd,執行如下命令:
keytool -genkey -alias mytest -keyalg RSA -keystore key.pem
名字姓氏:輸入提供服務的域名/IP地址/URL中的某個段落/localhost,其他輸入項隨意。
通常爲了方便,密鑰庫口令和別名mytest的密鑰的口令一致。
命令執行完後文件夾下出現key.em私鑰文件。
在這裏插入圖片描述

2、生成證書cert.pem

keytool -export -file cert.pem -alias mytest -keystore key.pem
輸入密鑰庫口令,執行完後文件夾下出現cert.pem證書文件。
在這裏插入圖片描述

3、轉換格式

轉格式命令很多,但有些格式轉換需要使用openssl,而裝openssl有些麻煩,在此提供一個網站
https://myssl.com/cert_convert.html
上述命令生成的私鑰爲JKS類型
原格式:JKS
目標格式:PEM(nginx只能識別PEM的)
證書文件:上傳私鑰key.pem
原文件密碼:創建私鑰key.pem設置的密碼
解壓密碼:轉換爲 PEM 時,你得到 .zip 壓縮文件的密碼。
在這裏插入圖片描述
轉換完的文件:
證書文件mytest,查看類型爲.cer,記事本打開查看格式爲pem類型。
私鑰文件mytest.key,記事本打開查看格式爲pem類型。
在這裏插入圖片描述

4、安裝證書

雙擊證書文件mytest.cer,按照提示進行安裝,最後提示不受信任(因爲是自籤的),確定即可。
在這裏插入圖片描述
在這裏插入圖片描述

5、nginx配置

因爲只要求前端對外提供HTTPS訪問,前後端之間的接口仍然使用HTTP協議,所以只需要配置nginx即可。

server {
	listen       443 ssl;
	#ssl on;
	server_name  10.10.25.21; // 需要與創建私鑰key.pem時設置的名字姓氏保持一致

	ssl_certificate      E:/mytest/mytest.cer; // 格式轉換後的證書文件
	ssl_certificate_key  E:/mytest/mytest.key; // 格式轉換後的私鑰文件

	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;

	ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
	
	ssl_ciphers  HIGH:!aNULL:!MD5;
	
	ssl_prefer_server_ciphers  on;

	location / {
		root   E:/……/dist/; // 前端dist路徑
		if (!-e $request_filename) {
			rewrite ^(.*)$ /index.html;
		}
	}

	location ~*\.(js|css|png|jpg|jpeg|gif|ico)$ {
		root   E:/……/dist/; // 前端dist路徑
		expires 30d;
	}

	location /api {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header Host $http_host;
		proxy_pass http://localhost:8085/; // 後端接口調用地址,仍然使用http調用
	}
}

啓動nginx,打開瀏覽器,訪問https://10.10.25.21:443,能正常訪問,但提示不安全,證書是無效的。
因爲頒發者信息無法查詢,瀏覽器不信任,只有正規CA機構頒發的瀏覽器才認同。
在這裏插入圖片描述

注意點

1、生成私鑰時,切記 -keyalg RSA 不然默認的是DES
雖然啓動nginx不報錯,但是訪問HTTPS對應端口,瀏覽器報錯:
無法建立安全連接
2、若證書格式不對,啓動nginx時報錯(查看nginx的error日誌文件):
[emerg] 9632#11880: PEM_read_bio_X509_AUX(“E:/keytest/cert.pem”) failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)
雖然後綴是pem文件類型是pem,但並不代表編碼格式是pem。
可以通過記事本打開私鑰key.pem、證書cert.pem文件查看,pem編碼格式應該類似如上“3、轉換格式”圖2所示。
3、若私鑰格式不對,啓動nginx時報錯(查看nginx的error日誌文件):
SSL_CTX_use_PrivateKey_file(“E:/keytest/key.pem”) failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: ANY PRIVATE KEY error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
查看nginx的error日誌文件很重要,可以定位很多問題!!
4、-genkey即-genkeypair,keytool命令說明詳見官方文檔
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

四、後續

因爲自籤的證書瀏覽器顯示不安全,很扎眼,於是有了如下嘗試:
1、拿到同事通過域名www.xxx.com申請到,已安裝使用的證書、私鑰文件。
cert.pem
key.pem
2、修改nginx配置
listen 9443 ssl; // 爲了防止與他們的服務衝突改443爲9443
server_name www.xxx.com;
ssl_certificate E:/xxx/cert.pem;
ssl_certificate_key E:/xxx/key.pem;
3、修改host文件
將本機(也就是服務器)的域名改成和他們的一致
C:\Windows\System32\drivers\etc\host
host文件追加一行:
127.0.0.1 www.xxx.com
4、啓動nginx
瀏覽器訪問https://www.xxx.com:9443,能正常訪問,無不安全提示,證書是有效的。

五、思考

這………豈不是隻要申請一個域名和證書,內網環境都修改成相同的域名就能共用證書了,不是省了一筆嗎?
當然,內網的客戶端每臺機器都要去配置host文件,將服務器IP及其域名寫上。或者內網的dns上配置一下服務器IP及其域名就行了???

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章