|
|
|
|
|
增加HTTPS的支持需要在nginx上增加證書(證書需要ops來購買),在開發(fā)環(huán)境里時,需要自己來生成證書:1、生成證書;2、找到j(luò)ava的目錄;3、生成一個證書。在已經(jīng)購買好證書的前提下,可以通過以下方式配置證書。
nginx配置
server {
listen 443;
server_name 你的域名;
charset utf8;
gzip off;
ssl on;
ssl_certificate/home/q/nginx/ssl/server.crt;
ssl_certificate_key/home/q/nginx/ssl/server.key;
if ( $request_method !~ GET|POST|HEAD ) {
return 403;
}
proxy_set_header Host "你的域名";
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_set_header dj-sch "https";
proxy_set_header X-Real-Scheme $scheme;
location / {
proxy_pass http://127.0.0.1:80;
#proxy_pass 你的域名;
}
}
在java中通過X-Real-Scheme或dj-sch獲取當(dāng)前協(xié)議
SchemeUtil.java
private static String HTTPS_HEADER = "X-Real-Scheme";
private static String HTTPS_SCHEME = "https";
private static String HTTP_SCHEME = "http";
public static String getScheme(HttpServletRequest request){
String scheme = request.getHeader(HTTPS_HEADER);
if(scheme != null &&scheme.equals(HTTPS_SCHEME)){
return HTTPS_SCHEME;
}else {
return HTTP_SCHEME;
}
}
代碼涉及的改動
頁面請求的靜態(tài)資源:js 、 css 、 image等,將jsp和java工程中的url進(jìn)行修改,http和https域名對應(yīng)關(guān)系如下:
http和https域名對應(yīng)關(guān)系
遇到的問題及處理方案
nginx上對443端口的請求在header里添加https標(biāo)記,需要和后端保證一致;
個別css和js在https環(huán)境下需要在引入時標(biāo)記css/js=ssl;
同一個域名下面,部分內(nèi)部調(diào)用的接口,是不需要支持https的,因此在做nginx轉(zhuǎn)發(fā)的時候,需要針對這些uri做特殊處理。
擴(kuò)展閱讀
nginx配置https
1、修改配置文件:
進(jìn)入nginx配置文件 /usr/local/lnmp/nginx/conf/ 下,打開 nginx.conf
[root@localhost conf]# pwd
/usr/local/lnmp/nginx/conf
[root@localhost conf]# vim nginx.conf
配置該文件如下所示:
nginx.conf 配置文件
2、生成ssl數(shù)字證書:
進(jìn)入/etc/pki/tls/,生成nginx.pem證書:
[root@localhost tls]# cd /etc/pki/tls/certs/
[root@localhost certs]# make nginx.pem
生成nginx.pem證書
填寫證書信息:
填寫證書信息
3、將nginx.pem文件拷貝到nginx配置文件中:
[root@localhost certs]# cp nginx.pem /usr/local/lnmp/nginx/conf/
4、將nginx命令加載到全局變量中
[root@localhost conf]# pwd
/usr/local/lnmp/nginx/conf
[root@localhost conf]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/bin/
5、檢測自定義配置文件的完整路徑是否,并重新加載
[root@localhost conf]# nginx -t
nginx: the configuration file /usr/local/lnmp/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/lnmp/nginx/conf/nginx.conf test is successful
[root@localhost conf]# nginx -s reload
nginx: [error] invalid PID number “” in “/usr/local/lnmp/nginx/logs/nginx.pid”
在重新加載時出現(xiàn)上述問題,提示沒有可用的nginx.pid文件。
在使用的阿里云服務(wù)器上,進(jìn)程性的 nginx -s stop后再次啟動nginx -s reload ,總是會報錯誤,這應(yīng)該是因?yàn)榘裯ginx進(jìn)程殺死后pid丟失了,下一次再開啟nginx -s reload時無法啟動。
解決方法:
重新運(yùn)行/usr/local/lnmp/nginx/sbin/nginx:
[root@localhost conf]# /usr/local/lnmp/nginx/sbin/nginx
重新啟動:
[root@localhost conf]# /usr/local/lnmp/nginx/sbin/nginx -s reload
在重載nginx
[root@localhost conf]# nginx -s reload
成功??!
在index.html中寫入顯示nginx頁面后歡迎語:
[root@localhost html]# pwd
/mnt/nginx-1.9.9/html
[root@localhost html]# echo “Hello, Welcome to Nginx!” > index.html
6、訪問Nginx地址
進(jìn)入瀏覽器訪問設(shè)置的nginx地址,點(diǎn)開I Understand the Risks點(diǎn)擊Add Exception即可:
瀏覽器訪問設(shè)置的nginx地址
點(diǎn)擊comfire確認(rèn)該認(rèn)證,在訪問該nginx地址就可以看到index.html中的歡迎語:
Hello. Welcome to Nginx!
Nginx 歡迎語
至此,nginx下的https配置結(jié)束!
文章擴(kuò)展
nginx下配置https ssl的例子
現(xiàn)在百度都用了https,那么我們個人網(wǎng)站是不是也要使用https協(xié)義呢?不管你要不要下面我來為各位介紹一篇nginx下配置https ssl證書的例子。
首先確保機(jī)器上安裝了openssl和openssl-devel
#yum install openssl
#yum install openssl-devel
然后就是自己頒發(fā)證書給自己
#cd /usr/local/nginx/conf
#openssl genrsa -des3 -out server.key 1024
#openssl req -new -key server.key -out server.csr
#openssl rsa -in server.key -out server_nopwd.key
#openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt
至此證書已經(jīng)生成完畢,下面就是配置nginx
server {
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server_nopwd.key;
}
然后重啟nginx即可。
ps: 如果出現(xiàn)
[emerg] 10464#0: unknown directive “ssl” in /usr/local/nginx-0.6.32/conf/nginx.conf:74
則說明沒有將ssl模塊編譯進(jìn)nginx,在configure的時候加上“–with-http_ssl_module”即可。
至此已經(jīng)完成了https服務(wù)器搭建,但如何讓瀏覽器信任自己頒發(fā)的證書呢?
今天終于研究搗鼓出來了,只要將之前生成的server.crt文件導(dǎo)入到系統(tǒng)的證書管理器就行了,具體方法:
控制面板 -> Internet選項(xiàng) -> 內(nèi)容 -> 發(fā)行者 -> 受信任的根證書頒發(fā)機(jī)構(gòu) -> 導(dǎo)入 -》選擇server.crt。
注意 https訪問的是443端口,所以iptables要放開這個端口才可以。
知識擴(kuò)展
https(Secure Hypertext Transfer Protocol) 安全超文本傳輸協(xié)議 它是以安全為目標(biāo)的http通道,即它是http的安全版,它使用安全套接字層(SSL)進(jìn)行信息交換。它在使用之前需要先得到證書。 它是由Netscape開發(fā)并內(nèi)置于其瀏覽器中,用于對數(shù)據(jù)進(jìn)行壓縮和解壓操作,并返回網(wǎng)絡(luò)上傳送回的結(jié)果。HTTPS實(shí)際上應(yīng)用了Netscape的安全套接字層(SSL)作為HTTP應(yīng)用層的子層。(HTTPS使用端口443)SSL使 用40 位關(guān)鍵字作為RC4流加密算法,這對于商業(yè)信息的加密是合適的也更加安全。
https協(xié)議需要申請證書。http超文本傳輸協(xié)議,信息是明文傳輸。http則是具有安全性的ssl加密傳輸協(xié)議 。在端口的使用中http一般是80,而https則是使用443端口。
http的連接很簡單,是無狀態(tài)的,而 https協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比http協(xié)議安全 https解決的問題:
1 . 信任主機(jī)的問題
采用https 的server 必須從CA 申請一個用于證明服務(wù)器用途類型的證書, 改證書只有用于對應(yīng)的server 的時候,客戶度才信任次主機(jī),所以目前所有的銀行系統(tǒng)網(wǎng)站,關(guān)鍵部分應(yīng)用都是https 的,客戶通過信任該證書,從而信任了該主機(jī),其實(shí)這樣做效率很低,但是銀行更側(cè)重安全。這一點(diǎn)對我們沒有任何意義,我們的server ,采用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server。
2 . 防止通訊過程中的數(shù)據(jù)的泄密和被竄改
一般意義上的https,就是 server 有一個證書。
a) 主要目的是保證server 就是他聲稱的server,這個跟第一點(diǎn)一樣。
b) 服務(wù)端和客戶端之間的所有通訊,都是加密的。
具體講,是客戶端產(chǎn)生一個對稱的密鑰,通過server 的證書來交換密鑰,一般意義上的握手過程,加下來所有的信息往來就都是加密的,第三方即使截獲,也沒有任何意義,因?yàn)樗麤]有密鑰,當(dāng)然竄改也就沒有什么意義了。
少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書。
a) 這里客戶端證書,其實(shí)就類似表示個人信息的時候,除了用戶名/密碼,還有一個CA 認(rèn)證過的身份,應(yīng)為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認(rèn)自己的身份。
b) 目前少數(shù)個人銀行的專業(yè)版是這種做法,具體證書可能是拿U盤作為一個備份的載體,像我用的交通銀行的網(wǎng)上銀行就是采取的這種方式。