無料のLet's Encrypt TLS/SSL証明書をIIS Webサーバー/RDSにインストールする方法
本ガイドでは、Windows Server 2019/2016/2012 R2上で動作するIIS Webサーバーのサイトに対して、無料のTLS/SSL証明書「Let's Encrypt」をインストールし、バインドする方法を解説します。
目次
- Let's EncryptとWindows向けACMEクライアント
- WACSクライアントを使ったIISへのLet's Encrypt証明書のインストール
- IIS URL RewriteによるHTTPからHTTPSへのリダイレクト
- RDS Gateway・Web AccessでのLet's Encrypt証明書の活用
Let's EncryptとWindows向けACMEクライアント
WebサイトのTLS/SSL証明書は、公衆ネットワーク上でやり取りされるユーザーデータを中間者攻撃(MITM攻撃)から保護し、データの完全性を確保するために不可欠です。非営利認証局であるLet's Encryptは、APIを通じてHTTPS暗号化用のX.509 TLS証明書を自動的に無料で発行してくれます。発行されるのはドメイン検証(DV)タイプのみで、有効期限は90日間です(1ドメインあたり週50証明書の制限あり)。ただし、簡単なスケジューリング設定により、SSL証明書の自動更新が可能です。
Let's Encryptが証明書の自動発行に使用するAPIインターフェースはACME(Automated Certificate Management Environment)APIと呼ばれます。Windowsシステムで利用できる主要なACMEクライアント実装は以下の3つです。
- Windows ACME Simple(WACS):コマンドラインツール。対話形式でSSL証明書を発行し、IIS Webサーバー上の特定サイトにバインドできます。
- Powershell ACMESharpモジュール:ACME API経由でLet's Encryptサーバーと通信するためのコマンドレット群を備えたPowerShellライブラリ。
- Certify:ACME APIを使用してSSL証明書をGUIで対話的に管理できるWindows用グラフィカルツール。
WACSクライアントを使ったIISへのLet's Encrypt証明書のインストール
Let's EncryptからSSL証明書を取得する最も簡単な方法は、コンソールツールWindows ACME Simple(WACS)(旧プロジェクト名:LetsEncrypt-Win-Simple)を使うことです。これはシンプルなウィザード形式のツールで、IIS上で稼働しているサイトを選択するだけで、SSL証明書の自動発行とバインドが完了します。
ここでは、Windows Server 2016上で稼働しているIISサイトを想定します。目的は、Let's Encryptの無料SSL証明書を導入して、サイトをHTTPSモードへ切り替えることです。
まず、GitHub(https://github.com/PKISharp/win-acme/releases)から最新版のWACSクライアントをダウンロードします(執筆時点ではv2.0.10、ファイル名はwin-acme.v2.0.10.444.zipでした)。
zipアーカイブを、IISがインストールされているサーバー上の次のディレクトリに展開します:c:\inetpub\letsencrypt
注意:Win-Acmeの利用には.NET Framework 4.7.2以上が必要です。事前にインストール済みの.NET Frameworkのバージョンを確認しておきましょう。
管理者権限でコマンドプロンプトを開き、c:\inetpub\letsencryptディレクトリに移動してwacs.exeを実行します。すると、Let's Encrypt証明書の生成とIISサイトへのバインドを行う対話型ウィザードが起動します。新しい証明書を素早く作成するには、N(Create new certificates (simple for IIS))を選択します。
次に証明書の種類を選択します。今回の例ではエイリアス(複数のSAN/Subject Alternative Name)付き証明書は不要なので、「1. Single binding of an IIS site」を選択してください。ワイルドカード証明書が必要な場合はオプション「3」を選びます。
続いて、ユーティリティがIIS上で稼働しているサイトの一覧を表示し、証明書を発行する対象サイトの選択を求めます。
証明書の更新問題やその他の重要な通知・不正利用の報告を受け取るためのメールアドレスを入力します(カンマ区切りで複数指定可能)。あとは利用規約に同意すれば、Windows ACME SimpleがLet's Encryptサーバーに接続し、Webサイト用の新しいSSL証明書の自動生成を試みます。
IIS向けのLet's Encrypt SSL証明書の生成・インストール処理は完全に自動化されています。
デフォルトでは、ドメイン検証はhttp-01検証(SelfHosting)モードで行われます。この場合、Webサーバーを指すDNSレコードがドメインに登録されている必要があります。WACSをフルオプションのマニュアルモードで実行すると、検証タイプとして「4 [http-01] Create temporary application in IIS (recommended)」を選択できます。この場合、IIS Webサーバー上に小規模なアプリケーションが一時的に作成され、Let's Encryptサーバーがそのアプリケーションを通じてドメイン検証を実行できるようになります。
注意:TLS/HTTP検証の実行中は、サイトが完全修飾DNS名でインターネットからHTTP(80/TCP)およびHTTPS(443/TCP)プロトコル経由でアクセスできる必要があります。
WACSツールは、証明書の秘密鍵(*.pem)、証明書本体、およびその他のファイルをC:\Users\%username%\AppData\Roaming\letsencrypt-win-simpleに保存します。その後、バックグラウンドで生成されたLet's Encrypt SSL証明書をインストールし、IISサイトにバインドします。すでにサイトにSSL証明書(自己署名証明書など)がインストールされている場合は、新しい証明書に置き換えられます。
IISマネージャーで対象サイトのサイトバインド設定を開き、Let's Encrypt Authority X3が発行した証明書が使用されていることを確認しましょう。
Windowsの信頼されたルート証明機関ストアが更新されていれば、この証明書はコンピューター上で信頼されたものとして表示されます。
Let's EncryptのIIS証明書は、コンピューターの証明書ストア内のWeb Hosting → 証明書配下で確認できます。
Windows ACME Simpleは、証明書を自動更新するためのタスクをWindowsタスクスケジューラに新規作成します(win-acme-renew (acme-v02.api.letsencrypt.org))。このタスクは毎日起動し、証明書の更新は60日後に実行されます。タスクで実行されるコマンドは以下の通りです。
C:\inetpub\letsencrypt\wacs.exe --renew --baseuri "https://acme-v02.api.letsencrypt.org"
同じコマンドを使用して、Let's Encrypt証明書を手動で更新することも可能です。
IIS URL RewriteによるHTTPからHTTPSへのリダイレクト
すべてのHTTP通信をHTTPSのサイトURLへリダイレクトするには、Microsoft URL Rewriteモジュール(https://www.iis.net/downloads/microsoft/url-rewrite)をインストールし、サイト設定で「SSLが必要」オプションが無効になっていることを確認してください。その後、web.configにリライトルールを追加してリダイレクトを構成します。
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS Redirect" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
IISマネージャーのGUIからURL Rewrite拡張機能を使ってトラフィックのリダイレクトを設定することもできます。サイト → 対象サイト名 → URL Rewriteを選択してください。
新しいルールを作成します:「規則の追加」→「空白の規則」。
ルール名を指定し、以下のパラメータ値を変更します。
- 要求されたURL:パターンに一致する
- 使用:正規表現
- パターン:(.*)
次に条件セクションで、論理グループ化を「すべて一致」に変更し、「追加」をクリックします。以下の設定を指定します。
- 条件入力:{HTTPS}
- 入力文字列の確認:パターンに一致する
- パターン:^OFF$
最後にアクションブロックで以下を選択します。
- アクションの種類:リダイレクト
- リダイレクト先URL:https://{HTTP_HOST}/{R:1}
- リダイレクトの種類:永続的(301)
ブラウザーを開いてHTTPアドレスでサイトにアクセスしてみてください。HTTPSのURLへ自動的にリダイレクトされれば成功です。
RDS Gateway・Web AccessでのLet's Encrypt証明書の活用
RDS GatewayやRDS Web Accessを使用して外部ユーザーを社内ネットワークへ接続している場合、自己署名証明書の代わりにLet's Encryptの信頼されたSSL証明書を利用できます。ここでは、Windows Serverのリモートデスクトップサービスを保護するために、Let's Encrypt証明書を正しくインストールする方法を紹介します。
注意:リモートデスクトップゲートウェイサーバーにRDSHロールもインストールされている場合は、管理者以外のユーザーがWACSファイル格納ディレクトリ(例では c:\inetpub\letsencrypt)やLet's Encryptの証明書・キーが保存されているフォルダー(C:\ProgramData\win-acme)にアクセスできないように制限する必要があります。
その後、前述の手順と同様にRD Gatewayサーバー上でwacs.exeを実行します。対象のIISサイトを選択してください(通常は「Default Web Site」です)。Let's Encryptが新しい証明書を発行してIISサイトにバインドし、タスクスケジューラに証明書自動更新タスクが登録されます。
この証明書を手動でエクスポートし、SSLバインディングを通じて必要なRDSサービスにバインドすることもできますが、Let's Encrypt証明書は60日ごとに更新されるため、そのたびに手作業でこれらの操作を繰り返す必要があります。
そこで、PowerShellスクリプトを使って、Let's Encrypt証明書の更新後にRDS GatewayへSSL証明書を自動バインドする仕組みを構築しましょう。
win-acmeプロジェクトには、リモートデスクトップサービスに選択したSSL証明書をインストールできる既製スクリプトImportRDGateway.ps1(https://github.com/PKISharp/win-acme/tree/master/dist/Scripts)が用意されています。ただし、このスクリプトの主な欠点は、新しい証明書のサムプリントを手動で指定しなければならない点です。
ImportRDGateway.ps1 <certThumbprint>
指定したIISサイトから証明書のサムプリントを自動的に取得するには、ImportRDGateway.ps1をベースに改変したスクリプトImportRDGateway_Cert_From_IIS.ps1を使用します。
このスクリプトは手動でも実行できます。
powershell -File ImportRDGateway_Cert_From_IIS.ps1
RDS GatewayがIISの「Default Web Site」(インデックス0)上で稼働している場合は、スクリプトを変更せずにそのまま使えます。
IIS上のサイトIDを確認するには、PowerShellコンソールを開いて以下のコマンドを実行します。
Import-Module WebAdministration
Get-ChildItem IIS:Sites|ft -AutoSize
ID列に表示されるのがサイトのインデックスです。この値から1を引いた数が、PowerShellスクリプト27行目の「0」の代わりに指定すべきインデックスとなります。
$NewCertThumbprint = (Get-ChildItem IIS:SSLBindings)[0].Thumbprint
続いて、win-acme-renewのスケジュールタスクを開き、「操作」タブで新しいタスクを追加して、SSL証明書の更新後にImportRDGateway_Cert_From_IIS.ps1スクリプトが実行されるようにします。
PowerShellの実行ポリシーを変更したくない場合は、以下のコマンドでスクリプトを実行できます。
PowerShell.exe -ExecutionPolicy Bypass -File c:\inetpub\letsencrypt\ImportRDGateway_Cert_From_IIS.ps1
これで、Let's Encrypt証明書が更新されると直ちに、RDSへSSL証明書をバインドするスクリプトが実行されるようになります。この際、RD Gatewayサービスは以下のコマンドで自動的に再起動されます。
Restart-Service TSGateway
警告:TSGatewayサービスが再起動すると、すべてのアクティブなユーザーセッションが切断されます。そのため、証明書更新タスクの実行頻度は60日に1回程度に設定することをお勧めします。
-
Let's Encryptで無料のワイルドカードSSL証明書を取得する方法|acme.shを使った手順を徹底解説
現在、Webトラフィックの大部分はHTTPSによって暗号化されています。特に、業界大手企業が支援する認証局(CA)「Lets Encrypt」の登場以降、その普及はますます加速しています。Lets EncryptはSSL/TLS証明書を完全無料で提供しており、証明書の有効期限は90日です。 一般的な証明書は1つ以上の特定のドメイン名に紐づいています。そのため、「www.example.com」用の証明書は、このドメインでしか使用できません。一方、ワイルドカード証明書は親ドメインに対して発行され、その親ドメイン配下の任意のサブドメインで利用できます。たとえば「*.example.com」のワイ
-
無料SSL証明書と商用SSL証明書、どちらを選ぶべき?徹底比較ガイド
Web全体で暗号化技術の利用が急速に広がったことで、人々は「暗号化=信頼できるサイト」というイメージを持つようになりました。この流れは雪だるま式に拡大し、SSL/TLS暗号化を導入しないサイトは取り残されるという意識を多くのWebサイト運営者に与えることになりました。特にECサイトは、顧客が暗号化されていない環境でのオンライン取引に強い不安を抱くため、いち早くその圧力を感じた存在でした。個人や企業が所有するWebサイトにとって、暗号化は単なるセキュリティのためのアルゴリズム以上の意味を持ちます。認証局(CA)の存在や認証レベルの違いなど、より複雑な要素が絡んでくるのです。そして、Lets En