目次
- DNS-01 challenge はいいぞ
- certbot コマンドで出来ます。今回は Google Compute Engine と Google Cloud (GCP) DNS を使っているの前提
- CentOS 7系の話
certbot コマンドで DNS-01 challenge してみる
DNS-01 challenge は TXT レコードに特定の文字列を入れて認証する方法です。最近お気に入りです。
以下のメリットがあります。
- IP制限していても関係ない
- ポート80や443を開けていなくていい
- ロードバランサー挟んでいたり、DNSラウンドロビンしてる時に、どっちに来るかわからない時とか このためだけの nginx の設定書く必要もなし(ぐぐったら nginx の設定でどうにかする方法がめっちゃ出てきた)
- Aレコードを登録している必要もない
- 内部のアプリケーションで使うだけみたいな時もまぁ使えなくもないかも(オレオレ証明書でいい気もしますが)
デメリットは
- DNS の設定を変更出来る必要がある(できればAPIなどで)
くらいでしょうか。あまり思い浮かびません。
とりあえず今回は Google Cloud (GCP) DNS を使ったやり方を試したいと思いますが、ヘルプを見る限り、以下のものに対応しています。
- Cloudflare for DNS
- CloudXNS for DNS
- DigitalOcean for DNS
- DNSimple for DNS
- DNS Made Easy for DNS
- Gehirn Infrastracture Service for DNS
- Google Cloud (GCP) DNS
- Linode for DNS
- LuaDNS for DNS
- NS1 for DNS
- OVH for DNS
- BIND for DNS
- Route53 for DNS
- Sakura Cloud for DNS
certbot プラグインの準備
今回は certbot コマンドでやってみます。
GCEのインスタンスにログインして、certbot をインストールします。
インストールは、epel 有効にしたらすぐ出来るだろうと思ったのですが、うまくいかず 一旦 yum remove epel-release して、入れ直したところうまくいきました。
詳細なインストール方法は certbot の公式サイト を参照してください。
$ sudo certbot --help plugins
usage:
  certbot plugins [options]
optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG_FILE, --config CONFIG_FILE
                        path to config file (default: /etc/letsencrypt/cli.ini
                        and ~/.config/letsencrypt/cli.ini)
plugins:
  Options for the "plugins" subcommand
  --init                Initialize plugins. (default: False)
  --prepare             Initialize and prepare plugins. (default: False)
  --authenticators      Limit to authenticator plugins only. (default: None)
  --installers          Limit to installer plugins only. (default: None)
plugins:
  Plugin Selection: Certbot client supports an extensible plugins
  architecture. See 'certbot plugins' for a list of all installed plugins
  and their names. You can force a particular plugin by setting options
  provided below. Running --help <plugin_name> will list flags specific to
  that plugin.
  --configurator CONFIGURATOR
                        Name of the plugin that is both an authenticator and
                        an installer. Should not be used together with
                        --authenticator or --installer. (default: Ask)
  -a AUTHENTICATOR, --authenticator AUTHENTICATOR
                        Authenticator plugin name. (default: None)
  -i INSTALLER, --installer INSTALLER
                        Installer plugin name (also used to find domains).
                        (default: None)
  --apache              Obtain and install certificates using Apache (default:
                        False)
  --nginx               Obtain and install certificates using Nginx (default:
                        False)
  --standalone          Obtain certificates using a "standalone" webserver.
                        (default: False)
  --manual              Provide laborious manual instructions for obtaining a
                        certificate (default: False)
  --webroot             Obtain certificates by placing files in a webroot
                        directory. (default: False)
  --dns-cloudflare      Obtain certificates using a DNS TXT record (if you are
                        using Cloudflare for DNS). (default: False)
  --dns-cloudxns        Obtain certificates using a DNS TXT record (if you are
                        using CloudXNS for DNS). (default: False)
  --dns-digitalocean    Obtain certificates using a DNS TXT record (if you are
                        using DigitalOcean for DNS). (default: False)
  --dns-dnsimple        Obtain certificates using a DNS TXT record (if you are
                        using DNSimple for DNS). (default: False)
  --dns-dnsmadeeasy     Obtain certificates using a DNS TXT record (if you are
                        using DNS Made Easy for DNS). (default: False)
  --dns-gehirn          Obtain certificates using a DNS TXT record (if you are
                        using Gehirn Infrastracture Service for DNS).
                        (default: False)
  --dns-google          Obtain certificates using a DNS TXT record (if you are
                        using Google Cloud (GCP) DNS). (default: False)
  --dns-linode          Obtain certificates using a DNS TXT record (if you are
                        using Linode for DNS). (default: False)
  --dns-luadns          Obtain certificates using a DNS TXT record (if you are
                        using LuaDNS for DNS). (default: False)
  --dns-nsone           Obtain certificates using a DNS TXT record (if you are
                        using NS1 for DNS). (default: False)
  --dns-ovh             Obtain certificates using a DNS TXT record (if you are
                        using OVH for DNS). (default: False)
  --dns-rfc2136         Obtain certificates using a DNS TXT record (if you are
                        using BIND for DNS). (default: False)
  --dns-route53         Obtain certificates using a DNS TXT record (if you are
                        using Route53 for DNS). (default: False)
  --dns-sakuracloud     Obtain certificates using a DNS TXT record (if you are
                        using Sakura Cloud for DNS). (default: False)
