2018年9月20日木曜日

Let's Encrypt で取得したワイルドカード証明書をIISサーバで使いたい


ワイルドカード証明書が取得できましたので、それを使って外部から参照できない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
    )
)

0 件のコメント:

コメントを投稿

postfix main.cf smtpd_sender_restrictions

最近、メールサーバでキューを確認すると、やたらと???@0000.comへのバウンスメールが溜まっている。 中身を確認すると、PICほにゃららというファイル名で難読化したJavaScriptが添付されているメールです。 何が目的なのか分かりませんが、ごみメール送ってきてバウン...