してみるテストロゴ
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つがあります。それぞれ使用できるオプションが異なります。

--help, -hヘルプメッセージを表示します。
--version, -vバージョン情報を表示します。
--installacme.shをインストールします。
--uninstallacme.shと、そのcron jobをアンインストールします。
--upgradeacme.shを、https://github.com/Neilpang/acme.shの最新のコードにアップグレードします。.
--issue証明書を発行します。
--signcsr既存のCSRを使って証明書を発行します。
--installcert発行した証明書をapache/nginx、その他サーバにインストールします。
--renew, -r取得済みの証明書を再発行します。
--renewAllすべての取得済みの証明書を再発行します。
--revoke取得済みの証明書を失効させます。
--listすべての取得済みの証明書の一覧を表示します。
--showcsrCSRの内容を表示します。
--cronすべての取得済みの証明書を再取得するcron jobを実行します。
--toPkcs pfxファイル形式で、証明書と秘密鍵をエクスポートします。
--updateaccountアカウント情報を更新します。
--registeraccountアカウント秘密鍵を登録します。
--createAccountKey, -cakアカウント秘密鍵を作成します。professional use.
--createDomainKey, -cdkドメイン秘密鍵を作成します。 professional use.
--createCSR, -ccsrCRSを作成します。, professional use.
--deactivateドメイン認証を非活性化します。 professional use.
--set-default-ca--serverオプションとともに使用します。デフォルトの証明書発行機関(CA)を設定します。

パラメータ

パラメータとして、以下のオプションがあります。いくつかのパラメータは、使用できるコマンドが決まっています。

---domain, -d domain.tld証明書の発行、再取得、失効に利用するドメインを指定します。
--force, -f証明書を強制的にインストールしたり、証明書の即時の再取得を強制的に行うために使います。
--staging, --testテストのため、ステージングサーバを利用します。
--debugデバッグ情報を出力します。
--webroot, -w /path/to/webrootウェブルートモードにおいて、Webサーバのコンテンツルートフォルダを指定します。
--standalone非暗号のスタンドアローンモードを利用します。
--tlsTLS暗号化のスタンドアローンモードを利用します。
--apacheapacheモードを利用します。
--dns [dns_cf|dns_dp|dns_cx|/path/to/api/file]DNSモードもしくは、DNS APIを利用します。
--dnssleep [120]DNS APIモードで、すべてのTXTレコードが、有効になるまで、待機する秒数を指定します。デフォルトで120秒です。
--keylength, -k [2048]秘密鍵の長さを指定します。: 2048, 3072, 4096, 8192 or ec-256, ec-384.
--accountkeylength, -ak [2048]アカウント鍵の秘密鍵の長さを指定します。
--log [/path/to/logfile]ログファイルの出力先を指定します。デフォルトは、インストール先フォルダのacme.sh.logファイルです。
--log-level 1|2ログレベルを指定します。デフォルトは1です。
--certpath /path/to/real/cert/file証明書の再取得後、証明書を指定のパスにコピーします。
--keypath /path/to/real/key/file証明書の再取得後、秘密鍵を指定のパスにコピーします。
--capath /path/to/real/ca/file証明書の再取得後、認証局の中間証明書を指定のパスにコピーします。
--fullchainpath /path/to/fullchain/file証明書の再取得後、フルチェーン証明書を指定のパスにコピーします。
--reloadcmd "service nginx reload"証明書の再取得後にサーバのリロードに使用するコマンド
--server <server_uri/short_name>証明書発行期間(CA)のサーバを指定します。
Short Name ACME server URL
letsencrypthttps://acme-v02.api.letsencrypt.org/directory
letsencrypt_testhttps://acme-staging-v02.api.letsencrypt.org/directory
buypasshttps://api.buypass.com/acme/directory
buypass_testhttps://api.test4.buypass.no/acme/directory
zerosslhttps://acme.zerossl.com/v2/DV90
sslcomhttps://acme.ssl.com/sslcom-dv-rsa, https://acme.ssl.com/sslcom-dv-ecc
--accountconfカスタマイズしたアカウント設定ファイルを指定します。
--homeacme.shスクリプトをインストールしたディレクトリを指定します。
--certhomeすべての証明書を保存したディレクトリを指定します。 '--install' コマンドで使用します。
--useragentユーザエージェント(user agent)文字列を指定します。これは保存され、将来、再取得などの際に利用されます。
--accountemail登録するアカウントの電子メールアドレスを指定します。, '--install' コマンドで使用します。
--accountkeyアカウント秘密鍵を指定します。 '--install' コマンドで使用します。
--days'--issue'コマンドを使う際に、指定した日数を経過したものを再取得する。最大値は60日です。
--httpport非暗号のスタンドアローンモードでバインドするポートを指定します。サーバがプロキシサーバか、ロードバランサの背後にある場合に有効です。
--tlsportTLS暗号のスタンドアローンモードでバインドするポートを指定します。サーバがプロキシサーバか、ロードバランサの背後にある場合に有効です。
--local-addressサーバに複数のIPアドレスを持っている場合、スタンドアローンモードでバインドするローカルアドレスを指定します。
--listraw'--list' コマンドで使用します。 未加工形式の証明書の一覧
--stopRenewOnError, -se'--renewall' コマンドで使用します。. もし証明書の再取得でエラーが起きたら、停止します。
--insecureサーバの証明書を確認しません。いくつかのデバイスにおいて、サーバの証明書は信頼されていないかもしれない。
--ca-bundleサーバの証明書APIで、指定した認証局のバンドル証明書を確認します。
--nocron '--install' コマンドで使用します。cron jobを追加しません。.
--ecc楕円曲線暗号(ECC)を利用することを指定します。'--installcert', '--renew', '--revoke', '--toPkcs' , '--createCSR'コマンドで使用します。
--csr利用するCSRを指定します。
--pre-hook証明書を取得する前に実行するコマンド
--post-hook証明書を再取得した際に、再取得が成功したか、失敗したかに関係なく、実行するコマンド。
--renew-hook証明書を再取得した際に、再取得が成功した場合に実行するコマンド。
--ocsp-must-staple, --ocspOCSP Must ステープル拡張を追加して証明書を発行します。
--auto-upgrade [0|1]'--upgrade'コマンドで使用します。自動アップグレードを設定します。
--listen-v4スタンドアローンモードにおいて、強制的にサーバをIPv4にバインドします。
--listen-v6スタンドアローンモードにおいて、強制的にサーバをIPv6にバインドします。
[ACMEについて] >> Let's Encrypt(無償の証明書発行機関)から取得

©Copyrights 2015-2023, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。