nginx配置ssl證書,從HTTP升級到HTTPS

什麼是 HTTP

超文本傳輸​​協議(HTTP)是用於傳輸諸如HTML的超媒體文檔的應用層協議。javascript

它被設計用於Web瀏覽器和Web服務器之間的通訊,但它也能夠用於其餘目的。 HTTP遵循經典的客戶端-服務端模型,客戶端打開一個鏈接以發出請求,而後等待它收到服務器端響應。 HTTP是無狀態協議,意味着服務器不會在兩個請求之間保留任何數據(狀態)。該協議雖然一般基於TCP / IP層,但能夠在任何可靠的傳輸層上使用;也就是說,一個不會像UDP協議那樣靜默丟失消息的協議。RUDP做爲UDP的可靠的升級版本,是一種合適的替代選擇。php

什麼是 HTTPS

超文本傳輸安全協議(HyperText Transfer Protocol Secure,縮寫:HTTPS;常稱爲HTTP over TLS、HTTP over SSL或HTTP Secure)是一種經過計算機網絡進行安全通訊的傳輸協議。css

HTTPS經由HTTP進行通訊,但利用SSL/TLS來加密數據包。HTTPS開發的主要目的,是提供對網站服務器的身份認證,保護交換數據的隱私與完整性。這個協議由網景公司(Netscape)在1994年首次提出,隨後擴展到互聯網上。html

歷史上,HTTPS鏈接常常用於萬維網上的交易支付和企業信息系統中敏感信息的傳輸。在2000年代末至2010年代初,HTTPS開始普遍使用,以確保各種型的網頁真實,保護帳戶和保持用戶通訊,身份和網絡瀏覽的私密性。vue

另外,還有一種安全超文本傳輸協議(S-HTTP)的HTTP安全傳輸實現,可是HTTPS的普遍應用而成爲事實上的HTTP安全傳輸實現,S-HTTP並無獲得普遍支持。java

HTTPS的做用

HTTPS的主要做用是在不安全的網絡上建立一個安全信道,並可在使用適當的加密包和服務器證書可被驗證且可被信任時,對竊聽和中間人攻擊提供合理的防禦。node

