之前我們有講過如何給網站開啟全站 SSL 現在我們就一起來看看如何在 vps 上給 Nginx 開啟 Let’s Encrypt 證書並且自動更新。
這篇文章中的內容較舊,關於 letsencrypt 的配置文章,我寫了一篇新的,或許你可以參考看看:letsencrypt 工具改名 certbot
設置環境
首先,我們要準備一下安裝環境,這次我使用的是 CentOS 6.7 最後,如果你使用的是 Ubuntu ,那可能某些路徑不同,但應該大同小異。首先我們準備需要的環境,這些內容你的vps有些已經內置,有些則需要更新,而有些則沒有安裝:
1 |
yum -y install git bc |
另外,你需要使用到 pip,如果你的vps並沒有預裝,請參照這篇文章來升級。
安裝
這裡我們假定你已經配置好了 Nginx ,現在我們來從 Github 克隆一份 Let’s Encrypt 包使用:
1 |
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt |
現在,我們來進入 Let’s Encrypt 的目錄執行一下 letsencrypt-汽車 好讓它自己完成初始化。
1 2 3 |
cd /opt/letsencrypt/ ./letsencrypt-auto |
這裡你可能會遇到 的virtualenv : command 不 發現. 這個錯誤,那你就需要執行 果仁 安裝 的virtualenv 來安裝缺失的包,然後再進行初始化。
一旦初始化完成,我們就可以進行證書籤署了!
使用內置插件獲取證書
使用內置插件 WebRoot 獲取證書的好處是我們可以直接使用 Nginx 提供的 HTTP 服務而不需要關閉 Nginx 好臨時讓出 80 端口!
編輯 Nginx 配置文件 /USR/本地/nginx的/CONF/nginx的.CONF ,在裡邊相應位置插入如下內容:
1 2 3 |
location ~ /.well-known { allow all; } |
修改後的配置文件應該類似這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//部分隐去 server { listen 80 default_server; #listen [::]:80 default_server ipv6only=on; server_name www.lnmp.org; index index.html index.htm index.php; root /home/wwwroot/default; #error_page 404 /404.html; include enable-php.conf; location /nginx_status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } location ~ /.well-known { allow all; } access_log /home/wwwlogs/access.log access; } |
記住插入到 服務器 的大括號內部。
現在重啟 Nginx 即可: nginx的 -ŧ && 服務 nginx的 重新開始 ,如果報錯,說明你的配置文件並沒有改好。
接下來使用命令獲取證書,期間會要求你同意協議以及輸入一個郵箱,目的是將來用來升級和恢復密鑰:
1 2 3 |
cd /opt/letsencrypt ./letsencrypt-auto certonly -a webroot --webroot-path=/home/wwwroot/default/your-web-home -d example.com -d www.example.com |
值得一提的是,你需要root權限來執行。另外,你的域名必須直接指向你的 vps 地址,如果你用了什麼 DNS 加速之類的 CDN,需要取消掉才行,因為它們會隱藏你服務器的真實 IP。
成功完成後,你應該就可以在 /等等/letsencrypt/生活/您的域名 這個目錄裡找到你的證書了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
IMPORTANT NOTES: - If you lose your account credentials, you can recover through e-mails sent to lomyr.jo@gmail.com. - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.logcg.com/fullchain.pem. Your cert will expire on 2016-08-14. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - Your account credentials have been saved in your Let's Encrypt configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let's Encrypt so making regular backups of this folder is ideal. - If you like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
接下來執行如下命令來生成 迪菲-赫爾曼密鑰 以增強安全:
1 |
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
冗長的等待之後就是配置 Nginx 使用 SSL 了。
配置 Nginx 的 SSL
總之,在你 Nginx 網站配置目錄下找到對應網站的配置文件,你會發現它們都只有關於 80 端口的監聽,我們把它先改掉:
1 2 3 4 5 6 7 |
server { listen 80; #listen [::]:80; return 301 https://www.logcg.com$request_uri; server_name www.logcg.com logcg.com; } |
這樣讓 Nginx 遇到 HTTP 訪問時自動轉發給 HTTPS。
然後我們來添加 443 端口監聽,這個配置就在同一個文件最頂一行開始即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security max-age=15768000; location ~ /.well-known { allow all; } # The rest of your server block root /usr/share/nginx/html; index index.html index.htm index.php default.html default.htm default.php; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } } |
注意這裡要把 例.同 換為你的域名,然後把 root /USR/分享/nginx的/HTML; 這一行換為你的網站目錄。
現在,再次重啟你的 Nginx nginx的 -ŧ && 服務 nginx的 重新開始 然後嘗試用瀏覽器打開這個頁面來測試結果吧:HTTPS://www.ssllabs.com/ssltest/analyze.html?D = www.logcg.com
別急,還有續期
由於 Let’s Encrypt 是免費簽發的,為了安全,它只提供為期三個月的有效期——官方也鼓勵使用自動化配置來完成續期,總之,你可以使用 ./letsencrypt-汽車 更新 來手動完成續期,或者你也可以使用 Linux 自己的任務計劃功能。
1 |
crontab -e |
如果你在執行這個命令的時候出現找不到命令的情況,就使用如下命令安裝它:
1 |
yum -y install vixie-cron crontabs |
總之,在打開的文件中寫入如下內容:
1 2 |
30 3 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log 35 3 * * 1 service nginx restart |
添加的任務會在每週一凌晨三點半執行證書的更新操作,這樣可以保證你的證書永遠都是最新的。
本文由 落格博客 原創撰寫:落格博客 » 使用 Let’s Encrypt 在 VPS 上為 Nginx 配置 SSL
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1709.html
可以用一年!
感覺 Let’s Encrypt 麻煩吶, 我現在用 AlphaSSL 通配域名, 簡單粗暴….反正也是免費…
我看了下,不是需要$149麼? ? ? (泛域名證書)
你自己生成 csr 域名填 *.domain, 發我郵箱, 我幫你弄一個證書!
哈抱歉最近太忙了,沒顧上搭理博客。。。話說這個證書會有效多久?
可以用一年!
哈,謝啦~暫時用這個也還好了。我做了計劃任務每周自動檢查續期的,而且目前也沒有泛域名的需求,將來有的話再找你咯~XD
必需有 webmaster@logcg.com 或者 admin@logcg.com 企業郵箱, 有哪個你也一起發給我下.
那種用包管理器安裝的nginx和apache的幾乎是一鍵式的……
但是自己編譯的,很多人嘗試letsencrypt-auto都不行,於是只要certonly哈哈~
我都是certonly,一開始都是 standalone呢,嘿嘿。
我也是standalone,不過暫時關閉下web服務器而已。
如果使用CDN的話,其實我也不知道我那次是怎麼配置好的證書(服務器上也是用真實的證書而不是自簽)……
剛才去cf測試了下,開Development Mode和Pause website都不可以呢
應該是必須指向vps才行……?我也是猜的。
我覺得也是,畢竟CDN本質上也是一種中間人劫持嘛~
嗯呢。可以隱藏真實服務器IP,國內不是都把cloudflare的節點給屏蔽了麼
沒有吧Σ( △°°|||)︴只是cf偶爾會撞牆,刷新下就好了。萬一這一天來了,我就得解析回IP了
我以前用cf,後來節點被牆了一大片就不用了。後來cf和國內百度還是誰的合作了,然後國際版好像都不行了我就放棄了。反正現在我的速度夠快,就直接跑就好了
cf國內和百度合作的,叫“百度雲加速”,你服務器在香港必然快啊~其實我在想,要不我解析回大陸也行的。因為我弄的me域名沒備案就解析到騰訊云了。。
其實仔細優化一下的話,應該也不會慢的吧
就ssl的過程慢~/(ㄒoㄒ)/~~
哈哈
你網站評論和打開都有問題,咋上了cloudflare啊,快去修復吧
囧,剛才做透過CDN的let’s encrypt嘛,就暫時把web服務器停了,於是應該是503吧我猜~~
513好像,很奇怪的代碼反正
必然,因為服務器關掉了,可能還有cache page吧