2016年9月15日 星期四

Letsencrypt 使用心得

前言

想把網站升級到https,避免被gateway的MIS監控
雖然他要看到 https 網站上的內容是可以的,但是如果是要把  client-> server 中間的封包擷取出來分析出內容,以目前技術很難做,他看到的只會是加密的一串不知道什麼東西。除非他用類似 man in the middle attack 的技術,植入一些木馬程式在你的 client 電腦上,讓 client <-> server 中間的加解密失效
但如果是http,那gateway可以看到明文,連cookie也行
所以才說不要隨便亂上一些沒有 https 加密的網站
你如果不信任公司網路的話,一些 http 網站,建議你跳到自己的 server 上

SSH代理

1. Windows 打開 cygwin (需安裝openssh)
# ssh -D 3128 your.server.ip
2. 然後 browser 打開 proxy
底下 localhost 直接連線的設定都要清空,然後在 socket server 那邊填上  127.0.0.1  port 3128,這樣就會透過 ssh tunnel 到你的 server 再連上網站
如圖:
與用shadowsocks方法類似


Letsencrypt 使用限制

Registrations/IP 限制就是每個 IP 只能在 3 小時內發送 10 次請求,如果超過 10 次就會被阻擋,所以申請成功的 Domain,不要隨便砍掉 /etc/letsencrypt/accounts 目錄,否則你就不能重複申請了 => 不是說你的 client -> https server 的連線,是要註冊幾次
Certificates/Domain 限制就是在七天內你的主 Domain 跟 sub Domain 夾起來只能申請五個,所以當你申請五個 domain 時,Letsencrypt 就會阻擋你申請下一個 domain 了,最後要注意的是,Letsencrypt 申請憑證使用期限是 90 天,官方建議如果使用在正式網站,請 60 天重新 renew 一次。

如果某個網站 a.bear.com 沒設dns,直接寫hosts, 這樣還能上http?
這樣也可以上,dns 是 dns

使用lukas2511 的letsencrypt.sh產生證書

Let's Encrypt的腳本不只lukas2511 ,還有其他的。如:
https://github.com/Neilpang/acme.sh
https://github.com/certbot/certbot
這邊以lukas2511 的版本為例
github lukas2511的 letsencrypt.sh 專案後來改名成dehydrated ,需注意
下載最新版本
$ cd ~; git clone https://github.com/lukas2511/letsencrypt.sh.git
$ cd letsencrypt.sh/
把程式安裝到 /etc/letsencrypt.sh/ 下
# mkdir /etc/letsencrypt.sh/
# cp ~/letsencrypt.sh/dehydrated /etc/letsencrypt.sh/
設定config
# echo "WELLKNOWN=/var/www/letsencrypt" > /etc/letsencrypt.sh/config
# mkdir -p /var/www/letsencrypt/
設定/etc/nginx/nginx.conf  ,主要網址 yourdomain.com 設定的server{}中加入
location /.well-known/acme-challenge/ {
    alias /var/www/letsencrypt/;
}
我有把 /var/www/letsencrypt/ 權限改成apache
產生SSL certificate
# /etc/letsencrypt.sh/dehydrated -c -d yourdomain.com
(成功訊息)
# INFO: Using main config file /etc/letsencrypt.sh/config
Processing yourdomain.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for yourdomain.com...
 + Responding to challenge for yourdomain.com...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!

成功後產生的檔案都在 /etc/letsencrypt.sh/certs/yourdomain.com/
# ls /etc/letsencrypt.sh/certs/yourdomain.com/ -l
-rw------- 1 root root 1643 Sep 15 03:22 cert-14739097xx.csr
-rw------- 1 root root    0 Sep 15 03:22 cert-14739097xx.pem
-rw------- 1 root root 1643 Sep 15 03:38 cert-14739106xx.csr
-rw------- 1 root root    0 Sep 15 03:38 cert-14739106xx.pem
-rw------- 1 root root 1643 Sep 15 03:49 cert-14739113xx.csr
-rw------- 1 root root    0 Sep 15 03:49 cert-14739113xx.pem
-rw------- 1 root root 1643 Sep 15 03:54 cert-14739116xx.csr
-rw------- 1 root root 2134 Sep 15 03:55 cert-14739116xx.pem
lrwxrwxrwx 1 root root   19 Sep 15 03:55 cert.csr -> cert-14739116xx.csr
lrwxrwxrwx 1 root root   19 Sep 15 03:55 cert.pem -> cert-14739116xx.pem
-rw------- 1 root root 1647 Sep 15 03:55 chain-14739116xx.pem
lrwxrwxrwx 1 root root   20 Sep 15 03:55 chain.pem -> chain-14739116xx.pem
-rw------- 1 root root 3781 Sep 15 03:55 fullchain-14739116xx.pem
lrwxrwxrwx 1 root root   24 Sep 15 03:55 fullchain.pem -> fullchain-14739116xx.pem
-rw------- 1 root root 3243 Sep 15 03:22 privkey-14739097xx.pem
-rw------- 1 root root 3243 Sep 15 03:38 privkey-14739106xx.pem
-rw------- 1 root root 3243 Sep 15 03:49 privkey-14739113xx.pem
-rw------- 1 root root 3243 Sep 15 03:54 privkey-14739116xx.pem
lrwxrwxrwx 1 root root   22 Sep 15 03:55 privkey.pem -> privkey-14739116xx.pem

