1. 程式人生 > >nginx使用ssl模組配置https

nginx使用ssl模組配置https

前言

由於專案上用到小程式,而現在的小程式非常的嚴格,在開發的時候對接外部介面需要先新增稽核,還得是https協議,而不是htpp協議,對於很多JAVA Web開發人員來說,服務端大多使用時下流行的tomcat(預設是http),並且在虛擬伺服器使用nginx作請求轉發操作。因此,為了實現https訪問伺服器,我們可以配置nginx監聽htpps的預設埠,再進行轉發操作。

http與https

概念

  • HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。

  • HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

      HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

區別

  1. https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
  2. http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
  3. http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
  4. http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議的明文傳輸安全。
  5. http在網路速度上略快於https,https的快取不是很好,開銷比http多
  6. https在通訊前會有一個證書認證的過程,類似與websocket的第一次握手。

感覺除了安全之外,沒有啥子優勢(安全本身就是一個很大優勢)

生成ssl證書

# 1、首先,進入你想建立證書和私鑰的目錄,例如:
cd /etc/nginx/
# 2、建立伺服器私鑰,命令會讓你輸入一個口令:
openssl genrsa -des3 -out server.key 1024
# 3、建立簽名請求的證書(CSR):
openssl req -new -key server.key -out server.csr
# 4、在載入SSL支援的Nginx並使用上述私鑰時除去必須的口令: cp server.key server.key.org openssl rsa -in server.key.org -out server.key # 5、最後標記證書使用上述私鑰和CSR: openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

nginx編譯ssl模組(可選)

nginx配置ssl

#
# HTTPS server configuration
#
server {
    listen       443;
    server_name  本機的IP地址;

    ssl                  on;
    ssl_certificate      /etc/nginx/server.crt;
    ssl_certificate_key  /etc/nginx/server.key;

    ssl_session_timeout  5m;

#    ssl_protocols  SSLv2 SSLv3 TLSv1;
#    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#    ssl_prefer_server_ciphers   on;

    location / {
        #root   html;
        #index  testssl.html index.html index.htm;
     proxy_redirect off;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_pass http://IP地址/ssl/;
    }
}

http轉https

if ($server_port = 80) {
    return 301 https://$server_name$request_uri;
}
if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}
error_page 497 https://$server_name$request_uri;
#或者更直接點

server {  
    listen       80; 
    server_name www.xxx.com;  
    # 跳轉到HTTPS  
    return  301 https://$server_name$request_uri;  
}  

#下面是對請求的路徑進行定向
rewrite ^/test(.*)$ http://www.tiyee.net/home  permanent;

rewrite指令的最後一項引數為flag標記,支援flag標記有:
1.last 相當於apache裡面的[L]標記,表示rewrite。
2.break本條規則匹配完成後,終止匹配,不再匹配後面的規則。
3.redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址。
4.permanent 返回301永久重定向, 瀏覽器地址會顯示跳轉後的URL地址。

後記

  1. 使用301強制將https重定向到http在開發中用的非常多,但是我個人認為是不安全的,違背了https的規範。
  2. 推薦使用轉發操作到http

參考文章