nginx如何將http訪問的網站改成https訪問
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 = Guizhou stateOrProvinceName_default = Guizhou localityName = Guizhou localityName_default = Guizhou organizationalUnitName = (如果網頁訪問是ip就寫ip,如果是域名就寫域名) organizationalUnitName_default = (如果網頁訪問是ip就寫ip,如果是域名就寫域名) commonName = (如果網頁訪問是ip就寫ip,如果是域名就寫域名) 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系統,可以直接雙擊根證書文件,點擊安裝,安裝到受信任的根證書頒發機構,這時候就可以順利訪問瞭。
以上就是nginx如何將http訪問的網站改成https訪問的詳細內容,更多關於nginx http訪問改成https訪問的資料請關註WalkonNet其它相關文章!