HTTPS的信任基於預先安裝在操做系統中的證書頒發機構(CA)。所以,到一個網站的HTTPS鏈接僅在這些狀況下可被信任:nginx

  1. 瀏覽器正確地實現了HTTPS且操做系統中安裝了正確且受信任的證書頒發機構;
  2. 證書頒發機構僅信任合法的網站;
  3. 被訪問的網站提供了一個有效的證書,也就是說它是一個由操做系統信任的證書頒發機構簽發的(大部分瀏覽器會對無效的證書發出警告);
  4. 該證書正確地驗證了被訪問的網站(例如,訪問https://example.com時收到了簽發給example.com而不是其它域名的證書);
  5. 此協議的加密層(SSL/TLS)可以有效地提供認證和高強度的加密。

HTTPS和HTTP的區別

超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就能夠直接讀懂其中的信息,所以HTTP協議不適合傳輸一些敏感信息,好比信用卡號、密碼等。 爲了解決HTTP協議的這一缺陷,須要使用另外一種協議:安全套接字層超文本傳輸協議HTTPS。爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。 HTTPS和HTTP的區別主要爲如下四點:git

  1. https協議須要到ca申請證書,通常免費證書不多,須要交費。
  2. http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議。
  3. http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
  4. http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

HTTP鏈接是如何創建的

HTTP 在傳輸層之上,是依靠於 TCP 鏈接的。也就是說先創建起 TCP 鏈接,創建好鏈接以後雙方之間才能傳輸數據。也就是說,想按照規定的格式傳輸數據,就須要先創建 TCP 鏈接。那 TCP 鏈接是怎麼創建起來的呢。github

TCP 鏈接的三次握手:

  1. 向對方發送一個創建鏈接的請求。咱們在瀏覽器上輸入了要訪問的網站地址以後,瀏覽器會向 DNS 服務器請求這個域名對應的 IP 地址,拿到 IP 地址就至關於知道了對方的位置。咱們就能夠向他發送一個創建鏈接的請求,同時本身也作好了要創建鏈接的「準備」。

  2. 回覆客戶端的請求。對方機器一直在等待着其餘人跟本身創建鏈接,等啊等,忽然收到了你要創建鏈接的請求,興奮不已,馬上回復你,說:我收到了你要創建鏈接的請求啦,我也準備好要創建鏈接啦。

  3. 你收到這個消息以後必定要回復它,說:好的,我知道你也作好了創建鏈接的準備啦,我們開始發送數據吧。

爲何必定要回復他呢,由於他不肯定你是否收到了他的確認請求,若是你不回覆,他會覺得你這個創建請求的消息是假的,是過時了的,就不會創建鏈接。當他收到你的回覆以後,就明確的知道了你確實要創建鏈接,也知道了你準備好了鏈接的創建,再以後就能夠按照 HTTP 的格式傳輸數據了。在這個過程當中的第三步時,就是你發送確認消息的那個數據包中,能夠將須要傳輸的數據一併塞進去的。在重複一次,你先發一個創建鏈接的請求,他接收後回覆一個收到,創建吧,你收到他的回覆,在向他回覆一個知道啦。這時,大家之間 TCP 鏈接就已經創建好了。接下來,你就能夠按照 HTTP 向他發送請求,好比說要某一個圖片,他收到請求後就會給你發過來一個圖片,固然,大家之間是明文傳輸的。

HTTPS 鏈接是如何創建的

那 HTTPS 是如何創建鏈接的呢,怎麼商量好加密密碼的呢?HTTPS 同 HTTP 同樣,首先創建起 TCP 鏈接,可是創建好以後並非當即發出請求,索要具體的資源,而是先和對方商量加密的密碼。商量的加密密碼的過程就是創建 TSL 鏈接的過程。其實並無創建真實的鏈接,只是在剛剛創建好的 TCP 鏈接上,包裹上一層加密協議而已。可是也被形象的稱做鏈接創建。

具體創建方式以下:

  1. 客服端發給服務器一個HELLO包,裏面有我支持的加密協議列表。
  2. 服務器收到後發送也給客戶端發送一個HELLO數據包,數據包內包涵服務器挑選的加密算法,還包含本身的數字證書信息。你拿到他的數字證書信息以後就須要去向 CA 校驗證書,校驗成功後也知道了對方的公鑰,就該通知服務器,咱們之後對稱加密的密碼是多少,固然,這個密碼是要用公鑰加密的。在這條消息發送以前,客戶端會先發送一條消息,告訴服務器,我下一個消息將使用你剛剛挑選的加密協議進行加密了,下一個消息是加密後的哦,不要搞錯。
  3. 以後將對稱加密的密文發給服務器。服務器接收到以後,會根據對稱密鑰生成一系列複雜的加密算法,在傳輸給客服端,客戶端收到後會給服務器發送一個 Finished Message ,服務器收到消息後也回一個 Finished Message。
  4. 這時,咱們終於完成了加密的準備工做,一切加密方式和密鑰都商量好了,終於能夠傳輸數據了。至此,TSL 創建鏈接的過程結束。

升級步驟

個人nginx版本是:nginx version: nginx/1.10.3 (Ubuntu)

個人nginx目錄結構,nginx安裝

feihong@iZuf69ng9hibpqjrdkb660Z:/etc/nginx$ ls 
cert          fastcgi_params  mime.types    scgi_params      snippets
conf.d        koi-utf         nginx.conf    sites-available  uwsgi_params
fastcgi.conf  koi-win         proxy_params  sites-enabled    win-utf
複製代碼

獲取證書

個人服務器是阿里雲的,那就從阿里雲的雲盾中得到SSL證書

點擊購買證書

選擇免費型DV SSL點擊當即購買

返回控制檯能夠看見一個未簽發的證書,申請簽發

填寫申請和驗證信息(申請經過要等一會時間)

經過後,證書已簽發

下載證書

兩個證書分別是*.pem和*.key

打開兩個證書後,發現裏面都是密鑰

*.key: 證書的私鑰文件

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAi1M5kieXbIDTCJwyWWif8g/JCEpwOv2m2nyHPa32j4GtQgAV
2Vc7osTG/rx2UFkmin2RWT8Lb13UQe3vKEvZi0HcXH1ef8MVymyR/M1H8+D9mQ5q
……
rtClNTkCgYB18MoPDYFFp8lcMFL4joIcmQTgRlZN7ZYwj0TEa+e2UemqkrxN8XyO
P5xniOvmacFt3SxoDLjQoVOmmS1B0QdXP24y+b1+vIfG8ZQ3grNU0Nq2PyXRe7TR
CaGaIY+5DXwoPjzPvfbWKIuMwthyAeyddW4XzO9/9c2Ugrr0s6AWkQ==
-----END RSA PRIVATE KEY-----
~                                          
複製代碼

*.pem:是證書文件

-----BEGIN CERTIFICATE-----
MIIFnTCCBIWgAwIBAgIQBLNEzXnEO46h+mG3ixM+AzANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
……
1/MtB1NyBlHxBrJQJVKxOLiS/4rzjV3UsQvOz5maM5gBzd3/NPIIU/gBIeK4vgSk
1w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
……
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==

複製代碼

打開443端口

登陸阿里雲,找到安全組,添加規則,給443端口開放對外訪問權限(不要像我是的,最後出現問題的根源就是這個)。

服務器中放置證書

/etc/nginx/cert/中放置下載來的兩個證書文件

nginx.conf

從nginx.conf中咱們能夠發現其導入了/etc/nginx/conf.d/*.conf/etc/nginx/sites-enabled/*

這說明須要在這兩處將server寫進去,固然分開最好,避免耦合

/etc/nginx/conf.d/文件夾中的default.conf文件,就是寫一些http的服務

/etc/nginx/sites-enabled/的文件夾下寫一些https的服務

# nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
複製代碼

sites-available

在sites-available中添加qiufeihong.top文件

ssl_certificate和ssl_certificate_key將兩個證書文件導入

前者服務是https

後者是http,重定向會https

# qiufeihong.top

server {
listen 443 ssl;
server_name www.qiufeihong.top;
ssl on;
ssl_certificate /etc/nginx/cert/2476067_www.qiufeihong.top.pem;
ssl_certificate_key /etc/nginx/cert/2476067_www.qiufeihong.top.key;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
        proxy_pass http://127.0.0.1:7777;
        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_headers_hash_max_size 51200;
        proxy_headers_hash_bucket_size 6400;
}
}
server {
listen 80;
server_name www.qiufeihong.top;
rewrite ^(.*)$ https://$host$1 permanent;
}
複製代碼

而且,須要將conf.d文件夾中的default.conf中的關於博客的配置的代碼將其刪除,不然nginx重啓配置時,會報兩個同名服務的錯誤。

server
        {
                listen  80;
                server_name www.qiufeihong.top;
                location / {
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://127.0.0.1:7777;
                }

        }
複製代碼

sites-enabled

創建軟連接

sudo ln sites-available/qiufeihong.top sites-enabled/qiufeihong.top

複製代碼

在sites-enabled中就能看到qiufeihong.top

重啓nginx

sudo nginx -t

 sudo nginx -s reload
複製代碼

登陸網站出現了一把關閉的鎖

參考文獻

nginx配置ssl證書實現https訪問

SSL證書安裝指南

Nginx/Tengine服務器安裝SSL證書

HTTP 升級到 HTTPS 基礎知識詳解

阿里雲服務器nginx配置ssl證書,給網站添加https

最後,別忘了給這個項目點一個star哦,謝謝支持。

blog

一個學習編程技術的公衆號。天天推送高質量的優秀博文、開源項目、實用工具、面試技巧、編程學習資源等等。目標是作到我的技術與公衆號一塊兒成長。歡迎你們關注,一塊兒進步,走向全棧大佬的修煉之路

相關文章
相關標籤/搜索