Nginx如何支持HTTPS?手把手教會你每一步操作都賊簡單

推薦閱讀:

隨着我們網站用戶的增多,我們會逐漸意識到HTTPS加密的重要性。在不修改現有代碼的情況下,要從HTTP升級到HTTPS,讓Nginx支持HTTPS是個很好的選擇。今天我們來講下如何從Nginx入手,從HTTP升級到HTTPS,同時支持靜態網站和SpringBoot應用,希望對大家有所幫助!

生成SSL自簽名證書

雖然自簽名證書瀏覽器認爲並不是安全的,但是學習下SSL證書的生成還是很有必要的!

  • 首先創建SSL證書私鑰,期間需要輸入兩次用戶名和密碼,生成文件爲blog.key
openssl genrsa -des3 -out blog.key 2048
  • 利用私鑰生成一個不需要輸入密碼的密鑰文件,生成文件爲blog_nopass.key
openssl rsa -in blog.key -out blog_nopass.key
  • 創建SSL證書籤名請求文件,生成SSL證書時需要使用到,生成文件爲blog.csr
openssl req -new -key blog.key -out blog.csr
  • 在生成過程中,我們需要輸入一些信息,需要注意的是Common Name需要和網站域名一致;
Enter pass phrase for blog.key:
-----
Country Name (2 letter code) [XX]:CN                                         # 國家代碼
State or Province Name (full name) []:jiangsu                                # 省份
Locality Name (eg, city) [Default City]:jiangsu                              # 城市
Organization Name (eg, company) [Default Company Ltd]:macrozheng             # 機構名稱
Organizational Unit Name (eg, section) []:dev                                # 單位名稱
Common Name (eg, your name or your server's hostname) []:blog.macrozheng.com # 網站域名
Email Address []:[email protected]                                           # 郵箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                                                     # 私鑰保護密碼,可以不輸入直接回車
An optional company name []:                                                 # 可選公司名稱,可以不輸入直接回車
  • 生成SSL證書,有效期爲365天,生成文件爲blog.crt
openssl x509 -req -days 365 -in blog.csr -signkey blog.key -out blog.crt
  • 其實最終有用的文件是兩個,一個是證書文件blog.crt,另一個是不需要輸入密碼的證書私鑰文件blog_nopass.key

Nginx支持HTTPS

SSL證書生成好了,接下來我們就可以配置Nginx來支持HTTPS了!

安裝Nginx

  • 我們還是使用在Docker容器中安裝Nginx的方式,先下載Nginx的Docker鏡像;
docker pull nginx:1.10
  • 下載完成後先運行一次Nginx,由於之後我們要把宿主機的Nginx配置文件映射到Docker容器中去,運行一次方便我們拷貝默認配置;
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-d nginx:1.10
  • 運行成功後將容器中的Nginx配置目錄拷貝到宿主機上去;
docker container cp nginx:/etc/nginx /mydata/nginx/
  • 將宿主機上的nginx目錄改名爲conf,要不然/mydata/nginx/nginx這個配置文件目錄看着有點彆扭;
mv /mydata/nginx/nginx /mydata/nginx/conf
  • 創建的Nginx容器複製完配置後就沒用了,停止並刪除容器;
docker stop nginx
docker rm nginx
  • 使用Docker命令重新啓動Nginx服務,需要映射好配置文件,由於我們要支持HTTPS,還需要開放443端口。
docker run -p 80:80 -p 443:443 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10

配置支持HTTPS

  • 將我們生成好的SSL證書和私鑰拷貝到Nginx的html/ssl目錄下;
cp blog_nopass.key /mydata/nginx/html/ssl/
cp blog.crt /mydata/nginx/html/ssl/
  • 接下來我們需要給blog.macrozheng.com這個域名添加HTTPS支持,在/mydata/nginx/conf/conf.d/目錄下添加Nginx配置文件blog.conf,配置文件內容如下;
server {
    listen       80; # 同時支持HTTP
    listen       443 ssl; # 添加HTTPS支持
    server_name  blog.macrozheng.com;
  
    #SSL配置
    ssl_certificate      /usr/share/nginx/html/ssl/blog/blog.crt; # 配置證書
    ssl_certificate_key  /usr/share/nginx/html/ssl/blog/blog_nopass.key; # 配置證書私鑰
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL協議版本
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置SSL加密算法
    ssl_prefer_server_ciphers  on; # 優先採取服務器算法
    ssl_session_cache    shared:SSL:10m; # 配置共享會話緩存大小
    ssl_session_timeout  10m; # 配置會話超時時間

    location / {
        root   /usr/share/nginx/html/www;
        index  index.html index.htm;
    }

    location /admin {
        alias   /usr/share/nginx/html/admin;
        index  index.html index.htm;
    }

    location /app {
        alias   /usr/share/nginx/html/app;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 通過HTTPS訪問blog.macrozheng.com這個域名,由於我們使用的是自己簽名的SSL證書,瀏覽器會提示您的連接不是私密連接,點擊繼續前往可以通過HTTPS正常訪問;
  • 我們可以查看下證書的頒發者信息,可以發現正好是之前我們創建SSL證書籤名請求文件時錄入的信息;
  • 接下來我們需要給api.macrozheng.com這個域名添加HTTPS支持,通過這個域名可以使用HTTPS訪問我們的SpringBoot應用,api.crtapi_nopass.key文件需要自行生成,在/mydata/nginx/conf/conf.d/目錄下添加Nginx配置文件api.conf,配置文件內容如下;
server {
    listen       80; # 同時支持HTTP
    listen       443 ssl; # 添加HTTPS支持
    server_name  api.macrozheng.com; #修改域名

    #ssl配置
    ssl_certificate      /usr/share/nginx/html/ssl/api/api.crt; # 配置證書
    ssl_certificate_key  /usr/share/nginx/html/ssl/api/api_nopass.key; # 配置證書私鑰
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL協議版本 # 配置SSL加密算法
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers  on; # 優先採取服務器算法
    ssl_session_cache    shared:SSL:10m; # 配置共享會話緩存大小
    ssl_session_timeout  10m; # 配置會話超時時間

    location / {
        proxy_pass   http://192.168.3.101:8080; # 設置代理服務訪問地址
        proxy_set_header  Host $http_host; # 設置客戶端真實的域名(包括端口號)
        proxy_set_header  X-Real-IP  $remote_addr; # 設置客戶端真實IP
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; # 設置在多層代理時會包含真實客戶端及中間每個代理服務器的IP
        proxy_set_header X-Forwarded-Proto $scheme; # 設置客戶端真實的協議(http還是https)
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 任意調用一個接口測試下,比如說登錄接口,可以發現已經可以通過HTTPS正常訪問SpringBoot應用提供的接口。

使用受信任的證書

之前我們使用的是自簽名的SSL證書,對於瀏覽器來說是無效的。使用權威機構頒發的SSL證書瀏覽器纔會認爲是有效的,這裏給大家推薦兩種申請免費SSL證書的方法,一種是從阿里雲申請,另一種是從FreeSSL申請。

阿里雲證書

  • 阿里雲上可以申請的免費證書目前只有支持單個域名的DV級SSL證書。比如說你有blog.macrozheng.comapi.macrozheng.com兩個二級域名需要使用HTTPS,就需要申請兩個SSL證書。
  • 申請成功後點擊下載Nginx證書即可;
  • 下載完成後解壓會有下面兩個文件;
blog.macrozheng.com.key # 證書私鑰文件
blog.macrozheng.com.pem # 證書文件
  • 拷貝證書文件到Nginx的指定目錄下,然後修改配置文件blog.conf,只要修改證書配置路徑即可,修改完成後重啓Nginx;
#SSL配置
ssl_certificate      /usr/share/nginx/html/ssl/blog/blog.macrozheng.com.pem; # 配置證書
ssl_certificate_key  /usr/share/nginx/html/ssl/blog/blog.macrozheng.com.key; # 配置證書私鑰
  • 再次通過HTTPS訪問blog.macrozheng.com這個域名,發現證書已經有效了,連接也是安全的了。

FreeSSL證書

  • 如果你有使用通配符域名的需求,可以上FreeSSL申請SSL證書,不過免費的有效期只有3個月,這就意味着你過3個月就要重新申請一次了。

使用acme.sh自動申請證書

  • acme.sh腳本實現了acme協議, 可以從letsencrypt生成免費的證書。一般我們申請的證書有效期都是1年,過期就要重新申請了,使用acme.sh腳本可以實現到期自動申請,再也不用擔心證書過期了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章