為蘋果ATS和微信小程式搭建 Nginx + HTTPS 服務

来源:http://www.cnblogs.com/zhouzme/archive/2017/01/22/6340258.html
-Advertisement-
Play Games

昨天測試開發微信小程式,才發現微信也要求用HTTPS加密數據,想來是由於之前蘋果的ATS審核政策的緣故吧,微信想在蘋果上開放小程式必然也只能要求開發者必須使用HTTPS了,於是在伺服器上測試安裝Nginx+HTTPS服務。 安裝 HTTPS 最麻煩的問題應該就是獲取證書了,證書感覺種類也挺複雜的,有 ...


昨天測試開發微信小程式,才發現微信也要求用HTTPS加密數據,想來是由於之前蘋果的ATS審核政策的緣故吧,微信想在蘋果上開放小程式必然也只能要求開發者必須使用HTTPS了,於是在伺服器上測試安裝Nginx+HTTPS服務。

安裝 HTTPS 最麻煩的問題應該就是獲取證書了,證書感覺種類也挺複雜的,有好幾種,單域、泛域、多域。。。還有個種標準亂七八糟的感覺,而且收費很高,還是每年買的。

現在各個雲服務商也都有提供各種基礎功能的免費證書,但似乎很多只對單域免費,這裡的單域是指每個二級功能變數名稱都算是一個功能變數名稱,每個二級功能變數名稱都需要單獨配置證書。

我使用的是免費的 Let's encrypt 證書,支持蘋果ATS標準。

https://letsencrypt.org/
Let's Encrypt 項目旨在讓每個網站都能使用 HTTPS 加密,該項目獲得了 Mozilla、思科、Akamai、IdenTrust 和 EFF 等組織的支持, 由 Linux 基金會托管

我用的是阿裡雲的伺服器,操作系統版本:CentOS7.0

提醒:在一切開始前,需要先註意看看伺服器剩餘記憶體,我一開始用的是最低配的測試伺服器,剩餘可用記憶體只有70MB左右,結果伺服器直接掛了,所以最好先騰出個300MB記憶體再來。

另外,就是伺服器必須綁定功能變數名稱且是外網可以直接訪問的才行,若是內網或虛擬機上是不行的,因為證書安裝時需要通過功能變數名稱訪問數據的,否則不能生成證書。


SSL labs 最終配置測試結果,
為蘋果ATS和微信小程式搭建 Nginx + HTTPS 服務

好了,下麵上配置流程:


一、升級系統 OpenSSL 版本

我第一次安裝時使用的 OpenSSL 還是系統預設安裝版本 1.0.1e,安裝完後在 SSL labs 測試安全性居然是個 F 等級,於是升級到1.1.0c 之後變成了A,不過後來看了很多文章後,發現大家推薦使用的是 1.0.2j 版本,據說是因為 1.1 官方支持是到 2018年,而且很多軟體還不能相容,1.0.2 是支持到2019年的。至於實際用哪個看你的其他需求了。。。

為蘋果ATS和微信小程式搭建 Nginx + HTTPS 服務

wget https://www.openssl.org/source/openssl-1.1.0c.tar.gz
tar -zxvf openssl-1.1.0c.tar.gz 
cd openssl-1.1.0c/
./config --prefix=/usr shared zlib
make 
make install

二、修改Nginx配置以支持 .well-known 目錄的訪問

證書安裝時會在網站根目錄下自動生成 .well-known 目錄,必須讓外網能夠訪問該目錄下的文件才行,否則會認證失敗。

對於 Nginx 的版本,我測試時使用過的最低版本是 nginx1.8.1,建議使用當前最新的穩定版 nginx1.10.2

如果之前 nginx.conf 中存在類似下麵的規則

    location ~ /\. {
        deny all;
    }

需要增加下麵配置:註意,因為後面證書還需要自動續期,所以這個配置後面還是需要用到的,不能刪除。

    location ~ /.well-known {
        allow all;
    }

三、安裝 certbot-auto

1, 需要先安裝 epel
yum install epel-release

