AWS Route53 Geo dns with letsencrypt

如果是單一一台主機透過 certbot 要用 letsencrypt 這個免費的 ssl 憑證服務的話,其實並不難,以 ubuntu 16.04 搭配 apache 的話會像這樣

而 Amazon AWS 的 Route53 服務有提供很好用的 geo-based dns 功能,簡單來說就是指定來自哪個區域的 reqeust 要由哪個 ip 負責處理。但因此 certbot 預設的 dns challenge 就不能正常運作,導致無法順利申請 letsecrypt 的 ssl 憑證。

實際上只要使用 –dns-route53 參數就可以了。

$ sudo certbot certonly --dns-route53 -d YOUR_DOMAIN_NAME

不過預設 certbot 安裝的時候不會安裝 dns-route53 這個 plugin,所以要自行安裝,而安裝的指令也很簡單,如下。

$ sudo pip install certbot_dns_route53==0.31.0

要注意的是plugin版本必須要跟 certbot 版本一致,要檢查certbot 版本就用 –version 參數即可。

$ sudo certbot --version

但是比較尷尬的是,預設 ubuntu 16.04 的python 為 2.7,所以即使把上面的plugin安裝了,實際上執行certbot要申請憑證的時候還是會有錯誤訊息,主要是說沒有RSA的演算法。處理的方式就是把 python 2.7 移除掉(反正這版本之後也會掰掰),然後安裝 python 3的版本。連帶的 pip 也要安裝 pip3,還有可能會遇上的是 boto 版本不對的關係,所以 python3-boto3 也得要安裝上去。

$ sudo apt-get install python3-pip
$sudo apt-get install python3-boto3

如果有使用最新版本癖好的話,可以 pip3 install –upgrade pip 一下,但是執行之後請記得修改 /usr/bin/pip3 檔案,把

from pip import main
if __name__ == '__main__':
    sys.exit(main())

改為

from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())

要不然會噴 cannot import main 的錯誤。

大致上這樣就可以順利進行 dns route53 的ssl 憑證申請了。