Nginx開啓SSL支持HTTPS訪問(自簽名方法)

 

超文本傳輸安全協議(縮寫:HTTPS,英語:Hypertext Transfer Protocol Secure)是超文本傳輸協議和SSL/TLS的組合,用以提供加密通訊及對網絡服務器身份的鑑定。HTTPS連接經常被用於萬維網上的交易支付和企業信息系統中敏感信息的傳輸。HTTPS不應與在RFC 2660中定義的安全超文本傳輸協議(S-HTTP)相混。

HTTPS 目前已經是所有注重隱私和安全的網站的首選,隨着技術的不斷髮展,HTTPS 網站已不再是大型網站的專利,所有普通的個人站長和博客均可以自己動手搭建一個安全的加密的網站。如果訪問的一個網站沒有加密,那麼你輸入的所有帳號密碼都是明文傳輸,可以被攔截讀取,因此在涉及到隱私和金融等高保密環境,是必須要使用HTTPS加密的。

目前對我們來說證書有兩種方式:

  • 一種是自簽名證書,一種是經過各大瀏覽器系統認證支持的CA證書,如果使用自簽名證書,雖然數據傳輸仍然是加密的,但是在用戶瀏覽器上,會彈出證書錯誤提示因此最好還是使用第三方認證的SSL 證書。
  • 目前對我們來說還是有一些免費證書機構提供這個認證的,比如Let’s Encrypt 的免費證書,雖然要3個月重籤一次,不過是一直免費的,Let's Encrypt是國外一個公共的免費SSL項目,由 Linux 基金會託管,它的來頭不小,由Mozilla、思科、Akamai、IdenTrust和EFF等組織發起,目的就是向網站自動簽發和管理免費證書,以便加速互聯網由HTTP過渡到HTTPS。
  • 當然如果你網站是商業用的要求有穩定的HTTPS安全環境,其實是可以買商用的SSL證書的,比如GODADDY的SSL也不貴。
  • 更多Nginx攻略:https://www.bnxb.com/nginx/

自簽名方式

如需要受瀏覽器信任的證書安裝方式,可以看這裏:Nginx開啓SSL支持HTTPS訪問(使用Let's Encrypt免費證書)

先教你自簽名的方式,雖然這個很雞肋,在有免費證書可以用的情況下,基本沒人用了:

1、首先機器上要安裝openssl和openssl-devel

#yum install openssl
#yum install openssl-devel

2、自己頒發證書給自己

①進入目錄

#cd /usr/local/nginx/conf

②創建服務器RSA私鑰,命令會讓你輸入一個口令:

#openssl genrsa -des3 -out server.key 1024

③創建簽名請求的證書(CSR):這裏會提示輸入省份(State / Province)、城市(City)、域名信息等,重要的是,email一定要是你的域名後綴的。這樣就有一個 csr 文件了,提交給 ssl 提供商的時候就是這個 csr 文件。當然我這裏並沒有向證書提供商申請,下一步我們自己簽發了證書。

#openssl req -new -key server.key -out server.csr

④在加載SSL支持的Nginx並使用上述私鑰時除去必須的口令:

#openssl rsa -in server.key -out server_nopwd.key

⑤標記證書使用上述私鑰和CSR:

#openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt

到這裏證書已經生成完畢。

3、配置nginx,修改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。

  • 另外如果出現“[emerg] 10464#0: unknown directive “ssl” in /usr/local/nginx-0.6.32/conf/nginx.conf:74”則說明沒有將ssl模塊編譯進nginx,在編譯configure的時候需加上"–with-http_ssl_module"。
  • 另外還可以加入如下代碼實現80端口301重定向到443,
server {
  listen 80;
  server_name www.bnxb.com;
  rewrite ^(.*) https://$server_name$1 permanent;
}

到這裏就配置完成,可以用https://www.bnxb.com這種方式訪問你的網站了,但是因爲這裏是自簽名證書,瀏覽器沒辦法驗證證書真僞,因此如果要去除瀏覽器訪問的證書錯誤提示,可以把之前生成的server.crt文件使用winscp之類的SSH下載軟件下載下來,導入到你電腦系統的證書管理器就行了,具體方法:控制面板 -> Internet選項 -> 內容 -> 發行者 -> 受信任的根證書頒發機構 -> 導入 -》選擇server.crt。

  • 注意 https訪問的是443端口,所以iptables要放開這個口,纔可以。

只針對註冊、登陸進行https加密處理

既然HTTPS能保證安全,爲什麼全世界大部分網站都仍舊在使用HTTP呢?使用HTTPS協議,對服務器來說是很大的負載開銷。從性能上考慮,我 們無法做到對於每個用戶的每個訪問請求都進行安全加密(當然,Google這種大神除外)。作爲一個普通網站,我們所追求的只是在進行交易、密碼登陸等操 作時的安全。通過配置Nginx服務器,可以使用rewrite來做到這一點。

在https server下加入如下配置:

if ($uri !~* "/logging.php$")
{
    rewrite ^/(.*)$ http://$host/$1 redirect;
}

在http server下加入如下配置:

if ($uri ~* "/logging.php$")
{
    rewrite ^/(.*)$ https://$host/$1 redirect;
}

這樣一來,用戶會且只會在訪問logging.php的情況下,纔會通過https訪問。

  • 更新:
    • 有一些開發框架會根據 $_SERVER['HTTPS'] 這個 PHP 變量是否爲 on 來判斷當前的訪問請求是否是使用 https。爲此我們需要在 Nginx 配置文件中添加一句來設置這個變量。遇到 https 鏈接重定向後會自動跳到 http 問題的同學可以參考一下。
server {
    ...
    listen 443;
    location \.php$ {
        ...
        include fastcgi_params;
        fastcgi_param HTTPS on; # 多加這一句
    }
}

server {
    ...
    listen 80;
    location \.php$ {
        ...
        include fastcgi_params;
    }
}

完畢。

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