2, 先修改為使用國內的 pip 源
```mkdir ~/.pip
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = https://pypi.doubanio.com/simple/

[install]
trusted-host=pypi.doubanio.com
EOF


3, 安裝 certbot 依賴包

mkdir /usr/local/certbot
cd /usr/local/certbot
wget https://dl.eff.org/certbot-auto --no-check-certificate
chmod +x ./certbot-auto
./certbot-auto -n

安裝時錯誤:

Delta RPMs disabled because /usr/bin/applydeltarpm not installed

![為蘋果ATS和微信小程式搭建 Nginx + HTTPS 服務](http://img.blog.csdn.net/20170122140144795?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXptZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
解決方法:

yum provides '*/applydeltarpm'
yum install deltarpm

安裝依賴的時候會下載大量包可能看著沒動靜,註意top看看是否有python的進程在跑

我安裝完後,出現下麵信息,可以直接忽略的,沒有問題的

> Saving debug log to /var/log/letsencrypt/letsencrypt.log
Missing command line flags. For non-interactive execution, you will need to specify a plugin on the command line.  Run with '--help plugins' to see a list of options, and see https://eff.org/letsencrypt-plugins for more detail on what the plugins do and how to use them.

####四、生成證書

> 生成證書,有多種方式,選擇你需要的一種
[email protected] 為管理員的郵箱,請先替換為您的郵箱地址

1. 網站一個功能變數名稱的證書

./certbot-auto certonly --email [email protected] --agree-tos --webroot -w /home/wwwroot/yourwebsite -d www.yourdomain.com


2. 一個網站多個功能變數名稱只生成一個證書

./certbot-auto certonly --email [email protected] --agree-tos --webroot -w /home/wwwroot/yourwebsite -d www.yourdomain.com -d m.yourdomain.com


3. 多個網站多個功能變數名稱生成多個證書

./certbot-auto certonly --email [email protected] --agree-tos --webroot -w /home/wwwroot/yourwebsite -d www.yourdomain.com -d m.yourdomain.com -w /home/wwwroot/myanotherwebsite -d www.aotherdomain.com -d www.aotherdomain.com


出現下麵信息就安裝好了

> IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.youqumob.com/fullchain.pem. Your cert
   will expire on 2017-04-19. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:
>
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le


查看生成的證書,檢查是否存在對應功能變數名稱的密鑰文件

ll /etc/letsencrypt/live/


> 我們需要給Nginx配置用的文件為:
fullchain.pem - 證書文件
privkey.pem - 私鑰文件


####五、給Nginx添加SSL證書



> HTTP 預設埠是 80,所以使用 http 時我們無須輸入埠號,HTTPS 預設的埠是 443,所以現在使用 https 不輸入埠號,實際上是使用的 443 埠了
修改你的網站配置文件,下麵以 nginx.conf 為例

vi nginx.conf

> 如果你原來的網站還允許 http 訪問,那就先複製一份再來修改,如果直接全部使用https 則直接修改
下麵展示需要修改的主要配置代碼

server {
listen 443 ssl;
# 如果你的伺服器支持ipv6,可開啟下麵這一行
# listen [::]:443 ssl http2;
server_name www.yourdomain.com;

# SSL 驗證配置
ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
# 預設值
ssl_ciphers HIGH:!aNULL:!MD5;
# 據說這個相容 ie6 xp , 但實際測試發現根本打不開網頁啊
#ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
#ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
#ssl_ciphers "EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
#ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

# 下麵還是你原來的其他配置...

}


> 對於 ssl_ciphers 這個參數的配置實在是沒搞明白,網上找了半天也沒有找到能說清楚具體怎麼配置的,上面的幾種都是網上看到的比較多的幾種寫法,也感覺不出來有什麼區別,最後我還是使用的預設配置了。

修改保存後記得先測試下配置是否正確

nginx -t
nginx -s reload


####六、開啟防火牆443埠允許外部訪問

vi /etc/sysconfig/iptables

添加一行

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT


重啟防火牆

現在打開網站測試下訪問是否正常。

> 註意,如果你在瀏覽器上網址左邊沒看到一個綠色的鎖,表示網頁上應該還有非 https 的請求,需要將頁面上的 http 請求全部改造成 https 之後就是綠色的鎖嘍。


####七、定時任務自動更新證書續期

> 因為據說證書的有效期是 90天,但可以無限續期,所以最後還要增加個證書的自動續期定時任務功能,
註意更新證書的頻率是有限制的哦,不要太頻繁了,可以看看說明頁面 https://letsencrypt.org/docs/rate-limits/
英文一大堆有些看不懂,大概意思吧說的是各種新增更新之類的情況每周 5~20次的限制

crontab -e

增加任務,每月1號凌晨5點30分更新一次證書,並自動重載 nginx 配置

30 05 01 * * /usr/local/certbot/certbot-auto renew --renew-hook "/etc/init.d/nginx reload"


####八、測試是否符合蘋果的ATS要求
在蘋果操作系統的終端中通過nscurl命令來診斷檢查

nscurl --verbose --ats-diagnostics https://www.yourdomain.com

我在蘋果上測試了下 TLSv1 TLSv1.1 TLSv1.2 全部 PASS 通過了的
![為蘋果ATS和微信小程式搭建 Nginx + HTTPS 服務](http://img.blog.csdn.net/20170122140627250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXptZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

不過後來發現還可以線上測試:
騰訊雲上面有個線上蘋果ATS檢測的功能可以試試
https://www.qcloud.com/product/ssl

![為蘋果ATS和微信小程式搭建 Nginx + HTTPS 服務](http://img.blog.csdn.net/20170122140844724?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXptZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

測試也全部通過

####九、其他問題

1, 檢測伺服器 HTTPS 配置安全性
https://www.ssllabs.com/ssltest/analyze.html
出現下麵提示,安全等級居然為 F 無語。。

> This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure

一番搜索後,發現是伺服器的 openssl 版本太低的原因,需要升級 openssl 了,可以查看第一步更新下再重新編譯Nginx

2, 重定向的問題

> 如果只想使用 HTTPS ,以前的 HTTP 方式一般是需要 301 或 302 重定向到 HTTPS 請求上的,但這樣會導致多一次請求,而且同樣存在可能被劫持的風險,
此時可以使用 HSTS ,可以將當前的 HTTP 請求重置為 HTTPS 方式而不用跳轉,max-age的時間根據你的需求自定義
加上這個後,你的伺服器在 SSLLAB 上的等級就是 A+ 啦

在 server 部分添加 add_header

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";


註意:

> 若要取消時不能直接刪除該配置,必須先將 max-age=0; 設置為 0 一段時間後再去掉,否則可能導致部分用戶瀏覽器未更新配置。
也就是說這個功能只能是當用戶 通過 https 協議訪問過網站一次後瀏覽器緩存住跳轉信息,下次繼續用 http 請求的時候瀏覽器才會自動跳了而不再是請求了伺服器後來跳轉
建議如果不是全站都轉移到 https ,僅用 https 訪問網站的話還是別用,還是伺服器來控制跳轉好些

3, SSL labs 出現提示:

> This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. 

解決方法(下麵的密鑰保存目錄可自定義):

mkdir -p /usr/local/nginx/conf/vhost/ssl
openssl dhparam -out /usr/local/nginx/conf/vhost/ssl/dhparams.pem 2048

添加 nginx ssl 配置:

vi nginx.conf
ssl_dhparam /usr/local/nginx/conf/vhost/ssl/dhparams.pem;
```

