從今年起Google將開始主動推廣https(來源),因此只要你使用的是Chrome瀏覽器,就會看到Google將還是使用http但包含敏感資訊如密碼或信用卡等的網站標示為不安全,開個空網站加入密碼欄位就可以看到下圖的結果
那麼就來為你的網站加入https吧
製作ssl憑證(certificate)
Https指的就是http透過ssl加密,所以我們第一步要先來製作我們的ssl憑證,首先在系統輸入
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout demo.key -out demo.csr
- req -x509 : 指定request要使用X.509憑證驗證
- -nodes : 產生的憑證不需要密碼,不然每重新啟動nginx就要輸入一次
- -days : 有效日期,3650表示約10年
- -newkey rsa:2048 : 我們需要同時產生csr(certificate singing request)與key(private key)檔並使用2048 bits的RSA加密
- -keyout : key輸出的位置與檔名,這裡測試填
demo.key
,請自行更換 - -out : csr輸出的位置與檔名,這裡測試填
demo.csr
,請自行更換
輸入完後會出現以下內容需要填寫
Country Name (2 letter code) [AU]:TW # 國碼State or Province Name (full name) [Some-State]:Taiwan # 國或洲名Locality Name (eg, city) []:Taichung # 城市名Organization Name (eg, company) [Internet Widgits Pty Ltd]:Demo # 組織或公司名Organizational Unit Name (eg, section) []: # 公司單位名Common Name (e.g. server FQDN or YOUR name) []:www.demo.com # 網域名Email Address []:demo@demo.com # Email
要特別注意的是Common Name千萬不要填錯,https是根據你Common Name與你目前進入網站的domain是否符合,你購買的domain是demo.com就必需填入對應你需要加入https的主機如 : www.demo.com
填完後就會產生 demo.key
與 demo.csr
,內容會長這樣
# demo.key
-----BEGIN RSA PRIVATE KEY-----
xxx
-----END RSA PRIVATE KEY-----# demo.csr
-----BEGIN CERTIFICATE-----
xxx
-----END CERTIFICATE-----
也可以透過指令來查看產生的csr檔實際內容
openssl x509 -in demo.csr -text
可看到剛剛輸入的內容都記錄在csr內
Certificate:Data:Version: 3 (0x2)Serial Number:a8:af:34:4f:b4:b3:80:b5Signature Algorithm: sha1WithRSAEncryptionIssuer: C=TW, ST=Taiwan, L=Taichung, O=Demo, CN=www.demo.com/emailAddress=demo@demo.comValidityNot Before: Feb 23 17:40:31 2017 GMTNot After : Feb 21 17:40:31 2027 GMTSubject: C=TW, ST=Taiwan, L=Taichung, O=Demo, CN=www.demo.com/emailAddress=demo@demo.comSubject Public Key Info:Public Key Algorithm: rsaEncryptionRSA Public Key: (2048 bit)... 以下略
購買ssl憑證
在剛剛已經製作出ssl憑證了,但如果這樣就可以自行製作的話那也太沒信用,因此我們要透過第三方機構來驗證你的憑證的真實性,就要你花錢就是了。
有提供驗證的機構非常多,如GoDaddy、Comodo等,每家價錢也都不一樣,可挑選喜歡的或多比價。購買的方案大致上可分為3種
- Standard(一般) : 最便宜的方案,只可對應一組網址,如果你只有一個網站需要就買這個吧,價格一年約3千上下,在網址列可看到綠色的安全字樣
- EV : 較嚴格的驗證方案,價格一年約5千上下,網址列會顯示綠色的驗證機構名稱,例如我們現在看Medium就是由
A Medium Corporation [US]
驗證 - Wildcard(萬用字元) : 可以對應一組網址及底下的所有子網域,有多個服務在同個網址下的話可以考慮這個,價格一年約1萬
購買過程需要將你的csr的內容貼上或上傳,購買完成後你應該會收到2個檔案
- 主要crt檔,檔名一般是你申請的網域名如: www_demo_com.crt
- bundle檔,又稱為intermediate certificate
不過有些網站可能會直接提供 .pem
檔,這個檔案其實就是把crt與bundle合併後的檔案,而如果你拿到是分開的兩個檔案你也需要將他合併為1個,可使用以下方式合併
cat www_demo_com.crt www_demo_com.bundle >> www_demo_com.pem
完成以上動作後就可以將你的key與pem上傳到server上
Nginx設定
Nginx的設定是以每個block來區分,加入ssl大致上會用到以下的設定,我把它分為2部份,最下方是你的server設定,再依照自已的需求調整吧
server { # 1. basic parts
listen 443 ssl default_server;
ssl on;
ssl_certificate /home/demo/certs/demo.pem;
ssl_certificate_key /home/demo/certs/demo.key;
ssl_session_timeout 5m;
#ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 2. advance parts
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_ciphers '...';
ssl_dhparam /home/demo/certs/dhparam.pem;
ssl_prefer_server_ciphers on; # server setting
server_name www.demo.com
...
}
1. SSL基本設定
- listen : 指定要監聽的port,一般是443
- ssl : 啟用ssl
- ssl_certificate : 指定剛剛購買後合併完並傳到server的.pem檔
- ssl_certificate_key : 指定你上傳到server的private key
- ssl_protocols : 原始的設定可能是
SSLv2
等(如註解部份),這是舊版的安全協定,將它更新成新版TLS
,可提供更安全的加密連線,不過要注意如果你的網站是要讓非常舊的系統如Windows XP的IE來使用的話可能還是需要提供舊版的方式
到這裡的設定調整完就算完成了,這時你的網站已經可以提供https,另外也可以上SSL測試網站Qualys SSL Labs去測你網站的安全等級,應該可以拿到A級了
第1項的certificate有達到100分就代表你的ssl有驗證過了,如果有其它的安全問題都會列在上面,照上面的問題去修正很容易就可以加強你網站的安全性
2. 進階設定
如果想要讓你的網站更安全可以再加上cipher與dhparams,cipher有非常多種,全加上就可以了
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384: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";
再來產生dhparams並上傳到你的server加入設定即可
openssl dhparam -out dhparam.pem 4096
完成後可以看到安全等級提升到A+了
最後如果你需要將透過http連線到你網站的人直接轉到https的話可以再加入設定,記得加到一個新的server block,不要跟上面設定放在同個block
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}