ワイルドカード証明書が取得できましたので、それを使って外部から参照できないWindowsのIISサーバにインストールおよび自動更新をしていきたいと思います。
まずWindowsに証明書をインストールするには、PEM(.pem)形式からPKCS12(.pfx)形式に変換する必要があります。変換にはopensslを使用します。証明書が更新されたときに実行されるスクリプトcertbot-deploy.shに下記を追加します。
openssl pkcs12 -export -in /etc/letsencrypt/live/example.com/fullchain.pem -inkey /etc/letsencrypt/live/example.com/privkey.pem -out /etc/letsencrypt/pfx/example.com/fullchain.pfx -passout file:/etc/letsencrypt/pfx/pass.txt
/etc/letsencryptにpfxディレクトリ、/etc/letsencrypt/pfxにexample.comディレクトリを作成して、任意のパスワードを書いたpass.txtを作成して入れておきます。
# cd /etc/letsencrypt
# mkdir pfx
# cd pfx
# echo password > pass.txt
# mkdir example.com
証明書が更新され上記が実行されると/etc/letsencrypt/pfx/example.com/fullchain.pfxが作成されます。
Windows側にファイルを移す方法はいくつかありますが今回はweb経由で転送します。
VirtualHostにAlias /pfx /etc/letsencrypt/pfx/example.comを追加して、/etc/httpd/conf.d/pfx.confを作成します。
pfx.conf
<Directory /etc/letsencrypt/pfx/example.com/>
<IfModule mod_authz_core.c>
Require ip 172.16.1.0/24
</IfModule>
</Directory>
Require ipで内部からのみ許可するようにします。
Windowsにはwgetが標準ではありませんので、
Wget for Windowsをインストールします。インストールしたら実行ファイルにパスを通しておきます。
環境変数pathにC:\Program Files\GnuWin32\bin;を追加します。
cmd.exeを起動して,
D:\letsencrypt>wget https://www.example.com/pfx/fullchain.pfx --no-check-certificate -N
とするとダウンロードできます。
ダウンロードしたら証明書をインストールします。インストールには、certutilコマンドを使います。
D:\letsencrypt>certutil -f -p password -importpfx fullchain.pfx
とするとインストールできます。後は、IISマネージャからバインドすれば有効になるはずです。
更新ですが3か月毎に手動更新するのは大変なのでbatファイルを作成してタスクスケジューラで毎日1回実行することにします。私が管理しているのはIIS6とIIS8があります。IIS6では、appcmd.exeがありませんので、設定をエクスポートして置換してからインポートし直しています。エクスポートしたファイルはUTF-8です。コードページの変更とかが面倒ですので、置換には
mfindを使わせてもらっています。
renew_cert_iis8.bat
@echo off
set url=https://www.example.com/pfx/
set passwd=password
set file1=fullchain.pfx
set file2=fullchain.live.pfx
set cn=*.example.com
setlocal ENABLEDELAYEDEXPANSION
echo * DownloadFile
wget %url%%file1% --no-check-certificate -N
echo * CheckFile
set timestamp1=
set timestamp2=
for %%a in (%file1%) do set timestamp1=%%~ta
for %%b in (%file2%) do set timestamp2=%%~tb
if "%timestamp1%" == "%timestamp2%" (
echo Not Renew Cert
) else (
if "%timestamp1%" gtr "%timestamp2%" (
echo Renew Cert
echo * Import Cert
certutil -f -p %passwd% -importpfx %file1%
copy %file1% %file2% > nul
echo * SSL CertHash
set n=0
for /f "tokens=2,* usebackq" %%a in ( `certutil -store my %cn%^| findstr /c:"Cert ハッシュ(sha1)"` ) do (
set CERTHASH[!n!]=%%b
set /a n=n+1
)
set n=0
for /f "tokens=1,2 usebackq" %%a in ( `certutil -store my %cn%^| findstr /c:"この日以前: "` ) do (
set CERTDATE[!n!]=%%b
set /a n=n+1
)
set n=0
set t1=0000/00/00
set t2=0000/00/00
:BEGIN
call set dt=%%CERTDATE[!n!]%%
if defined dt (
if !t1! leq !dt! (
set t2=!t1!
set n2=!n1!
set t1=!dt!
set n1=!n!
) else (
if !t2! leq !dt! (
set t2=!dt!
set n2=!n!
)
)
set /a n=n+1
goto BEGIN
)
call set NEWHASH=%%CERTHASH[%n1%]: =%%
call set OLDHASH=%%CERTHASH[%n2%]: =%%
echo NEWHASH=%NEWHASH% [NotAfter: %t1%]
echo OLDHASH=%OLDHASH% [NotAfter: %t2%]
echo * Rewrite CertHash
%SystemRoot%\System32\inetsrv\appcmd.exe renew binding /oldcert:%OLDHASH% /newcert:%NEWHASH%
echo Update done
) else (
echo Not Renew Cert
)
)
renew_cert_iis6.bat
@echo off
set url=https://www.example.com/pfx/
set passwd=password
set cn=*.example.com
set file1=fullchain.pfx
set file2=fullchain.live.pfx
set file3=iiscnfg.xml
set site1=/lm/w3svc/1
set site2=w3svc/1
setlocal ENABLEDELAYEDEXPANSION
echo * DownloadFile
wget %url%%file1% --no-check-certificate -N
echo * CheckFile
set timestamp1=
set timestamp2=
for %%a in (%file1%) do set timestamp1=%%~ta
for %%b in (%file2%) do set timestamp2=%%~tb
if "%timestamp1%" == "%timestamp2%" (
echo Not Renew Cert
) else (
if "%timestamp1%" gtr "%timestamp2%" (
echo Renew Cert
echo * Import Cert
certutil -f -p %passwd% -importpfx %file1%
copy %file1% %file2% > nul
echo * SSL CertHash
set n=0
for /f "tokens=2,* usebackq" %%a in ( `certutil -store -v my %cn%^| findstr /c:"Cert ハッシュ(sha1)"` ) do (
set CERTHASH[!n!]=%%b
set /a n=n+1
)
set n=0
for /f "tokens=1,2 usebackq" %%a in ( `certutil -store -v my %cn%^| findstr /c:"この日以前: "` ) do (
set CERTDATE[!n!]=%%b
set /a n=n+1
)
set n=0
set t1=0000/00/00
set t2=0000/00/00
:BEGIN
call set dt=%%CERTDATE[!n!]%%
if defined dt (
if !t1! leq !dt! (
set t2=!t1!
set n2=!n1!
set t1=!dt!
set n1=!n!
) else (
if !t2! leq !dt! (
set t2=!dt!
set n2=!n!
)
)
set /a n=n+1
goto BEGIN
)
call set NEWHASH=%%CERTHASH[%n1%]: =%%
call set OLDHASH=%%CERTHASH[%n2%]: =%%
echo NEWHASH=%NEWHASH% [NotAfter: %t1%]
echo OLDHASH=%OLDHASH% [NotAfter: %t2%]
echo * Export Settings
del /q %file3% 2> nul
iiscnfg /export /f %file3% /sp %site% /inherited /children
echo * Rewrite CertHash
mfind /W /E8 /%OLDHASH%/%NEWHASH%/l %file3%
echo * Import Setting
iiscnfg /import /f %file3% /sp %site1% /dp %site1% /inherited /children
del /q %file3% 2> nul
echo * Restart IIS
iisweb /start %site2%
del %file2%
copy %file1% %file2% > nul
) else (
echo Not Renew Cert
)
)