こんにちは、サイオステクノロジーの小川です。
今回はPowershellでマルチドメインに対応した自己証明書を作成し、Active DirectoryのLDAPS接続を実現する設定方法を紹介します。
以前にPowershellで自己証明書を作成る方法についても紹介していますが、今回はマルチドメインに対応した設定方法について紹介します。
今回はAD2台に対してマルチドメイン証明書を設定し、ADへLDAPS接続を行えるようにします。
AD1での設定
Powershellの証明書作成は、New-SelfSignedCertificateコマンドを実行します。
マルチドメイン証明書を作成するにはDnsNameオプションでカンマ区切りで必要なDNS名を設定します。(DnsNameに複数設定し、Subjectにコンピュータ名を指定していた場合、Subjectの値は証明書のDNS名としては無視されます。)
以下コマンドは証明書を作成する際のオプション例です。オプションの詳細は以下の表を参照してください。
$cert = New-SelfSignedCertificate -Subject "AD SSL Cert" -DnsName "ad1.example.com","ad2.example.com" -CertStoreLocation "cert:\LocalMachine\My" -KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy ExportableEncrypted -NotAfter (Get-Date).AddYears(10) $cert
証明書作成のオプション
オプション | 説明 |
-Subject | 証明書のサブジェクト名を指定 |
-DnsName | 証明書のサブジェクト代替名に設定するDNS名を指定 |
-CertStoreLocation | 証明書を保存する証明書ストアを指定する |
-KeyAlgorithm | 証明書の秘密鍵の暗号化アルゴリズムを指定 |
-KeyLength | 証明書のキーの長さを指定 |
-KeyExportPolicy | 証明書の秘密鍵をエクスポートするかどうか 暗号化しない場合はExportable、エクスポートを許可しない場合はNonExportableを指定する |
-NotAfter | 証明書の有効期限を設定 デフォルトは1年 |
より詳細なオプションについてはこちらを参照してください。
コマンドを実行すると、作成された秘密鍵を含んだ証明書がローカルコンピュータの証明書ストアに格納されます。
証明書が格納されたことを確認するにはスタートボタンを右クリックし、「ファイル名を指定して実行」で「certlm.msc」と入力し、個人の証明書ストアを表示します。
サブジェクト代替名に複数のAD1とAD2のDNS名が設定されていることが確認できます。
作成した自己証明書を信頼してあげないと、実際にSSL通信を行うことができないので、信頼されたルート証明機関に格納します。
先ほど格納した秘密鍵付き証明書から、証明書のみを以下コマンドでエクスポートします。
Export-Certificate -Cert $cert -FilePath example.com.cer
エクスポートした証明書を以下コマンドを実行し、信頼されたルート証明機関に格納します。
Import-Certificate -FilePath example.com.cer -CertStoreLocation "cert:\LocalMachine\Root"
他のサーバに秘密鍵をインポートするために秘密鍵付き証明書をpfx形式でエクスポートします。
$cn = "CN=AD SSL Cert" $thumbprint = (Get-ChildItem Cert:\LocalMachine\My | ? {$_.Subject -eq $cn}).thumbprint $pfx = "cert:\LocalMachine\My\$thumbprint" $password = ConvertTo-SecureString -Force -AsPlainText -String "<秘密鍵付き証明書をインポートするパスワード>" Export-PfxCertificate -cert $pfx -Filepath example.com.pfx -Password $password
出力したpfxファイルとcerファイルをad2へコピーします
AD2の設定
AD2の適当なフォルダにpfxファイルとcerファイルを配置します。
Powershellで証明書をインポートします。(証明書を配置したフォルダをカレントディレクトリとします。)
cerファイルをAD1同様信頼できるルート証明機関にインポートします。
Import-Certificate -FilePath example.com.cer -CertStoreLocation "cert:\LocalMachine\Root"
pfxファイルを以下のコマンドを実行し、個人の証明書ストアにインポートします。パスワードはAD1でpfxファイルをエクスポートした際に設定したパスワードを入力します。
$password = ConvertTo-SecureString -Force -AsPlainText -String "<秘密鍵付き証明書をインポートするパスワード>" Import-PfxCertificate -FilePath example.com.pfx -CertStoreLocation "cert:\LocalMachine\My" -Password $password
クライアントの設定
ADへLDAPS接続を行うクライアントにて証明書をインポートします。(証明書を配置したフォルダをカレントディレクトリとします。)
Powershellの以下コマンドでcerファイルを信頼できるルート証明機関にインポートします。
Import-Certificate -FilePath example.com.cer -CertStoreLocation "cert:\LocalMachine\Root"
番外編
上記で紹介したコマンドをまとめてスクリプトを以下に作成しました。以下スクリプトを実行すると、証明書をストアに格納するまで行います。
- マルチドメイン証明書作成スクリプト(例)
cd C:\tmp ## ## Create self signed certificate ## $subject = Read-Host "証明書のsubject名を入力してください。" $dnsname = Read-Host "証明書に利用するFQDN名を入力してください。(複数の場合はカンマ区切りで入力)" $dns = $dnsname.Split(",") $filepath = Read-Host "Exportするファイル名を入力してください。(拡張子を除く)" $password = Read-Host "pfx証明書のパスワードを入力してください。" -AsSecureString $repassword = Read-Host "再度パスワードを入力してください。" -AsSecureString ## ## Password Check ## $bstrInpass = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password) $plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstrInpass) $bstrInRePass = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($repassword) $plainRePass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstrInRePass) function InputPassCheck { if ( $plainPass -ne $plainRePass ) { Write-Host "パスワードチェックNG" exit 1 } Write-Host "パスワードチェックOK" } InputPassCheck ## ## Issuance of certificate ## $cert = New-SelfSignedCertificate -Subject $subject -DnsName $dns -CertStoreLocation "cert:\LocalMachine\My" -KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy ExportableEncrypted -NotAfter (Get-Date).AddYears(10) $cert ## ## Export new self signed certificate as .cer file ## $cerfile = "$filepath.cer" Export-Certificate -Cert $cert -FilePath $cerfile ## ## Import the new self signed certificate into Trusted Root Certification Authorities ## Import-Certificate -FilePath $cerfile -CertStoreLocation "cert:\LocalMachine\Root" ## ## Get Cert Thumbprint ## $cn = "CN=$subject" $thumbprint = (Get-ChildItem Cert:\LocalMachine\My | ? {$_.Subject -eq $cn}).thumbprint ## ## Export new self signed certificate as .pfx file ## $pfx = "cert:\LocalMachine\My\$thumbprint" $pfxfile = "$filepath.pfx" Export-PfxCertificate -cert $pfx -Filepath $pfxfile -Password $password
- 証明書インストールスクリプト(例)
上記スクリプトで証明書を作成した後、別サーバに証明書を配置し、ローカルの証明書ストアに格納するスクリプトになります。
※ cerファイルとpfxファイルをC:\tmp フォルダに配置していることを想定しています。
cd C:\tmp $filepath = Read-Host "Importするファイル名を入力してください。(拡張子を除く)" $password = Read-Host "pfx証明書のパスワードを入力してください。" -AsSecureString ## ## Import the new self signed certificate into Trusted Root Certification Authorities ## $cerfile = "$filepath.cer" Import-Certificate -FilePath $cerfile -CertStoreLocation "cert:\LocalMachine\Root" ## ## Export new self signed certificate as .pfx file ## $pfxfile = "$filepath.pfx" Import-PfxCertificate -FilePath $pfxfile -CertStoreLocation "cert:\LocalMachine\My" -Password $password