Apache 2.4系でHTTP/2サーバを構築してみるテスト。
acme.shスクリプトの使い方やオプションと、国際化ドメイン名(IDN)対応[2016年10月31日版/2018年1月11日追記/2021年9月5日追記] acme.shコマンドは、ACMEエージェントと呼ばれるソフトウエアです。 DNSによる認証チャレンジ、楕円曲線暗号方式に対応しているなど、一通りの機能が備わっています。 シェルスクリプトベースのため、Solarisなど伝統的なUnix OSをご利用の方はこちらのほうが、動かしやすいかもしれません。 (acme.shは、Linux以外に、FreeBSDやSolarisに対応しています。) 今回、10月20日にLet's encryptが(国際化ドメイン名)IDNに対応したので、IDNの取得例と併せて、ご覧ください。 [2021年9月5日追記]acme.shのデフォルトのCAがZeroSSLになったようなので、デフォルトのCAを設定する方法を追記しました。 インストール方法配布はgit経由で行われています。以下のコマンドでインストールできます。 インストールは、各個人のホームディレクトリに行われます。 ルート権限(管理者)である必要は無く、ルート権限でのインストールは推奨されていません。 インストールは一般ユーザの権限(自分のホームディレクトリ)への書き込み権限で十分です。 というのも、インストーラは、実行したユーザのホームディレクトリの直下に、.acme.shというフォルダが作成して、そこにすべてインストールされます。
FreeBSDで必要となるパッケージ socatとlibidn (2018年1月11日追記)
FreeBSDにインストールするとき、2018年1月現在、以下の2つのパッケージが必要になります。
libidnは、初代の方です。(libidn2ではないです。) Linuxもディストリビューションによっては、同様にインストールが必要かもしれません。 管理者権限でインストールして下さい。 $sudo pkg install socat $sudo pkg install libidn $ cd ~ $ curl https://get.acme.sh | sh もしくは、 $ cd ~ $ wget -O - https://get.acme.sh | sh と打ちます。 最後に証明書を取りに行く証明書発行機関(CA)のサーバを設定します。 $ ./acme.sh --set-default-ca --server letsencrypt と打ちます。 これで、一般的なLinux環境のほか、FreeBSD、Solarisでも、Let's Encryptを利用可能となります。
acme.shを使った国際化ドメイン名の証明書の取得例まず、認証チャレンジ用のフォルダを用意します。 お使いのWebサーバのドキュメントルートに移動して、以下のフォルダを作ります。 これまで、例には、example.comを使ってきたのですが、今回は、「してみるテスト.net」のPurycodeである、xn--68j4axe2b9nvcp.netを使って説明します。 証明書を初めてとる場合は、80番の通常のHTTPサーバのドキュメントルート、既に証明書をとって、HTTPSを運用していて、HTTPからの、リダイレクトの設定も済んでいる場合は、HTTPSのドキュメントルートになります。 すでにある場合は次に進んでください。 Apache Webサーバのインストールなどは当サイトのインストールするもの、HTTP/2の各種設定、 Let's Encrypt(無償の証明書発行機関)から取得の設定があることを前提に書いています。 これに沿うと、HTTPの場合、
$ sudo su
# cd /var/http/xn--68j4axe2b9nvcp.net/htdocs/
# mkdir .well-known
# mkdir .well-known/acme-challenge
HTTPSにリダイレクト済みの場合、 $ sudo su
# cd /var/https/xn--68j4axe2b9nvcp.net/htdocs/
# mkdir .well-known
# mkdir .well-known/acme-challenge
となります。 次に、作ったフォルダが機能するか確認します。 証明書を取得するための本番の環境は、何回か失敗すると、数時間から1日程度、新たなリクエストが拒否されてしまいます。 そこで、まず、ステージングと呼ばれるテスト環境に、実際には使用できないfake証明書を取りに行き、証明書の取得に問題が無いか確認します。 # exit # cd ~/.acme.sh # ./acme.sh --issue -d xn--68j4axe2b9nvcp.net -w /var/http/xn--68j4axe2b9nvcp.net/htdocs --server letsencrypt_test (・・・省略・・・) [2016年XX月XX日 (XX) 08時01分59秒 JST] Cert success. -----BEGIN CERTIFICATE----- (・・・省略・・・) -----END CERTIFICATE----- [2016年XX月XX日 (XX) 08時01分59秒 JST] Your cert is in /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.cer [2016年XX月XX日 (XX) 08時01分59秒 JST] Your cert key is in /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.key [2016年XX月XX日 (XX) 08時02分00秒 JST] The intermediate CA cert is in /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/ca.cer [2016年XX月XX日 (XX) 08時02分00秒 JST] And the full chain certs is there: /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/fullchain.cer 上記コマンドの末尾にある「--server letsencrypt_test」はステージング環境を使用します。 ステージング環境では、実際には使用できないfake証明書が発行されます。 エラーが起きなければ今度は、「--server letsencrypt_test」を削除してコマンドを実行すると、今度は実査に使用できる証明書が発行されます。 # ./acme.sh --issue -d xn--68j4axe2b9nvcp.net -w /var/http/xn--68j4axe2b9nvcp.net/htdocs [2016年XX月XX日 (XX) 08時01分20秒 JST] Registering account [2016年XX月XX日 (XX) 08時01分22秒 JST] Already registered [2016年XX月XX日 (XX) 08時01分24秒 JST] Update success. libidn 1.19 Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Simon Josefsson. GNU Libidn comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Libidn under the terms of the GNU Lesser General Public License. For more information about these matters, see the file named COPYING.LIB. [2016年XX月XX日 (XX) 08時01分24秒 JST] Multi domain='DNS:xn--68j4axe2b9nvcp.net' libidn 1.19 Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Simon Josefsson. GNU Libidn comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Libidn under the terms of the GNU Lesser General Public License. For more information about these matters, see the file named COPYING.LIB. [2016年XX月XX日 (XX) 08時01分26秒 JST] Getting webroot for domain='xn--68j4axe2b9nvcp.net' [2016年XX月XX日 (XX) 08時01分26秒 JST] _w='/var/http/xn--68j4axe2b9nvcp.net/htdocs/' [2016年XX月XX日 (XX) 08時01分26秒 JST] Getting new-authz for domain='xn--68j4axe2b9nvcp.net' libidn 1.19 Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Simon Josefsson. GNU Libidn comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Libidn under the terms of the GNU Lesser General Public License. For more information about these matters, see the file named COPYING.LIB. [2016年XX月XX日 (XX) 08時01分35秒 JST] Verifying:xn--68j4axe2b9nvcp.net [2016年XX月XX日 (XX) 08時01分42秒 JST] Pending [2016年XX月XX日 (XX) 08時01分47秒 JST] Pending [2016年XX月XX日 (XX) 08時01分52秒 JST] Pending [2016年XX月XX日 (XX) 08時01分57秒 JST] Success [2016年XX月XX日 (XX) 08時01分57秒 JST] Verify finished, start to sign. [2016年XX月XX日 (XX) 08時01分59秒 JST] Cert success. -----BEGIN CERTIFICATE----- (・・・省略・・・) -----END CERTIFICATE----- [2016年XX月XX日 (XX) 08時01分59秒 JST] Your cert is in /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.cer [2016年XX月XX日 (XX) 08時01分59秒 JST] Your cert key is in /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.key [2016年XX月XX日 (XX) 08時02分00秒 JST] The intermediate CA cert is in /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/ca.cer [2016年XX月XX日 (XX) 08時02分00秒 JST] And the full chain certs is there: /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/fullchain.cer usernameの部分は、みなさんのログイン名が入ります。 これで、証明書が入手できたはずです。 証明書類は、ホームディレクトリ配下の.acme.shにあります。たとえば、 /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.cer といったパスになります。秘密鍵なども同様です。
Webサーバの設定を追加Apache Webサーバのインストールなどは当サイトのインストールするもの、HTTP/2の各種設定、 Let's Encrypt(無償の証明書発行機関)から取得の設定があることを前提に書いています。 このApacheの、バーチャルホスト設定に、 サーバ証明書ファイル( /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.cer) 秘密鍵ファイル( /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.key) 中間証明書ファイル( /home/username/.acme.sh/xn--68j4axe2b9nvcp.net/ca.cer) を追加します。 usernameの部分は、みなさんのログイン名が入ります。 # vi /usr/local/apache2/conf/extra/httpd-ssl-vhosts.conf /usr/local/apache2/conf/extra/httpd-ssl-vhosts.conf
<VirtualHost *:443> SSLEngine on SSLCertificateFile "/home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.cer" SSLCertificateKeyFile "/home/username/.acme.sh/xn--68j4axe2b9nvcp.net/xn--68j4axe2b9nvcp.net.key" SSLCertificateChainFile "/home/username/.acme.sh/xn--68j4axe2b9nvcp.net/ca.cer" DocumentRoot "/var/https/xn--68j4axe2b9nvcp.net/htdocs/" ServerName xn--68j4axe2b9nvcp.net:443 ServerAdmin webmaster@example.com <Directory /var/https/xn--68j4axe2b9nvcp.net/htdocs> Options -Indexes AllowOverride All Require all granted </Directory> <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /var/log/https/xn--68j4axe2b9nvcp.net/error_log.%Y%m%d 86400" CustomLog "|/usr/local/apache2/bin/rotatelogs -l /var/log/https/xn--68j4axe2b9nvcp.net/access_log.%Y%m%d 86400" combined CustomLog "|/usr/local/apache2/bin/rotatelogs -l /var/log/https/xn--68j4axe2b9nvcp.net/ssl_request_log.%Y%m%d 86400" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> 設定の反映は、apachctl -tで、設定ファイルの間違いが無いこと(Syntax OKが表示されること)を確認の上、下記のように # /usr/local/apache2/bin/apachctl -t Syntax OK # /usr/local/apache2/bin/apachctl stop # /usr/local/apache2/bin/apachctl start とします。
cronによる再取得acme.shは、証明書の期限が、30日を切らなければ、再取得を行いません。 そのため、Let's Encryptの発行回数の制限には到達しにくいので、毎日cronに登録して実行しておくといいでしょう。 管理者権限(root)で、登録しましょう。 たとえば、毎日の午前3時30分に証明書の再取得し、Apacheのリスタートをするとすれば、 # crontab -e /var/spool/cron/crontabs/root/
30 3 * * * "/home/username/.acme.sh"/acme.sh --cron --home "/home/username/.acme.sh" --reloadcmd "/usr/local/apache/bin/apachectl restart" > /dev/null となります。これで、Let's Encryptのサービスが終わったり、障害が起きない限り、有効な証明書が、永久に維持され続けます。 [cronによる取得の制限] >> Let's Encryptのサーバ証明書を自動更新
スクリプトのリファレンスacme.shスクリプトは、コマンドと呼ばれるオプションで、詳細な動作を決定します。 # ./acme.sh [コマンド] [パラメータ[値]]… コマンドコマンドは、以下の6つがあります。それぞれ使用できるオプションが異なります。
パラメータパラメータとして、以下のオプションがあります。いくつかのパラメータは、使用できるコマンドが決まっています。
|