はじめに
AD CS などの認証局を使わずに、コマンドで ルート証明書 と サーバー証明書 を作成する手順です。
テスト目的で、簡単に 自己署名証明書(いわゆる オレオレ証明書)を作成できるので、便利です。
Web サービスで利用するためには、作成した2種類の証明書をそれぞれ配備する必要があります。
- ルート証明書 = クライアント PC に配置する
- サーバー証明書 = IIS などの Web サーバーに配置する
証明書を作成したあとに、各ホストに配備するために、一旦 エクスポートして、ローカルコンピューター のストアにインポートするまでの一連の手順を用意してみました。
この手順で作成した証明書を使って、以下の記事で紹介している VPN (SSTP) や IIS の接続で問題なく利用できることも確認済みです。
以下の記事は、公的証明書 をバインドしていますが、自己署名証明書 でも利用できるのです。
手順
1. ルート証明書 の作成
以下のコマンドで、ルート証明書 を作成します。
Subject 欄の "SstpRootCert" は、任意の名前に変更しても大丈夫です。
NotAfter の AddMonths の (24) は、証明書の有効期限を 24ヵ月後に設定しています。
ここを可変させることで、有効期限を調整できます。
あとは、PowerShell(管理者)ウィンドウを開いて、貼り付け&実行 してください。
貼り付けるコマンド
$params = @{
Type = 'Custom'
Subject = 'CN=SstpRootCert'
KeySpec = 'Signature'
KeyExportPolicy = 'Exportable'
KeyUsage = 'CertSign'
KeyUsageProperty = 'Sign'
KeyLength = 2048
HashAlgorithm = 'sha256'
NotAfter = (Get-Date).AddMonths(24)
CertStoreLocation = 'Cert:\CurrentUser\My'
}
$cert = New-SelfSignedCertificate @params
$cert
注意
上記のウィンドウは、閉じずに 次の章へ進んでください。
変数($cert)に保存された値を 次のコマンドで引き継いで利用しているためです。
2. サーバー証明書 の作成
以下のコマンドで、サーバー証明書 を作成します。
Subject 欄 と DnsName 欄 の "vpnnogu.japaneast.cloudapp.azure.com" は、任意の名前に変更してください。サーバーへ接続する際の URL などを指定してください。
NotAfter の AddMonths の (24) は、証明書の有効期限を 24ヵ月後に設定しています。
ここを可変させることで、有効期限を調整できます。
貼り付けるコマンド
$params = @{
Type = 'Custom'
Subject = 'CN=vpnnogu.japaneast.cloudapp.azure.com'
DnsName = 'vpnnogu.japaneast.cloudapp.azure.com'
KeySpec = 'Signature'
KeyExportPolicy = 'Exportable'
KeyLength = 2048
HashAlgorithm = 'sha256'
NotAfter = (Get-Date).AddMonths(24)
CertStoreLocation = 'Cert:\CurrentUser\My'
Signer = $cert
TextExtension = @(
'2.5.29.37={text}1.3.6.1.5.5.7.3.1')
}
New-SelfSignedCertificate @params
3. 作成された証明書の確認
この作業で、作成された証明書を目視確認します。
- スタートボタンを右クリックして、ファイル名を指定して実行 を選択します。
-
certmgr.msc と入力して、OK を押します。
- 下図のとおり、個人 の証明書ストア を開くと、作成された証明書を確認できます。
- 緑色 = ルート証明書
- 水色 = サーバー証明書
作成された証明書を、ログオン中の ユーザーのみ で利用する場合は、これで 完了 です。
サーバーの機能などで利用する場合は、ローカルコンピューター のストアに配置されている必要があるため、次章以降の手順で 証明書の場所を移動します。
4. サーバー証明書 の エクスポート
作成された証明書は、ローカルユーザーのストアに存在しているため、ローカルコンピューターのストアや、他のサーバーで利用するために、必ず 一旦 エクスポートが必要です。
- 作成された サーバー証明書 を右クリックして すべてのタスク から エクスポート を選択します。
- 以下の画面では、そのまま 次へ をクリックします。
- 以下の画面では、必ず "はい、秘密キーをエクスポートします" を選択して 次へ を押します。
- 以下の画面では、そのまま 次へ をクリックします。
- パスワード欄にチェックを入れて、パスワードを入力します。そのあと 次へ をクリックします。
- ① "参照" ボタンを押して、任意のファイル名を指定して、② のように表示されたことを確認したら、③ "次へ" を押します。
① を押した際に表示される画面
- 以下の画面が表示されれば OK です。完了 をクリックします。
- 以下の画面が表示されたら OK を押して終了します。
5. サーバー証明書を ローカルコンピューター へ インポート する
前章でエクスポートしたファイルを選択して、ローカルコンピューターへインポートします。
別の Web サーバー等にインポートする場合は、エクスポートした pfx ファイルを コピーしてから コピー先のコンピューター上で実行します。
- pfx ファイルを右クリックして PFX のインストール を選択します。
- 以下の画面では、必ず ローカルコンピューター を選択して 次へ をクリックします。
- 以下の画面では、そのまま 次へ をクリックします。
- 以下の画面では、エクスポート時に指定した パスワード を入力して 次へ をクリックします。
- 以下の画面では、"証明書の種類に基づいて、自動的に証明書ストアを選択する" が選択されている事を確認して 次へ をクリックします。
- 以下の画面がでれば OK です。完了 をクリックします。
- 以下の画面が表示されたら OK を押して終了します。
6. 結果確認
- スタートボタンを右クリックして、ファイル名を指定して実行 を選択します。
-
certlm.msc と入力して、OK を押します。
- 以下の通り、信頼されたルート証明機関 の証明書ストアを開き、インポートした ルート証明書 があることを確認します。
- 以下の通り、個人 の証明書ストアを開き、インポートした サーバー証明書 があることを確認します。
- サーバー証明書 をダブルクリックして 証明のパス タブを開きます。下図のように ルート証明書 と サーバー証明書 が 階層構造で表示され、この証明書は問題ありません になっていることを確認します。OK を押して終了します。
以上の作業で、テスト用に作成した 自己署名証明書を ローカルコンピュータ のストアに保存できました。
このあと、Web サービス側で Web サイトと サーバー証明書とをバインドを行うことで、サーバー証明書 が実際に機能するようになります。
7. クライアントへの配布用に ルート証明書 をエクスポートする
- 信頼されたルート証明機関 の証明書ストアにある ルート証明書 を右クリックして すべてのタスク から エクスポート を選択します。
- 以下の画面では 次へ をクリックします。
- 以下の画面では Basse 64 encoded X.509 (.CER) を選択して 次へ をクリックします。
- ① "参照" ボタンを押して、任意のファイル名を指定して、② のように表示されたことを確認したら、③ "次へ" を押します。
① を押した際に表示される画面
- 以下の画面がでれば OK です。完了 をクリックします。
- 以下の画面が表示されたら OK を押して終了します。
- 以下の通り、エクスポートされたファイルを クライアント PC へコピーして 利用してください。
8. クライアントへ ルート証明書 をインポートする
- クライアントへコピーされた ルート証明書 をダブルクリックします。
- 以下の画面で 証明書のインストール をクリックします。
-
保存場所 は ローカル コンピューター を選択して 次へ をクリックします。
-
参照 ボタンを押したあと、信頼されたルート証明機関 を選択して、最後に 次へ をクリックします。
- 以下の画面が表示されたら 完了 を押して終了します。
-
ファイル名を指定して実行 から、Certlm.msc を起動し、信頼されたルート証明機関 の 証明書ストア上に、ルート証明書 がインポートされたことを確認します。
以上で、クライアントへ ルート証明書 のインポートが完了しました。
ルート証明書がインポートされた PC から、サーバー証明書 のある Web サービス へアクセスし、正常に サーバーにアクセスできることを確認してください。
参考
この記事の作成にあたっては、以下の公開情報を参考にしています。
公開情報の内容は、ルート証明書 と クライアント証明書 を作成する手順になっていますが、これを元に サーバー証明書 を作成する内容に改変していますが、違いは 以下の場所だけです。
サーバー証明書
TextExtension = @(
'2.5.29.37={text}1.3.6.1.5.5.7.3.1')
クライアント証明書
TextExtension = @(
'2.5.29.37={text}1.3.6.1.5.5.7.3.2')