結構たくさんあります。
早速使ってみます。
今あるプラグインを確認。
$ certbot plugins
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* apache
Description: Apache Web Server plugin
Interfaces: IAuthenticator, IInstaller, IPlugin
Entry point: apache = certbot_apache.entrypoint:ENTRYPOINT
* nginx
Description: Nginx Web Server plugin
Interfaces: IAuthenticator, IInstaller, IPlugin
Entry point: nginx = certbot_nginx.configurator:NginxConfigurator
* standalone
Description: Spin up a temporary webserver
Interfaces: IAuthenticator, IPlugin
Entry point: standalone = certbot.plugins.standalone:Authenticator
* webroot
Description: Place files in webroot directory
Interfaces: IAuthenticator, IPlugin
Entry point: webroot = certbot.plugins.webroot:Authenticator
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$ sudo certbot certonly --dns-google -d hoge.grasys.tech
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Could not choose appropriate plugin: The requested dns-google plugin does not appear to be installed
The requested dns-google plugin does not appear to be installed
プラグインは別途インストールが必要でした(そりゃ一覧にないからな)。入れましょう。
certbot コマンドではできないようなので、 yum で。
sudo yum install python-certbot-google-dns
yum じゃない場合は
pip install certbot-dns-google
とか。
一覧を再度確認します。
$ certbot plugins
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* dns-google
Description: Obtain certificates using a DNS TXT record (if you are using Google
Cloud DNS for DNS).
Interfaces: IAuthenticator, IPlugin
Entry point: dns-google = certbot_dns_google.dns_google:Authenticator
* standalone
Description: Spin up a temporary webserver
Interfaces: IAuthenticator, IPlugin
Entry point: standalone = certbot.plugins.standalone:Authenticator
* webroot
Description: Place files in webroot directory
Interfaces: IAuthenticator, IPlugin
Entry point: webroot = certbot.plugins.webroot:Authenticator
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
apache とか nginx のが消えたのですがががが・・・
使わないので先に進みましょう
まずはヘルプを読みます。
$ certbot --help dns-google
usage:
  certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...
Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate.
optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG_FILE, --config CONFIG_FILE
                        path to config file (default: /etc/letsencrypt/cli.ini
                        and ~/.config/letsencrypt/cli.ini)
dns-google:
  Obtain certificates using a DNS TXT record (if you are using Google Cloud (GCP)
  DNS for DNS).
  --dns-google-propagation-seconds DNS_GOOGLE_PROPAGATION_SECONDS
                        The number of seconds to wait for DNS to propagate
                        before asking the ACME server to verify the DNS
                        record. (default: 60)
  --dns-google-credentials DNS_GOOGLE_CREDENTIALS
                        Path to Google Cloud (GCP) DNS service account JSON file.
                        (See https://developers.google.com/identity/protocols/
                        OAuth2ServiceAccount#creatinganaccount forinformation
                        about creating a service account and
                        https://cloud.google.com/dns/access-
                        control#permissions_and_roles for information about
                        therequired permissions.) (default: None)
GCE上などで実行するか、別途 Google Cloud (GCP) DNS を操作可能なサービスアカウントの JSON ファイルを用意しておく必要があります。
今回は GCE上で実行します。 ローカルのMacからやろうとしたら、MetaDataが取れないせいか gcloud auth login していても --dns-google-credentials しないとダメでした。
やってみる
$ sudo certbot certonly --dns-google -d hoge.grasys.tech
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-google, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): YOUR@MAILADDRESS
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directoryß
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for hoge.grasys.tech
URL being requested: GET https://www.googleapis.com/discovery/v1/apis/dns/v1/rest
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones?alt=json&dnsName=hoge.grasys.tech.
Attempting refresh to obtain initial access_token
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones?alt=json&dnsName=grasys.tech.
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones/XXXXXXXXXXXXXXXXXX/rrsets?alt=json
URL being requested: POST https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones/XXXXXXXXXXXXXXXXXX/changes?alt=json
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones/XXXXXXXXXXXXXXXXXX/changes/255?alt=json
Waiting 60 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
URL being requested: GET https://www.googleapis.com/discovery/v1/apis/dns/v1/rest
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones?alt=json&dnsName=hoge.grasys.tech.
Attempting refresh to obtain initial access_token
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones?alt=json&dnsName=grasys.tech.
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones/XXXXXXXXXXXXXXXXXX/rrsets?alt=json
URL being requested: POST https://dns.googleapis.com/dns/v1/projects/YOUR_PROJECT/managedZones/XXXXXXXXXXXXXXXXXX/changes?alt=json
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/hoge.grasys.tech/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/hoge.grasys.tech/privkey.pem
   Your cert will expire on 2019-11-20. 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
できました。 手動で TXT レコード入れたりしないといけないのか?!???!!! とかなっていましたが、全て自動でやってくれました。
更新は certbot renew するだけでよさそうですが --dns-google-credentials つけて実行したドメインの設定ファイルを覗いてみたところ
/etc/letsencrypt/renewal/DOMAIN_NAME.conf
dns_google_credentials = PROJECT_NAME-0000000000000.json
ってなってたので、cron で renew 実行したい場合は、フルパスで指定しておいたほうが安心かもしれません。
AWS で EC2+Route53 でもためそうと思ったのですが、Route53 を使っているドメインが手元になかったので、そのうち。
それでは今回はこの辺で。
株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。
grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。

 
      
    



 
		  
