將nginx上運行的http訪問的網站改造成https訪問


參考地址:原文:https://www.cnblogs.com/Faquir/p/10867984.html

感謝這位大佬。

 

1. 背景

我有個用於數據展示的網站使用nginx對外提供http訪問,另外一個系統用超鏈接的方式跳轉到我的網站提供給終端用戶訪問。后來對方說他們的站點是https訪問的,不能直接訪問http,所以需要我支持https訪問。

所以這里僅限於展示類網站的參考,交互式網站我也不會。

***對nginx的了解僅限於可以通過配置文件完成網站訪問的配置,其他沒有深入理解。***

2. 預備知識

https:

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本傳輸安全協議),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 

簡單來講就是網站中嵌入證書,用戶通過瀏覽器和網站服務器交互時數據會被加密,保證安全。

證書體系:

樹狀結構,可能有多層證書辦法機構,最頂層的叫根證書機構,持有根證書私鑰,可以簽發下一級證書,每個機構或者人使用的證書由證書頒發機構頒發,簡單來講就是用頒發機構的私鑰,對證書人的個人信息、公鑰等諸多信息做數字簽名,對外宣稱這個證書由他證明。證書可以公開訪問以驗證持有者身份,由頒發機構背書,證書對應私鑰由持有人持有,不對外公開,用於解密他人通過證書中公鑰加密的私密消息。

有點類似於公安機構對於身份證的頒發,全國總上層有一個公安部,負責所有省級公安廳的管理,省級負責市級,...,最終由派出所給個人頒發身份證,我們拿着身份證就可以對外證明自己的身份,因為有派出所的背書,而派出所又有上級、上上級一直到公安部的背書。不同的是我們的身份證里並沒有證書包含的那么多消息。

備注:證書依賴於公鑰加密體制,公鑰密碼體系包含公鑰、私鑰兩把密鑰,公鑰用戶加密、驗簽,私鑰用於解密、簽名。

3. 操作過程

3.1 證書生成

主要過程是:根證書 -->服務器證書,這里的服務器證書指的是我上面所提到需要添加https訪問的網站服務器,

1. 生成根證書私鑰、生成根證書請求、創建自簽發根證書,(紅色部分根據需要修改)

#生成根證書私鑰
openssl genrsa -out root.key 2048
 
#生成根證書請求
openssl req -new -key root.key -out root.csr
 
#用根證書私鑰自簽生成根證書
openssl x509 -req -in root.csr -extensions v3_ca -signkey root.key -out root.crt

  

這里根證書私鑰自簽證書的原因是,證書的格式都是一致的,需要有證書頒發簽發,因為根證書頒發機構沒有上級,所以根證書頒發機構給自己簽發證書,因此有需要大家都信任他。

2. 生成服務器證書私鑰、生成服務器證書請求、使用根證書私鑰簽發服務器證書,這里注意此服務器證書的commonName需要設置成nginx配置文件中的server_name,保持一致。

#生成服務器證書私鑰
openssl genrsa -out server.key 2048
 
#生成服務器證書請求
openssl  req -new -key server.key  -out server.csr
 
#生成服務器證書
openssl x509 -days 365 -req -in server.csr -extensions v3_req -CAkey root.key -CA root.crt -CAcreateserial -out server.crt -extfile openssl.cnf

  

這里有個openssl.cnf文件需要注意,里面描述了需要頒發的服務器證書的一些信息,內容如下,根據需要修改紅色內容(看不懂的不用管

 

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = CN
countryName_default = CN
stateOrProvinceName = Guangdong
stateOrProvinceName_default = Guangdong
localityName = Shenzhen
localityName_default = Shenzhen
organizationalUnitName  = xxx
organizationalUnitName_default  = xxx
commonName = xxx.com(對應簽名說的nginx配置文件中的server_name)
commonName_max  = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

3.2 nginx配置

打開nginx配置中HTTPS server部分的注釋,修改server_name、ssl_certificate、ssl_certificate_key、location中的root等字段。

... 
   # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  xxx.com(網址訪問地址);

    ssl on;
        ssl_certificate      xxx.crt(服務器證書);
        ssl_certificate_key  xxx.key(服務器證書私鑰);

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   xxx(前端代碼目錄);
            index  index.html index.htm;
        }
    }
...

  

啟動nginx,即可對外提供服務了。

3.3 瀏覽器訪問

到現在我們已經在服務器端配置了https訪問,但是瀏覽器訪問的時候會提示證書錯誤,因為瀏覽器現在還不認識我們的證書,不確定它是不是安全的。就像我們都拿着公安部頒發的身份證去證明身份沒問題,但是你拿着自己頒發的一個身份證去證明別人就不一定會信了,因為沒人知道你的頒發機構是什么情況。

所以我們要把服務器證書的頒發機構,即我們上面生成的根證書添加到瀏覽器的信任列表中,具體操作方法:如果是windows系統,可以直接雙擊根證書文件,點擊安裝,安裝到受信任的根證書頒發機構,這時候就可以順利訪問了。

 

 

#user  nobody;
worker_processes  16;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  120;

    #gzip  on;

    proxy_connect_timeout 120;
    proxy_read_timeout 120;
    proxy_send_timeout 120;
    proxy_buffer_size 128k;
    proxy_buffers 8 128k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;
    proxy_temp_path /data/soft/nginx/temp_dir;
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=800r/s;	

    upstream HOST_dl { 
          #sticky;
          server 10.150.82.121:10082;
          server 10.150.82.123:10082;
		  ip_hash;
    }
	
    upstream HOST_im { 
          server 10.150.82.121:10083;
          server 10.150.82.123:10083;
    }
	

    server {
        listen      10081;
        server_name  localhost;
        
        #charset GBK;

        #access_log  logs/host.access.log  main;
		
		
        location ^~/dl/ {
            return 301 https://$host:9000$request_uri;
        }


        location ^~/im {
            proxy_pass http://HOST_im;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host       $host:10081;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size    10m;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
	
	
	server {
        listen      9000;
        server_name  localhost;
        
        #charset GBK;

        #access_log  logs/host.access.log  main;
		
		location / {
            root   html;
            index  index.html index.htm;
			error_page 404 /dl-app/;
        }
		
		location ^~/api/{
			rewrite ^/api/(.*)$ /dl/$1 break;
			proxy_pass http://HOST_dl;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host       $host:10081;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size    10m;
            limit_req zone=mylimit burst=800;
       }
    }
	
	
	server {
        listen       9001 ssl;
        server_name  localhost;

        ssl_certificate      ssl/root.crt;
        ssl_certificate_key  ssl/root.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location ^~/dl/ {
            proxy_pass http://HOST_dl;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host       $host:10081;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size    10m;
            limit_req zone=mylimit burst=800;
        }


        location ^~/im {
            proxy_pass http://HOST_im;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host       $host:10081;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size    10m;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
	
	
	server {
        listen       9002 ssl;
        server_name  localhost;

        ssl_certificate      ssl/root.crt;
        ssl_certificate_key  ssl/root.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        
        #charset GBK;

        #access_log  logs/host.access.log  main;
		
		location / {
            root   html;
            index  index.html index.htm;
			error_page 404 /dl-app/;
        }
		
		location ^~/api/{
			rewrite ^/api/(.*)$ /dl/$1 break;
			proxy_pass http://HOST_dl;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host       $host:10081;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size    10m;
            limit_req zone=mylimit burst=800;
       }
       
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM