Powershellでマルチドメイン自己証明書を作成する ~ActiveDirectoryのLDAPS(LDAP over TLS/SSL)を実現する~

こんにちは、サイオステクノロジーの小川です。

今回は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
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です