技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

https怎樣通過nginx配置證書

作者:admin    時(shí)間:2017-4-5 10:43:1    瀏覽:

增加HTTPS的支持需要在nginx上增加證書(證書需要ops來購(gòu)買),在開發(fā)環(huán)境里時(shí),需要自己來生成證書:1、生成證書;2、找到j(luò)ava的目錄;3、生成一個(gè)證書。在已經(jīng)購(gòu)買好證書的前提下,可以通過以下方式配置證書。

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;
  }
}

代碼涉及的改動(dòng)

頁(yè)面請(qǐng)求的靜態(tài)資源:js 、 css 、 image等,將jsp和java工程中的url進(jìn)行修改,http和https域名對(duì)應(yīng)關(guān)系如下:

http和https域名對(duì)應(yīng)關(guān)系

http和https域名對(duì)應(yīng)關(guān)系

遇到的問題及處理方案

nginx上對(duì)443端口的請(qǐng)求在header里添加https標(biāo)記,需要和后端保證一致;

個(gè)別css和js在https環(huán)境下需要在引入時(shí)標(biāo)記css/js=ssl;

同一個(gè)域名下面,部分內(nèi)部調(diào)用的接口,是不需要支持https的,因此在做nginx轉(zhuǎn)發(fā)的時(shí)候,需要針對(duì)這些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 配置文件

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證書

生成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、檢測(cè)自定義配置文件的完整路徑是否,并重新加載

[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”

在重新加載時(shí)出現(xiàn)上述問題,提示沒有可用的nginx.pid文件。

在使用的阿里云服務(wù)器上,進(jìn)程性的 nginx -s stop后再次啟動(dòng)nginx -s reload ,總是會(huì)報(bào)錯(cuò)誤,這應(yīng)該是因?yàn)榘裯ginx進(jìn)程殺死后pid丟失了,下一次再開啟nginx -s reload時(shí)無法啟動(dòng)。

解決方法:

重新運(yùn)行/usr/local/lnmp/nginx/sbin/nginx:

[root@localhost conf]# /usr/local/lnmp/nginx/sbin/nginx

重新啟動(dòng):

[root@localhost conf]# /usr/local/lnmp/nginx/sbin/nginx -s reload

在重載nginx

[root@localhost conf]# nginx -s reload

成功??!

在index.html中寫入顯示nginx頁(yè)面后歡迎語(yǔ):

[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地址

瀏覽器訪問設(shè)置的nginx地址

點(diǎn)擊comfire確認(rèn)該認(rèn)證,在訪問該nginx地址就可以看到index.html中的歡迎語(yǔ):

Hello. Welcome to Nginx!

Nginx 歡迎語(yǔ)

Nginx 歡迎語(yǔ)

至此,nginx下的https配置結(jié)束!

文章擴(kuò)展

nginx下配置https ssl的例子

現(xiàn)在百度都用了https,那么我們個(gè)人網(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的時(shí)候加上“–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要放開這個(gè)端口才可以。

知識(shí)擴(kuò)展

https:

https(Secure Hypertext Transfer Protocol) 安全超文本傳輸協(xié)議 它是以安全為目標(biāo)的http通道,即它是http的安全版,它使用安全套接字層(SSL)進(jìn)行信息交換。它在使用之前需要先得到證書。 它是由Netscape開發(fā)并內(nèi)置于其瀏覽器中,用于對(duì)數(shù)據(jù)進(jìn)行壓縮和解壓操作,并返回網(wǎng)絡(luò)上傳送回的結(jié)果。HTTPS實(shí)際上應(yīng)用了Netscape的安全套接字層(SSL)作為HTTP應(yīng)用層的子層。(HTTPS使用端口443)SSL使 用40 位關(guān)鍵字作為RC4流加密算法,這對(duì)于商業(yè)信息的加密是合適的也更加安全。

https和http的區(qū)別:

https協(xié)議需要申請(qǐng)證書。http超文本傳輸協(xié)議,信息是明文傳輸。http則是具有安全性的ssl加密傳輸協(xié)議 。在端口的使用中http一般是80,而https則是使用443端口。

http的連接很簡(jiǎn)單,是無狀態(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 申請(qǐng)一個(gè)用于證明服務(wù)器用途類型的證書, 改證書只有用于對(duì)應(yīng)的server 的時(shí)候,客戶度才信任次主機(jī),所以目前所有的銀行系統(tǒng)網(wǎng)站,關(guān)鍵部分應(yīng)用都是https 的,客戶通過信任該證書,從而信任了該主機(jī),其實(shí)這樣做效率很低,但是銀行更側(cè)重安全。這一點(diǎn)對(duì)我們沒有任何意義,我們的server ,采用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server。

2 . 防止通訊過程中的數(shù)據(jù)的泄密和被竄改

一般意義上的https,就是 server 有一個(gè)證書。

a) 主要目的是保證server 就是他聲稱的server,這個(gè)跟第一點(diǎn)一樣。

b) 服務(wù)端和客戶端之間的所有通訊,都是加密的。

具體講,是客戶端產(chǎn)生一個(gè)對(duì)稱的密鑰,通過server 的證書來交換密鑰,一般意義上的握手過程,加下來所有的信息往來就都是加密的,第三方即使截獲,也沒有任何意義,因?yàn)樗麤]有密鑰,當(dāng)然竄改也就沒有什么意義了。

少許對(duì)客戶端有要求的情況下,會(huì)要求客戶端也必須有一個(gè)證書。

a) 這里客戶端證書,其實(shí)就類似表示個(gè)人信息的時(shí)候,除了用戶名/密碼,還有一個(gè)CA 認(rèn)證過的身份,應(yīng)為個(gè)人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認(rèn)自己的身份。

b) 目前少數(shù)個(gè)人銀行的專業(yè)版是這種做法,具體證書可能是拿U盤作為一個(gè)備份的載體,像我用的交通銀行的網(wǎng)上銀行就是采取的這種方式。

標(biāo)簽: nginx  https  linux技術(shù)  
x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */