目次
はじめに
A.K.I Softwareのメールサーバーソフト「PMailServer2」の導入を機に今更ながらメールを暗号化することにした。
今まで使用していたソフト(ArgoSoft MailServer)は暗号化しておらず(暗号化可能?),平文で送受信していたが,今回導入した「PMailServer2」はSSL/TSLの 暗号化通信に対応しており,Windows OS の schannel を利用して SSL/TLS 通信を行うようなので,Windowsの証明書ストアにドメイン証明書をインポートする必要がある。その手順をメモる。
Apacheのサーバー証明書
Apacheのサーバー証明書はLet’s Encryptから取得しており,これを利用してメールを暗号化しようと思う。(webサーバーとmailサーバーが同じサーバー機前提)
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)をダウンロードする。インストール時のDLLファイルの保存場所は[The OpenSSL binaries (/bin) directory]を選択する。
インストール後に環境変数のPathを追加。(OpenSSLインストールフオルダー\bin)
事前にVisual C++再配布パッケージをインストールする必要がある。みたいだがインストール済だったので動作した。
サーバー証明書変換
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等),証明書によっては削除確認が必要なのでしばらくはGUIからの手動削除とする。
証明書が期限切れになっている場合,メールソフト立ち上げ時に下記の警告がポップアップする。「はい」を選択して継続可能。
コマンドによる削除方法
どうしても自動で削除する場合は「certutil.exe」の「-delstore」を使用して削除する方法がある。ただし下記の注意書きが記載されているので,自己責任で行う。
証明書インポートも「-addstore」で出来るみたいだが・・・
注意事項Certutil
は、運用コードで使用することはお勧めしません。また、ライブ サイトのサポートやアプリケーションの互換性の保証も提供されません。 これは、開発者や IT 管理者がデバイス上の証明書コンテンツ情報を表示するために使用するツールです。
ストアから証明書を削除するコマンド
-delstore
certutil [options] -delstore CertificateStoreName certID
- CertificateStoreName は、証明書ストアの名前です。今回は「TrustedPublisher」(信頼された発行元)を指定。
- CertId は、証明書または CRL の一致トークンです。 この ID は次のようになります。
- シリアル番号
- SHA-1 証明書
- CRL、CTL、または公開キー ハッシュ
- 数値証明書インデックス (0、1 など)
- 数値 CRL インデックス (.0、.1 など)
- 数値 CTL インデックス (..0, ..1 など)
- 公開キー
- Signature または拡張 ObjectId
- 証明書のサブジェクト共通名(CommonName) 例:CN = na-3.com
- [電子メール アドレス]
- UPN または DNS 名
- キー コンテナー名または CSP 名
- テンプレート名または ObjectId
- EKU またはアプリケーション ポリシー ObjectId
- CRL 発行者の共通名
今回はCN「ドメイン名」を指定して,信頼された発行元の特定ドメインのみ削除するので,他の証明書(期限切れのもの等)には影響しない。
options 今回は指定しない
[-f] [-Enterprise] [-user] [-GroupPolicy] [-Silent] [-dc DCName]
コマンド使用例
certutil -delstore TrustedPublisher na-3.com
サーバー再起動時に削除・再登録を行うようにバッチファイルを作成する。先の「sslreg.bat」に削除コマンドを追加
rem Apacheサーバー証明書を変換してストアにインポート sslreg.bat
rem 既存のサーバー証明書を削除
certutil -delstore TrustedPublisher ドメイン名
rem Apacheのフォルダーに移動
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 5 /nobreak
考察
削除コマンドを入れたバッチファイルをスタートアップから再起動時に実行して、しばらく運用したが問題無さそうなので運用してみることとする。
Apacheで3ケ月毎にLet’s Encryptからサーバー証明書を自動取得して,サーバー再起動時に新証明書がApacheに適用されるので,そのタイミングでWindowsの証明書ストアにも自動的にインポートされるようになった。普段の再起動時にもインポート処理が行われるが,特に問題は無いと思う。今のところApacheの証明書更新処理が完了後に,バッチのインポート処理がされているのでタイミング的には問題ないと思うが,処理が失敗するようならバッチ処理を遅延させることも必要。
スタートアップへのショートカット登録はファイル名を指定して実行(「Windows」キーと「R」キー)で名前欄に「shell:startup」を指定して「OK」でStartupフォルダーが開く
追加修正
サーバー再起動時に毎回更新させるのも無駄な処理なので,証明書が新しくなったことを確認してインポートさせるようにバッチファイルを修正した。
新旧証明書ファイルの更新日時を比較して,異なっている場合はインポート処理させる。
rem Apacheサーバー証明書更新チェック後,変換してストアにインポート sslreg.bat
rem 対象ドメイン指定
set domain=ドメイン名
rem Oldファイルパス
set O-KFile="D:\Program Files\Apache24\md\certificate\%domain%\privkey.pem"
set O-CFile="D:\Program Files\Apache24\md\certificate\%domain%\pubcert.pem"
rem Newファイルパス
set N-KFile="D:\Program Files\Apache24\md\domains\%domain%\privkey.pem"
set N-CFile="D:\Program Files\Apache24\md\domains\%domain%\pubcert.pem"
rem Oldファイルの存在有無を確認
if not exist %O-KFile% (
echo 旧ファイルが存在しないため、インポート処理を行います。
goto proc
)
if not exist %O-CFile% (
echo 旧ファイルが存在しないため、インポート処理を行います。
goto proc
)
rem 対象Oldファイルの更新日時を取得
for %%a in (%O-KFile%) do set O-privkey=%%~ta
for %%b in (%O-CFile%) do set O-pubcert=%%~tb
rem 対象Newファイルの更新日時を取得
for %%c in (%N-KFile%) do set N-privkey=%%~tc
for %%d in (%N-CFile%) do set N-pubcert=%%~td
rem 新旧比較し更新時はインポート処理
if not "%O-privkey%" == "%N-privkey%" goto proc
if not "%O-pubcert%" == "%N-pubcert%" goto proc
exit
rem インポート処理
:proc
rem Apacheサーバー証明書を変換してストアにインポート sslreg.bat
rem 既存のサーバー証明書を削除
certutil -delstore TrustedPublisher %domain%
rem Apacheのフォルダーに移動
cd /D "D:\Program Files\Apache24\md\domains\%domain%"
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 5 /nobreak
rem 証明書ファイルを一時フォルダーにコピー
echo F | xcopy privkey.pem %O-KFile% /i /y /v
echo F | xcopy pubcert.pem %O-CFile% /i /y /v
次は「PMailServer2」のインストール・設定・証明書の確認を行う。