~ read.
Centos7 & Nginx下Let's Encrypt部署攻略

Centos7 & Nginx下Let's Encrypt部署攻略

在我們這個時代,網絡活動中加密的重要性,已經不用太過多的贅述,至少對於我來講,任何從網路上過的數據,如果不經過加密,都是不可取的,哪怕是一個blog。但是,一個SSL證書動輒上百美元,實在是有點不親民。所以,開源、免費的Let's Encrypt就顯得十分可愛了。LE(let's encrypt)架設十分簡單,但是其中也不乏讓人撓頭的大坑小坑,今天就把其中的一些可能蘇里一下,供後來者查詢。

下面的步驟是在默認你已經完成了nginx & mysql等基礎環境的部屬,並且你的web服務能夠在http下正常訪問的前提下開始的

安裝Let's Encrypt

  • 首先,你需要停掉你的nginx服務,釋放80端口 //必須!
$ systemctl stop nginx


+ 然後關掉一切防火牆 //十分重要!

$ systemctl stop firewalld
$ systemctl stop iptables
$ systemctl stop ip6tables
  • 然后從萬能的Github上獲取LE源码 //如果到這裡,你的環境裡還沒有git,我會很驚奇😑!
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
  • 然後,採用全自動模式進行證書簽發
$ ./letsencrypt-auto certonly --standalone --email your@email.com -d youdomain.com -d www.youdomain.com

經驗:這裡九成九會出現問題,這一步也是LE部屬過程中最大的一個坑

  • 首先,可能會出現的坑是報gcc編譯器內部錯誤,這往往是交換分區或是內存的問題,執行下面的代碼即可
$ dd if=/dev/zero of=/swapfile bs=1024 count=524288  
$ chmod 600 /swapfile  
$ mkswap /swapfile  
$ swapon /swapfile  
  • 其次:報Failed to connect to 443 for TLS-SNI-01無法連接服務器的錯誤,如果你不幸遇到了,那麼恭喜你,這個錯誤引起的原因是多種的,你需要耐心,然後一個一個的排查:

    • 首先,我們考慮網絡的原因:檢查你的/etc/resolv.conf文件,看看裡面是不是有你不認識的dns地址,然後把它修改成大家都耳熟能詳的Google dns 8.8.8.8 & 8.8.4.4
nameserver 8.8.8.8  
nameserver 8.8.4.4  
    • 然後$ nslookup youdomain.com 8.8.8.8 & $ nslookup youdomain.com 8.8.4.4 看看是否返回了正確的IP地址
    • 在然後,執行$ netstat -ntlp確認一下你的服務器上,沒有任何程序佔用443端口 //全自動模式的證書簽署,LE會連接你服務器的443端口
    • 執行上面三個步驟之後,如果沒有明顯問題,就重啓下網絡$ systemctl restart NetworkManager.service,讓剛剛的dns設置生效。並再嘗試一次證書簽發
$ ./letsencrypt-auto certonly --standalone --email your@email.com -d youdomain.com -d www.youdomain.com
  • 如果仍然看不到成功提示,那麼可能是你所在的IDC開啟了強大的CloudFlare,亦或是上層網關限制了443的訪問,建議你不要再折騰,果斷放棄自動證書簽署,改用必殺技webroot簽署模式

webroot簽署模式

  • 首先,開啟剛剛關掉的nginx,webroot簽署模式需要用到你的80端口
$systemctl start nginx
  • 在你的網站目錄下,手動建立驗證目錄
$ cd /your-webroot-path/  
$ mkdir /.well-known/acme-challenge/
  • 修改網站配置文件
...
server:{  
root /your-webroot-path; //保持root路徑指向你網站根目錄,而非上面剛剛手動建立的驗證目錄  
} 
 location ^~ /.well-known/acme-challenge/ {
}  //nginx會默認屏蔽`./`開頭的目錄,為了剛剛建立的驗證目錄可以被LE訪問到,在location裡定義下
...

做完了上面的工作,然後執行webroot簽署命令

$ ./letsencrypt-auto certonly -a webroot --webroot-path=/your-webroot-path/ -d youdomain.com -d youdomain.com //小技巧,如果還要添加更多的域名,可以繼續-d    youdomain.com

重要:網站配置文件,請使用正常的寫法,而不要使用反向代理,否則不會生效

完成上面的工作,你現在應該可以看到成功提示了

>IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/youdomain.com/fullchain.pem. Your cert will expire
   on 2016-01-01. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-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  

編輯nginx配置文件

  • 如果要同時允許http和https兩種方式訪問:
server {  
 listen 80;
 listen 443 ssl;
 server_name youdomain.com www.youdomain.com;
 ssl_certificate /etc/letsencrypt/live/youdomain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/youdomain.com/privkey.pem;
  • 如果要強制使用https
server {  
 listen 443 ssl;
 server_name youdomain.com www.youdomain.com;
 ssl_certificate /etc/letsencrypt/live/youdomain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/youdomain.com/privkey.pem;
...
}
server {  
 listen 80;
 server_name youdomain.com www.youdomain.com;
 rewrite ^(.*)$ https://$host$1 permanent;
}
server {  
 server_name youdomain.com www.youdomain.com;
 rewrite ^/(.*)$ https://www.$host/$1 permanent;
}

現在,你可以使用https訪問你的網站了😄

到這裡,萬事還沒大吉,LE僅有90天有效期,時間到了需要續期才能繼續正常使用,手動續期是否過於麻煩?那就寫個定時任務吧

  • 安裝crontabs$ yum -y install crontabs
  • 然後編輯 $ crontab -e
0 0 1 * * ./letsencrypt-auto certonly --renew-by-default --email i@linpx.com -d linpx.com -d www.linpx.com  
  • esc wq!保存退出 然後,以後每月1號,將會為你自動續期

DONE