Apacheのサーバー証明書をメールで利用

はじめに

A.K.I Softwareのメールサーバーソフト「PMailServer2」の導入を機に今更ながらメールを暗号化することにした。
今まで使用していたソフト(ArgoSoft MailServer)は暗号化しておらず(暗号化可能?),平文で送受信していたが,今回導入した「PMailServer2」はSSL/TSLの 暗号化通信に対応しており,Windows OS の schannel を利用して SSL/TLS 通信を行うようなので,Windowsの証明書ストアにドメイン証明書をインポートする必要がある。その手順をメモる。

Apacheのサーバー証明書

Apacheのサーバー証明書はLet’s Encryptから取得しており,これを利用してメールを暗号化しようと思う。Apacheのサーバー証明書取得に伴う設定は過去記事参照。
【参考記事】
サーバーSSL/TLS化検討・導入 メモ – na-blog_気ままな撮影独り言(撮影メモ) (na-3.com)
apacheのバージョンアップ – na-blog (na-3.com)

サーバー証明書はApacheインストールフォルダーの「\md\domains\ドメイン名」に保存されており,秘密鍵ファイル(privkey.pem)とサーバ証明書情報(pubcert.pem)の2つのフアイルがある。
pem形式ファイルで保存されているので,Windowsの証明書ストアにインポートする為にはPKCS#12形式ファイルに変換する必要がある。

OpenSSLインストール

サーバー証明書の形式変換にはOpenSSLを使用するので,パソコンにインストールする。
OpenSSLのサイトからライト版の「Win64 OpenSSL v3.3.2 Light」(5MB Installer)をダウンロードする。
インストール後に環境変数のPathを追加。(OpenSSLインストールフオルダー\bin)

サーバー証明書変換

Apacheサーバー証明書のpem形式ファイルからWindowsの証明書ストアにインポートするPKCS#12形式に変換して,一旦保存する。
PKCS#12形式ファイルは拡張子が「.pfk」又は「.p12」で作成する。
ここで重要な点は,この後にサーバー証明書をインポートするWindowsのバージョンによってサーバー証明書のアルゴリズムを変える必要がある。
WindowsServer2016以前はTripleDES-SHA1 暗号化を使用する。
WindowsServer2019以降とWindows10以降はAES256-SHA256 暗号化又はTripleDES-SHA1 暗号化を使用する。今回はTripleDES-SHA1 暗号化で統一した。
パスワードはApacheサーバー証明書では無しなので,変換後も無しで作成する。
下記のopensslコマンドをコマンドプロンプトから入力して今回はTripleDES-SHA1 暗号化に変換処理する。

cd /D "D:\Program Files\Apache24\md\domains\ドメイン名"

rem TripleDES-SHA1 暗号化
openssl pkcs12 -macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -inkey privkey.pem -in pubcert.pem -out sha1.pfx -passin pass:"" -passout pass:""

または

rem AES256-SHA256 暗号化
openssl pkcs12 -macalg SHA256 -keypbe AES-256-CBC -certpbe AES-256-CBC -export -inkey privkey.pem -in pubcert.pem -out sha256.pfx -passin pass:"" -passout pass:""

変換・作成されたPKCS#12形式証明書ファイル(sha1.pfk 又は sha256.pfk)はApacheの「\md\domains\ドメイン名」フォルダーに作成される。

Windowsの証明書ストアにインポート

Windowsの証明書ストアにインポートする方法は管理コンソールから対話形式で行う方法とコマンド(パワーシェル)等で行う方法があるが,今後は人手を介さず自動で行わせたいのでコマンドでインポートする。
powershellの「Import-PfxCertificate」コマンドを使用してWindowsの証明書ストア(信頼された発行元)にインポートする。

証明書ストア名
My:個人
Root:信頼されたルート証明機関
CertificateAuthority:中間証明機関
AddressBook:ほかの人
TrustedPublisher:信頼された発行元
Disallowed:信頼されていない証明書
AuthRoot:サードパーティ・ルート証明機関
TrustedPeople:信頼されたユーザー

インポートコマンド

Import-PfxCertificate -FilePath "D:\Program Files\Apache24\md\domains\ドメイン名\sha1.pfx" Cert:\LocalMachine\TrustedPublisher

パワーシェルコマンド実行結果(証明書インポート)

PS C:\Users\Administrator> Import-PfxCertificate -FilePath "D:\Program Files\Apache24\md\domains\ドメイン名\sha1.pfx" Cert:\LocalMachine\TrustedPublisher

   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\TrustedPublisher

Thumbprint                                Subject              EnhancedKeyUsageList
----------                                -------              --------------------
E2A23C144C72C0DBB95402A1DFDB1BE0D4D468F9  CN=ドメイン名

インポート確認

スタートメニューのWindowsシステムツールから
「コントロールパネル」-「ネットワークとインターネット」-「インターネットオプション」-「コンテンツ・タブ」-「証明書(C)」-「信頼された発行元・タブ」と辿り確認する。又は
Win+Rキーを使って、「ファイル名を指定して実行」を開き、「control inetcpl.cpl」と入力してOKをクリックすれば、直接、「インターネットのプロパティ」を開くことができる。

自動インポート

ここまで行った処理の「Apacheサーバー証明書変換」と「Windowsの証明書ストアにインポート」を自働で行わせる為に,バッチファイルを作成・スタートアップに登録してサーバー起動時に毎回実施させる。又はタスクスケジューラーに任せる方法もある。
PowerShellコマンドの「Import-PfxCertificate」はコマンドプロンプトから投入するのでDOSコマンドの「powershell -Command」を使用してPowerShellへ引き渡す。
Apacheサーバー証明書は3ケ月毎に自動更新されるが,その間にサーバーは必ず再起動するので,Windows側の証明書は上書き処理させる。

rem  Apacheサーバー証明書を変換してストアにインポート    sslreg.bat

cd /D "D:\Program Files\Apache24\md\domains\ドメイン名"

rem TripleDES-SHA1 暗号化
openssl pkcs12 -macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -inkey privkey.pem -in pubcert.pem -out sha1.pfx -passin pass:"" -passout pass:""
timeout /t 5 /nobreak

rem 証明書インポート
powershell -Command Import-PfxCertificate -FilePath sha1.pfx Cert:\LocalMachine\TrustedPublisher
timeout /t 10 /nobreak

期限切れ証明書の削除

期限切れ証明書の削除を自動でと思ったのだが,ソフトによっては期限を無視しているものもあるみたいで(PMailServer2等),証明書によっては削除確認が必要なのでしばらくは手動削除とする。


次は「PMailServer2」のインストール・設定・証明書の確認を行う。