好了,整個服務端配置完成。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 特性說明和原理圖: 標準瀏覽器和Ie9+瀏覽器都支持事件的冒泡和捕獲,而IE8-瀏覽器只支持冒泡 標準和Ie9+瀏覽器用stopPropagation()或cancelBubble阻止事件傳播,而ie8-用e.cancelBubble屬性來阻冒泡,註意ie9不支持cancelBubble屬性(設置後 ...
  • 前言: 本文為個人學習react-router的總結。包括路由基礎配置,跳轉,許可權管理,組件與路由配置的關係,代碼分割。歡迎交流指導。 一、路由基礎 1.路由配置 & 顯示路由組件的view(類比angular的ui-view) 路由配置:路由匹配的規則 view:放置路由組件的地方(URL匹配了, ...
  • 今天呢,來推薦一款請輕量級 字體圖標框架。Font Awesome 用法與bootstrap相似 打開網址。download下載,然後打開取到這兩個,下載點這裡,這個博客弄的挺好的。 找到examples,進去,用哪個,就直接把類名加上去,這裡,提醒一下,最好用<i></i> 來包含圖標。 點ico ...
  • 這是學習筆記。 今天做東西的時候,想把體驗做好,於是打算再ajax success欄位中添加函數實現提示sucess。 用了jquery的fadeIn 跟fadeOut,再fadeIn的callback函數中調用了fadeOut,所以在#div1顯示完後又淡出了。 ...
  • 由於1.0版本存在一個很大的BUG,一直也沒有找到問題所在,後來,一位在微軟的朋友說,他們的測試小妹給出的結果是框架的問題,所以,就直接整體重構了代碼,也佈局設計上,由跳轉頁面變為了UWP常見的左側列表,右側詳細內容。 因為要用左右的這種結構,所以,就需要啟用標題欄的後退按鈕,要不然,在每個頁面上的 ...
  • 介紹: Linux或Apple或OS X ,已經安裝了USB驅動調試為Android的幫助,確認您的Android USB調試連接配置和正常工作。 Windows下需要自己手動下載驅動安裝或者通過下載第三方360手機助手安裝即可正常使用 我也嘗試過Android SDK目錄下Android\SDK\ ...
  • Android 使用微信登錄、分享功能 具體的文檔詳情微信官網上介紹(微信官網文檔),本人直接按照項目部署步驟進行講解: 第一步:申請你的AppID; 第二步:依賴 或者: 這兩個依賴包的區別是前者包含統計功能,後者沒有。 第三步:在AndroidManifest.xml中加入必須的許可權 第四步:註 ...
  • 前幾天 安裝了 Android Studio 2.2。 本來一切都好,但是當我修改了 配置文件 studio64.exe.vmoptions 想修改 最大記憶體(保證運行流暢)後,AS 就再也運行不了了。 報錯內容大意是: error code -1,必須配置 JAVA_HOME 參數,而且這個參數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...