Let’s Encrypt の証明書を OS X Server で使う

ここ数年 OS X の SSL 証明書は StartSSL の無料証明書を使い続けてたんだけど、今年の更新で今までドメイン+1ホストだった無料証明書が5ホストまでイケるって仕様変更(いつから?)のおかげで、ドメイン自体の証明書を取り損ねてしまったので、これを気に Let’s Encrypt の証明書に乗り換えることにしたのです。

気づけば Complete guide to install SSL certificate on your OS X server hosted website なんて OS X Server 向けのガイドが公開されていたので悩むところはあんまりないのだけど、きっと何やったか忘れるのでメモw

  1. Install let’s Encrypt client | Let’s Encrypt クライアントの入手
    ガイドでは Homebrew 入れろとか書いてありますが、パッケージシステムぐらい好きに選ばせろよ、ということで相変わらず pkgsrc です。 wip にあるはずの py-letsencrypt が見つからないと悩んだ挙句に現在は本家のコマンドが letsencrypt から certbot って名前に変わったのを反映してて、ついでに wip から本家にマージされて security/py-certbot になってたってことに気づくのに偉い時間がかかりましたが、気づいてしまえば bmake install 一発なの楽チンです、多分。
  2. (test and) generate the certificate | 証明書の作成
    ここは、基本的には letsencrypt-auto を certbot に読み替えるだけなのであんまり何も考える必要がなさそう。初回はこのガイドのままで良いんだけど、 2 回目(というか更新時)は cert.ini の domains 行をコメントアウトして、certonly じゃなくて renew したほうが楽じゃないかなー、という気がしないでもない。 OS X Server の証明書のインストールを cli からやる方法を知らなかったので、/usr/bin/security で出来るというあたりに感動。
  3. configure your website | サイトの設定
    証明書のインストールが cli で出来るんだから、証明書の選択やらなんやらも serveradmin のオプションあたりで出来るんじゃないかと思うけど、わからんので  GUI というか Server.app からやるしかないのかなぁ…? なお Server.app から設定だと web サイトの他、 OpenDirectory, Dovcot, postfix, Message でも使われるので結構面倒臭い。というか OD の証明書切り替えとか手動でやりたくないしw
  4. (test and) automate the renewal | 証明書更新の自動化
    証明書の取り込みまでは自動化できるけど、切り替えは今の所手動というのがダサい。
  5. Enjoy… | 楽しもう
    お祝いにビールかなんかを飲むらしいのだけれど、下戸なので、代わりにこのエントリを書いたのでした(笑

ということでうちの cert.ini と get_cert.sh を晒してみるプレイ。作成された証明書の有効期間は 3 ヶ月っぽいので、 9 月に入ったらこれで正しいのか試せるのかな…?

  • cert.ini
# Use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096
# Register with the specified e-mail address
email = root@example.jp
# Generate certificates for the specified domains.
# domains = example.jp, www.example.jp, mail.example.jp
# Uncomment to use a text interface instead of ncurses
# text = True
# To use the webroot authenticator.
authenticator = webroot
webroot-path = /Library/Server/Web/Data/Sites/Default
  • get_cert.sh
#!/bin/sh

DOMAIN_DEFAULT=example.jp
CERTBOT_ROOT="/Users/goro/Documents/cert/letsencrypt/my_script/"
PEM_FOLDER="${CERTBOT_ROOT}/live/${DOMAIN_DEFAULT}/"
LOG_FOLDER="${CERTBOT_ROOT}/logs/" 
DATE=$(date +"%d-%m-%y")
LOG_FILE="${LOG_FOLDER}/${DATE}.log" 

# Retrieve certificate - DELETE --dry-run AFTER THE TEST RUN WORKED
/opt/pkg/bin/certbot renew -c ${CERTBOT_ROOT}cert.ini --config-dir ${CERTBOT_ROOT} --logs-dir ${LOG_FOLDER} 

# Check that everything went fine
LE_STATUS=$?

if [ "${LE_STATUS}" != 0 ]; then
    echo Automated Get certificate failed:
    cat ${LOG_FILE}
    exit 1
fi
 
# Generate a passphrase - UNCOMMENT THE NEXT LINE AFTER THE TEST RUN WORKED
PASS=$(openssl rand -base64 45 | tr -d /=+ | cut -c -30)

# Transform the pem files into a OS X Valid p12 file - UNCOMMENT THE NEXT LINE AFTER THE TEST RUN WORKED
openssl pkcs12 -export -inkey "${PEM_FOLDER}privkey.pem" -in "${PEM_FOLDER}cert.pem" -certfile "${PEM_FOLDER}fullchain.pem" -out "${PEM_FOLDER}letsencrypt_sslcert.p12" -passout pass:${PASS}

# import the p12 file in keychain - UNCOMMENT THE NEXT LINE AFTER THE TEST RUN WORKED
sudo security import "${PEM_FOLDER}letsencrypt_sslcert.p12" -f pkcs12 -k /Library/Keychains/System.keychain -P ${PASS} -T /Applications/Server.app/Contents/ServerRoot/System/Library/CoreServices/ServerManagerDaemon.bundle/Contents/MacOS/servermgrd

「Let’s Encrypt の証明書を OS X Server で使う」への6件のフィードバック

  1. 通りすがりに失礼します。encryptでFake証明書を複数作成してget_cert.shを試したのですが、証明書が追加されるだけでsever.app内の証明書「サービスのセキュリティ保護に使用」が変更されないので、各サービスが古い証明書を参照したままとなります。手動で切り替えるとシステムログに何らかのコマンドが起動している情報が残るのですが、何か情報があれば御教示頂けると幸いです。

  2. 質問の意図がよくわからないんですが、 get_cert.sh を動かしても server.app の証明書は切り替わらないので手動で切り替える必要があります。で、切り替えると、切り替えられたサービスはその場で証明書周りの再読み込み(かサービス再起動)が行われます。証明書が切り替わったかを確認したいのであれば、web ブラウザで証明書を表示とするか、 openssl で叩くかですね。

  3. ご返答ありがとうございます。コメント欄の字数の関係で、詳細に書けず済みません。何がしたいかと言うと、encryptの証明書更新まではスクリプトで自動化出来ているので、Server.appでの証明書更新も自動化出来ないかなと言う事です。get_cert.sh実行後の証明書切り替えが手動になるのは存じておりまして、その手動で切り替えるアクションと対を為すコマンドがないかと、コメントを残させて頂きました。

コメントを残す