Lets’ Encryptで自分サーバー用証明書を作る(要ドメイン名)

サーバー

Dockerでたてたウェブサーバーに、できればサーバー証明書を作りたいと思いますが、自己署名証明書だといちいち面倒なので、可能なら信頼された認証局に作ってもらった証明書を利用したいです。

さくらのメールボックスを利用しているだけのドメインがあったので、それを使ってLets’ Encryptでサーバー証明書を取得してみようと思います。

さくらのメールボックス

以前契約した、さくらインターネットのメールのみサービスです。安いので仕方ないのですが、複数ドメインを登録しても、メールボックスが分かれない仕様です。

  • foo@example.com
  • foo@test.com

は同じメールボックスに入ってしまいます。使い方次第ではありますが、混乱するので一契約で複数ドメインの運用は難しく、複数個契約するくらいなら普通に安めのレンタルサーバーを借りたほうが良いという、結構難しい立ち位置のサービスだと思います。

MXレコードの設定だけで使う

メールサーバーだけ、さくらのメールボックスを利用してみる【外部DNS利用】 | デフよん

こちらの記事で紹介されている通り、MXレコードの編集で何とかすることにします。さくらのメールボックスを利用する際に、基本的にはネームサーバーの設定を、

  • ns1.dns.ne.jp
  • ns2.dns.ne.jp

にしていると思いますが、さくらのメールボックスでは、メールを使うためにネームサーバーを設定することはできますが、ゾーン設定等他の設定はできません。(たぶん)

これを、レジストラもしくはどこかのレンタルサーバーに向け、MXレコードをさくらのメールボックスのサーバー、www****.sakura.ne.jpへ向けることでメールだけさくらインターネットに扱ってもらうようにします。

無料のSSL証明書

無料で利用できるSSL証明書は、Lets’ EncryptとZero SSLがあります。いろいろと違うところがありますが、サーバーの管理権限を確認する方法が若干Zero SSLのほうが多いです。

  • Lets’ Encrypt
    • サーバー内.well-known/acme-challengeにファイルを置いて示す
    • DNSレコードに_acme_challengeのTXT項目を置く
  • Zero SSL
    • サーバー内.well-known/acme-challengeにファイルを置いて示す
    • DNSレコードに_acme_challengeのTXT項目を置く
    • (ウェブサイト限定)[email protected]ドメイン名等へのメール応答で認証

ただ、Zero SSLのメール認証は、ウェブからの認証に限定されていて、ウェブからの認証は無料だと回数制限があるので年間100米ドル程度支払うと1年間有効なサーバー証明書を作れるようですがワイルドカード証明書はもっと高額になります。ただ、ACMEを通してならワイルドカード証明書も作れるような説明があったりもするので、よくわかりません。

リモートホストの証明書を取得するツール

よく使われる、certbotとかacme.shとかのツールは、操作しているサーバーに対してファイルをアップロードして認証を取ってくるようなので、そのままだと自分で建てたイントラネット用サーバーに証明書をつけることはできません。

考えられる方法は以下の二つです。

SSL証明書を取ってSSHでコピーしてくる

レンタルサーバーなどにおいてLets’ Encryptでとってきた証明書をイントラネットサーバーにいれるという方法も考えられます。

使っているレンタルサーバーを見てみると、

  • ssl
    • certs
    • csrs
    • keys

というディレクトリがホームの下にぶら下がっていて、ここにドメイン名に対応するファイルが入っていました。Lets’ Encryptを自動更新していってくれるレンタルサーバーなのですが、

  • key: de999_9a99b_ハッシュ値か何か.key
  • cert: ドメイン名_de999_9a99b_連番の何か_キーとは別のハッシュ値か何か.crt

のようなファイル形式だったので、SSH接続すれば持ってこれそうです。

リモートホストの更新をできるツールを使う

Lets’ Encryptのウェブサイトに使えるツールのリストが出ている中に、リモートホストの更新をするツールがありました。

ACME クライアント実装 - Let's Encrypt - フリーな SSL/TLS 証明書
最終更新日:2022/06/29 | すべてのドキュメントを読む Let’s Encrypt は、与えられたドメインを制御する権限があなたにあることを検証し、証明書を発行するために、ACME プロトコルを使用しています。 Let’s Encrypt の証明書を取得するためには、使用する ACME...

GetSSL (bash, also automates certs on remote hosts via ssh)

期待できそうなので使ってみたいと思います。

getssl/README.md at master · srvrco/getssl
obtain free SSL certificates from letsencrypt ACME server Suitable for automating the process on remote servers. - getssl/README.md at master · srvrco/getssl

Dockerで建てたnginxサーバーなので、DockerのホストOS(かどこか)からvolumes:でリンクさせるか何かの方法でアップロードする形になります。

結構簡単

Githubリポジトリから引っ張ってくるので、ドキュメントの通り、curlかgit clone等でダウンロードです。更新はgit pullですが、

git clone https://github.com/srvrco/getssl.git

でgitsslディレクトリが作成され、getssl/.getsslコマンドを実行すると.getsslディレクトリがホーム下に作成されて設定・結果ファイルが保存されるようになります。

./getssl -c yourdomain.com

実施例にはワイルドカード証明書がでていましたが、Lets’ Encryptの仕様ではワイルドカード証明書の作成にはFTPでのファイルアップロードを利用した認証は不可でDNS設定でのドメイン認証が必要です。

ドメイン非依存のgetssl.cfgファイルで、

# Use the following 3 variables if you want to validate via DNS
#VALIDATE_VIA_DNS="true"
#DNS_ADD_COMMAND=
#DNS_DEL_COMMAND=

の箇所を

VALIDATE_VIA_DNS=true
export CPANEL_USERNAME=''
export CPANEL_URL='https://www.cpanel.host:2083'
export CPANEL_APITOKEN='1ABC2DEF3GHI4JKL5MNO6PQR7STU8VWX9YZA'
DNS_ADD_COMMAND=/home/root/getssl/dns_scripts/dns_add_cpanel
DNS_DEL_COMMAND=/home/root/getssl/dns_scripts/dns_del_cpanel

のように変更するようです。add_cpanelの部分を含めて使用するサーバーに応じて変更しますが、getsslにはドキュメントがなく、Lets’ Encryptで用意されているっぽいです。

DNS providers who easily integrate with Let's Encrypt DNS validation
In the spirit of Web Hosting who support Let's Encrypt and CDN Providers who support Let's Encrypt, I wanted to compile a list of DNS providers that feature a w...

cPanelを使っているならcPanel用で行けるので便利です。個別設定ファイルで変な「SAN」値が設定されていると余計なドメインのリクエストをされてしまうので要注意です。

コメント

タイトルとURLをコピーしました