接著就可以修改 nginx 的 SSL 設定
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    listen 443 default_server ssl;
    
    # other configs
    ...

    location /.well-known/acme-challenge/ {
        alias /var/www/letsencrypt/;
    }
    ssl_certificate /etc/letsencrypt.sh/certs/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt.sh/certs/yourdomain.com/privkey.pem;
}

listen 443 default_server ssl; 要記得設,不然訪問https 報ERR_CONNECTION_REFUSED 錯誤。
可以檢查443 port有沒有開
# netstat -ant | grep 443
tcp        0      0 0.0.0.0:4433            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN  # 設 listen 後才有
tcp6       0      0 :::4433                 :::*                    LISTEN

重啟nginx
# service nginx restart

配置subdomain 上SSL
server {
    listen  80;
    listen 443 ssl;
    server_name test.yourdomain.com;

    # other configs
    ...

    location /.well-known/acme-challenge/ {
        alias /var/www/letsencrypt/;
    }
    ssl_certificate /etc/letsencrypt.sh/certs/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt.sh/certs/yourdomain.com/privkey.pem;
}
用同一張證書即可

讓不同port的gitlab也掛上SSL
因為我的gitlab走的是不同的port,
在多次修改 /etc/gitlab/gitlab.rb 
external_url 'http://yourdomain.com:1234'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/privkey.pem"
nginx['custom_gitlab_server_config']="location /.well-known/acme-challenge/ {\n alias /var/www/letsencrypt/;\n}\n"
和重啟gitlab後
# gitlab-ctl reconfigure

仍無法實現 https://yourdomain.com:1234 訪問gitlab,但是關閉系統nginx,只啟動gitlab的nginx時可以

讓cron每天自動檢查並更新
設定 /etc/cron.d/letsencrypt-yourdomain_com (因為 /etc/cron.d/ 裡面的檔名不能有 . 這個符號,用 _ 取代)
0 0 * * * root sleep $(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400); ( /etc/letsencrypt.sh/dehydrated -c -d yourdomain.com; /sbin/service nginx reload ) > /tmp/dehydrated-yourdomain.com.log 2>&1
在cron job 中 $(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400) 
設計是利用機器名稱產生出十六進位 hash 值,抓一部分轉成十進位後除以一天的秒數,得到餘數後先停這個秒數再跑 dehydrated ,這樣可以避免同時間有太多機器到 Let's Encrypt 的伺服器,造成類似 DDoS 的攻擊。

使用wireshark 查封包
選擇網卡後篩選出傳到自己主機的封包
HTTP:
http && ip.addr == x.x.x.x
HTTPS:
ssl && ip.addr == x.x.x.x
刷網頁時記得用ctrl+f5清緩存,否則封包304緩存去看是不準確的
可以發現 ssl 的封包被加密過,http的封包可以看到明文(HTML)
Linux可以用tcpdump

參考資料:
Rellik
https://letsencrypt.tw/   (主要)
https://github.com/lukas2511/dehydrated (主要)
https://blog.wu-boy.com/2015/12/letsencrypt-entering-public-beta-free-ssl/  Letsencrypt 開放申請免費 SSL 憑證
https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04  How To Create an SSL Certificate on Nginx for Ubuntu 14.04
https://www.foolegg.com/how-to-secure-your-websites-with-lets-encrypt-certificate/  [教學] 如何使用 Let’s Encrypt 加密網站的連線
http://stackoverflow.com/questions/34189199/how-do-i-use-let-s-encrypt-with-gitlab  How do I use let’s encrypt with gitlab?
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md  NGINX settings
https://www.digitalocean.com/community/tutorials/how-to-secure-gitlab-with-let-s-encrypt-on-ubuntu-16-04  How To Secure GitLab with Let's Encrypt on Ubuntu 16.04













沒有留言:

張貼留言