現在網路越來越講究資安問題了,就連google也越來越推廣大家網站使用https協定,而使用https需要使用有購買憑證,以前購買憑證一年都要不少錢,對於小網站來說買憑證的錢可能足夠租好幾個月伺服器了,而現在Let’s Encrypt為了推廣Https,而提供免費的憑證給大家使用,如果你支持它們這樣的服務,也可以在官方網站贊助他們。
※注意:假如始有使用到金流的網站或是一些重要的網站,是無法使用免費憑證的,還是需要自行購買付費的憑證
步驟一、 安裝Certbot
要跟Let’s Encrypt取得SSL憑證需先安裝Certbot在伺服器上。
在command中輸入以下指令增加certbot的repository
sudo add-apt-repository ppa:certbot/certbot
接著update一下repository的資訊 輸入
sudo apt-get update
接著輸入指令安裝Certbot
sudo apt-get install certbot
步驟二、 修改Nginx設定
因為我們會使用Webroot Plugin來取得SSL憑證,而SSL憑證會運作在特別的路徑/.well-known,所以設定nginx來讓它可以存取/.well-known
輸入以下修改nginx設定
sudo nano /etc/nginx/sites-available/default
然後要使用憑證的server block中加入:
location ~ /.well-known { allow all; }
在重新啟動nginx前 輸入以下指令檢查設定檔是否沒問題
sudo nginx -t
如果有出現nginx: configuration file /etc/nginx/nginx.conf test is successful 就表示沒有問題
假如檢查沒有問題後輸入以下指令重新啟動nginx
sudo systemctl restart nginx
步驟三、 申請憑證
接下來就是重要的申請憑證了
我們要輸入相當於以下的指令來申請
其中/var/www/html可能你網頁程式資料夾設定的位置不同 要依據自己的位置修改
而後面的domain.com與www.domain.com則是使用這個路徑的domain網址 請改成自己的domain
假如有更多domain需要設定可以依此類推在後面加上-d new.domain.com
sudo certbot certonly --webroot --webroot-path=/var/www/html -d domain.com -d www.domain.com
提示會顯示Enter email address (used for urgent renewal and security notices) (Enter ‘c’ tocancel):
這時輸入自己的信箱(用於寄信通知用)
而假如不想使用信箱可以加上 –register-unsafely-without-email 類似於
sudo certbot certonly --webroot --register-unsafely-without-email --webroot-path=/var/www/html -d domain.com -d www.domain.com
會顯示以下訊息要求看一下使用條款
------------------------------------------------------------------------------- Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory ------------------------------------------------------------------------------- (A)gree/(C)ancel:
這時回答輸入A同意
接著取得憑證完成會顯示以下的訊息
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.domain.com/fullchain.pem. Your cert will expire on 2017-09-09. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot 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 Certbot so making regular backups of this folder is ideal. - 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
其中說了憑證申請完成,而憑證放的位置為/etc/letsencrypt/live/www.domain.com/fullchain.pem
而這個憑證是有時間限制的,上面寫會於2017-09-09到期 到時需要再申請新的憑證(後面有教學)
這時會發現憑證放的位置資料夾中(/etc/letsencrypt/live/www.domain.com)會有四個檔案cert.pem chain.pem fullchain.pem privkey.pem
接下來為了增加安全性 我們要產生一個2048-bit Diffie-Hellman的密碼組合 輸入指令
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
他會產生在/etc/ssl/certs/dhparam.pem
步驟四、 Nginx設定憑證與啟動https
首先我們要在位置產生一個nginx的configuration snippets來設定SSL Key跟Certificate 輸入以下指令
sudo nano /etc/nginx/snippets/ssl-domain.com.conf
並在檔案中加上以下內容 (注意:請依照自己的實際檔案位置修改domain.com的部分)
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
接下來產生另一個nginx的configuration snippets來設定Strong Encryption 輸入
sudo nano /etc/nginx/snippets/ssl-params.conf
內容輸入
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ssl_dhparam /etc/ssl/certs/dhparam.pem;
其中的8.8.8.8 8.8.4.4與/etc/ssl/certs/dhparam.pem可以依據自己使用不同做設定
8.8.8.8 8.8.4.4 為Google DNS的IP 假如要使用別的DNS就改成自己使用的DNS IP
而/etc/ssl/certs/dhparam.pem是剛剛產生的2048-bit Diffie-Hellman的密碼組合位置 如果你在產生時不是放在此路徑 就修改這個選項
然後要修改nginx設定 輸入指令
sudo nano /etc/nginx/sites-available/default
這邊教兩種選擇 其他情況請依據自己使用需求做設定
選擇一、只保留https 而http轉向https
先將原本server block設定中的
listen 80 default_server; listen [::]:80 default_server;
改成
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-domain.com.conf;
include snippets/ssl-params.conf;
我們加上一個新的server block 讓http自動轉向https (domain請改成自己的domain)
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name domain.com www.domain.com;
return 301 https://$server_name$request_uri;
}
選擇二、 http與https都保留
而假如想要http與https同時都存在
只需要在原本的server block加上
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-domain.com.conf;
include snippets/ssl-params.conf;
當設定完成後我們檢查設定是否沒有問題 輸入指令
sudo nginx -t
如果有出現nginx: configuration file /etc/nginx/nginx.conf test is successful
就表示設定正常 接著重啟nginx 輸入
sudo systemctl restart nginx
接下來可以輸入你的網址看看是否成功 並且可以在以下網址檢測你的https安全性等級
https://www.ssllabs.com/ssltest/analyze.html
步驟五、 設定自動更新憑證
因為Let’s Encrypt的憑證每過一段時間就會過期,快過期的時候只需要輸入指令certbot renew就會更新憑證,但是一直定時去輸入很花時間,而且有時可能會忘記去更新會導致瀏覽器顯示為不安全的網站,所以我們用cron job去自動更新憑證輸入以下指令開啟排程設定
sudo crontab –e
接著我們在裡面加上 如下面的一行
10 7 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"
便會在每天的7點10分自動去更新憑證並且重新啟動nginx
而假如位置web檔案路徑改變的話 則需要去改變設定
輸入以下指令 修改Let’s Encrypt自動更新的設定 可在裡面修改憑證位置與網站路徑位置
/etc/letsencrypt/renewal/*.conf