最近項目中的網站要設置https,雖然進入軟件行業6年了,配置這個還是顯得信心不足,還好網上有好多網友分享的文章可以從中學習,但是有優也有劣,憑我自己的一點經驗從中甄選出好一點的文章跟大家分享一下。
1、什麼是Https?
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密通訊方法。現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。
2、如何在Nginx下設置網站的Https?
首先,你得先安裝nginx,網上好多資料可以找到安裝的方法,我們預設服務器環境是CentOS,安裝方法請點擊,這裏就不敖述了。
安裝好之後,我們需要數字證書,可以手動通過openssl生成,也可以購買,我這裏講解的是從阿里雲服務器免費購買的證書,下面詳細介紹下openssl。
2.1、openssl 簡介
openssl 是目前最流行的 SSL 密碼庫工具,其提供了一個通用、健壯、功能完備的工具套件,用以支持SSL/TLS 協議的實現。
官網:https://www.openssl.org/source/
2.1.1、openssl 構成部分
密碼算法庫
密鑰和證書封裝管理功能
SSL通信API接口
2.1.2、openssl 用途
建立 RSA、DH、DSA key 參數
建立 X.509 證書、證書籤名請求(CSR)和CRLs(證書回收列表)
計算消息摘要
使用各種 Cipher加密/解密
SSL/TLS 客戶端以及服務器的測試
處理S/MIME 或者加密郵件
2.2、openssl生成自簽名證書
生成 RSA 私鑰和自簽名證書
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt
req是證書請求的子命令,-newkey rsa:2048 -keyout private_key.pem 表示生成私鑰(PKCS8格式),-nodes 表示私鑰不加密,若不帶參數將提示輸入密碼;
-x509表示輸出證書,-days365 爲有效期,此後根據提示輸入證書擁有者信息;
若執行自動輸入,可使用-subj選項:
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
使用 已有RSA 私鑰生成自簽名證書
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt
-new 指生成證書請求,加上-x509 表示直接輸出證書,-key 指定私鑰文件,其餘選項與上述命令相同。
2.3、通過aliyun購買免費的證書
詳細操作請點擊免費申請阿里雲 - 賽門企業級鐵克 SSL 證書!
2.4、在Nginx上面配置Https
我們現在這裏只講解在阿里雲下購買的證書進行配置,現在都有了證書,現在我們來配置https。我們假設你的證書是放在/usr/local/nginx/cert這個文件夾下,如下圖所示就是我的證書文件,注意,我裏面還嵌套了一層文件夾:qitenai.com,你們根據需要添加:
然後我們進入文件夾:cd /usr/local/nginx/conf/下運行命令:
vim nginx.conf
查看server配置:
server {
listen 80;
server_name qitenai.com;
location / {
root /data/wwwroot/dist;//注意:這個項目我是基於vuejs的SPA項目
#index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
...
include /usr/local/nginx/conf/custom/*.conf;//注意這裏
我們現在80端口配置沒問題,現在運行命令:
cd /usr/local/nginx/conf/custom/
vim qitenai.conf
得到如下結果:
server {
listen 443;
server_name qitenai.com;
ssl_certificate /usr/local/nginx/cert/qitenai.com/214474132640003.pem;//證書位置
ssl_certificate_key /usr/local/nginx/cert/qitenai.com/myserver.key;//證書私鑰位置
location / {
root /data/wwwroot/dist;//注意:這個項目我是基於vuejs的SPA項目
#index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
這樣我們就配置好了nginx的https,我們瀏覽試試:
3、如何結合Nginx配置Springboot的Https?
首先,我們在springboot下的application.properties文件裏配置:
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
server.tomcat.port-header=X-Forwarded-Port
server.use-forward-headers=true
#設置服務器端口
server.port=9090
然後,我們再來配置nginx,在配置nginx我想說的是我的springboot項目是通過nohup運行的,而且這裏我寫了一個自動化腳本啓動springboot項目,如下 :
#!/bin/bash
port=9090
#根據端口號查詢對應的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
echo "pid=$pid"
#殺掉對應的進程,如果pid不存在,則不執行
if [ -n "$pid" ]; then
echo "正在執行kill命令..."
if kill -9 $pid; then
echo "正在執行nohup命令..."
nohup java -jar good-learning-success.jar &
echo "執行成功"
fi
else
echo "找不到pid,直接運行nohup命令"
nohup java -jar good-learning-success.jar &
echo "執行成功"
fi
#echo "查看端口執行情況:"
#netstat -auptl | grep 9090
再有一個,這個springboot項目我準備運行在api.qitenai.com這個二級域名下,所以我們必須要到域名服務器商處解析我們這個二級域名,具體實現網上也有好多文章,所以這裏也不詳細講述,好了,我們來配置nginx吧,運行如下命令:
cd /usr/lcoal/nginx/conf/custom
vim api.qitenai.conf
如下所示 :
server {
listen 80;
server_name api.qitenai.com;
location / {
proxy_pass http://127.0.0.1:9090; #這裏的端口記得改成項目對應的哦
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
server {
listen 443 ssl;
server_name api.qitenai.com;
ssl_certificate /usr/local/nginx/cert/api.qitenai.com/214474131840003.pem;//證書位置
ssl_certificate_key /usr/local/nginx/cert/api.qitenai.com/214474131840003.key;//證書私鑰公交車
location / {
proxy_pass http://127.0.0.1:9090; #這裏的端口記得改成項目對應的哦
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
配置好了之後,我們重啓一下nginx,其實就是停止所有80端口,443端口會隨着80端口的停止而停止,運行如下命令:
netstat -auntpl | grep 80
[root@iZm5e8pmxwulw6lsbfzw55Z custom]# netstat -auptln | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15479/nginx: master
tcp 0 0 0.0.0.0:8880 0.0.0.0:* LISTEN 13947/java
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 13694/java
tcp 0 0 127.0.0.1:8006 0.0.0.0:* LISTEN 13694/java
tcp 0 0 127.0.0.1:8007 0.0.0.0:* LISTEN 13947/java
tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 13947/java
tcp 391 0 47.104.57.2:43874 106.11.68.13:80 CLOSE_WAIT 22944/AliYunDunUpda
tcp 391 0 47.104.57.2:51732 106.11.68.13:80 CLOSE_WAIT 22944/AliYunDunUpda
tcp 0 0 47.104.57.2:36142 106.11.68.13:80 ESTABLISHED 22995/AliYunDun
udp 0 0 10.80.186.137:123 0.0.0.0:* 1165/ntpd
[root@iZm5e8pmxwulw6lsbfzw55Z custom]#kill -9 15479
再運行命令:kill -9 15479之後,再次運行命令:netstat -auptln | grep 80查看還有沒有80端口有沒有Kill掉,如果有繼續kill,如果沒有,我們就運行如下命令重啓nginx:
cd /usr/local/nginx/sbin
./nginx
然後打開域名https://api.qitenai.com,查看是否成功:
4、如何配置Qiniu的Https?
我們知道,註冊了七牛服務後,會有個默認的域名給你訪問資源文件,所以要配置https我們先換成我們的域名,這裏我們設置域名爲cdn.qitenai.com,之後,我們在七牛管理頁面下進行配置,在配置之前我們先要上傳證書,這裏我們上傳在阿里雲裏面購買的免費證書,注意:阿里雲購買的證書是一個域名對應一個證書文件,所以像我這裏要購買三次,這個一定要注意!!!
上傳之後,我們現在來配置域名:
配置一下即可,記住,要選擇我們剛剛上傳的證書,最後就是配置cname了,進入你的域名服務器進入解析即可,詳情請點擊如何配置域名的 CNAME
這樣就完成了七牛https的配置,查看效果如圖:
5、問題
5.1、如何讓http跳轉到https?如何讓http://example.com跳轉到https://www.example.com
解決方法:
server {
listen 80;
server_name www.qitenai.com qitenai.com;
return 301 https://www.qitenai.com$request_uri;
location / {
root /data/wwwroot/dist;
#index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
server {
listen 443 default_server ssl;
server_name www.qitenai.com;
ssl_certificate /usr/local/nginx/cert/qitenai.com/214474132640003.pem;
ssl_certificate_key /usr/local/nginx/cert/qitenai.com/myserver.key;
location / {
root /data/wwwroot/dist;
#index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
server {
listen 443;
server_name qitenai.com;
return 301 https://www.qitenai.com$request_uri;
ssl_certificate /usr/local/nginx/cert/qitenai.com/214474132640003.pem;
ssl_certificate_key /usr/local/nginx/cert/qitenai.com/myserver.key;
location / {
root /data/wwwroot/dist;
#index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
5.2、同一個域名不同的端口沒有設置https如何訪問?
沒有辦法因爲你沒有設置https,所以只能通過http訪問,實際上這種情況還是很多的,比如有些項目使用的nginx,有些只使用tomcat,而tomcat項目是測試的,所以沒有配置https很正常。
如果你有問題可以加我的qq羣向我提問:464696550
參考文章:
1、Spring Boot學習筆記-Nginx+Jar包部署項目
2、SpringBoot+Nginx+Https下redirect問題
3、Nginx + Tomcat + HTTPS 配置不需要在 Tomcat 上啓用 SSL 支持
4、Nginx配置多個HTTPS域名的方法
5、使用 openssl 生成證書
6、阿里雲ecs 服務器配置 nginx https
7、爲nginx配置https並自簽名證書
8、Nginx搭建HTTPS服務器--自簽證書
9、Nginx+Https配置
10、主流數字證書都有哪些格式?
11、使用Spring Boot開發Web項目(二)之添加HTTPS支持
12、nginx https下不帶www跳轉www設置
13、Nginx 不帶www的https域名 301跳轉到帶www的方法
14、Nginx服務器中HTTP 301跳轉到帶www的域名的方法
15、A redirect to a main site
16、Spring Boot中啓動HTTPS
17、Nginx+Https配置