PMailServer2にDKIM署名を設定

はじめに

PMailServer2の機能にメール送信時のメールヘッダーに電子署名(DKIM署名)を施す機能が実装されておりこれを有効にしてみた。
設定に伴い,秘密鍵と公開鍵が必要となる。
OpenSSLで秘密鍵を発行できるが,Apacheの秘密鍵が既にあるのでそれを利用してみる。
Apacheの秘密鍵は,以前の記事にも書いたがインストールフォルダーの「\md\domains\ドメイン名」に「privkey.pem」のファイル名で保存されている。
このファイルはPMailServer2では扱えない形式(PKCS#8)のためPKCS#1に変換後,公開鍵を発行する。

PKCS#1に変換

コマンドプロンプトを立ち上げてApacheの証明書フォルダーに移動後,Apacheの秘密鍵をOpenSSLコマンドでPKCS#1に変換する。

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

openssl pkey -in privkey.pem -traditional > privkey_PKCS#1.pem

Apacheの証明書フォルダー「\md\domains\ドメイン名」に「privkey_PKCS#1.pem」の秘密鍵が作成される。

公開鍵の発行

上記の秘密鍵「privkey_PKCS#1.pem」から公開鍵「public_PKCS#1.pem」を発行する。

openssl rsa -in privkey_PKCS#1.pem -out public_PKCS#1.pem -pubout -traditional

Apacheの証明書フォルダー「\md\domains\ドメイン名」に「public_PKCS#1.pem」の公開鍵が作成される。

バッチファイルで作成

あまり必要性は無いかもしれないが,2ステップ分を自動作成できるバッチファイルを作ってみた。定期的な鍵の交換時や構成が同じ複数のサーバー運用をしている分には多少時間節約になる。ただし公開鍵の編集は必要。Apacheのフォルダー(\md\domains\ドメイン名)は3カ月毎の証明書発行時にクリアされるので別フォルダー(\md\PKCS#1\ドメイン名)に保存する。

rem  Apacheサーバー証明書を変換してスDKIM署名用証明書作成    dkimcreate.bat

rem 対象ドメイン指定
set domain=ドメイン名

rem Apache証明書フォルダーに移動
cd /D "D:\Program Files\Apache24\md\domains\%domain%"

rem 秘密鍵ファイルをDKIM署名用証明書フォルダーにコピー
xcopy privkey.pem "D:\Program Files\Apache24\md\PKCS#1\%domain%\" /i /y /v

timeout /t 1 /nobreak

rem DKIM署名用証明書フォルダーに移動
cd "D:\Program Files\Apache24\md\PKCS#1\%domain%"

rem Apacheの秘密鍵(PKCS#8)をPKCS#1に変換
openssl pkey -in privkey.pem -traditional > privkey_PKCS#1.pem

timeout /t 5 /nobreak

rem 秘密鍵から公開鍵を発行
openssl rsa -in privkey_PKCS#1.pem -out public_PKCS#1.pem -pubout -traditional

timeout /t 5 /nobreak

「\md\PKCS#1\ドメイン名」フォルダーに作成されるファイル
秘密鍵 privkey_PKCS#1.pem
公開鍵 public_PKCS#1.pem   編集必要

公開鍵の編集

上記で作成された公開鍵「public_PKCS#1.pem」をメモ帳等のエディタで開いて不要箇所を削除する。
削除箇所
・先頭行「—–BEGIN PUBLIC KEY—–」と最終行「——END PUBLIC KEY—–」を削除
・改行を削除して1行で保存する。

上記の9行を下記のように1行に編集する。
(登録するDNSサーバー仕様で255文字/1行のケースあり)

DNSサーバーへ公開鍵登録

DNSサーバーへ登録する際にセレクタという任意の文字列を指定する。
このセレクタは,複数のDKIM設定時に秘密鍵と公開鍵を紐づける目的で使用される。
セレクタを含めたFQDNは「セレクタ._domainkey.ドメイン名」で表す。
下記はセレクタを「default」とした時の設定例でセレクタに続けて「_domainkey」とドメイン名を記載する。
完全修飾ドメイン名(FQDN)「default._domainkey.na-3.com」
エイリアス名「default._domainkey」

Mydnsの設定例

Hostname : default._domainkey
Type : TXT
Content : v=DKIM1;k=rsa;p=MIIBI........... 公開鍵.............

value domainの設定例

DNSサーバーにより登録方法が異なる。value domainは下記の1レコードを張り付ける。

txt default._domainkey v=DKIM1; k=rsa; p=MIIBI...... 公開鍵........

DNS登録画面

PMailServer2の設定

基本設定

DKIM署名を行う・正規化(simple/simple)・署名アルゴリズム(rsa-sha256)・追加処理(ピリオドエスケープ)・署名Body長(0)・署名に含めるヘッダ(from,to,subject,date)・追加ヘッダ(タイムスタンプを付与)

ドメイン別設定

ドメイン設定 ドメイン名(hoge.com)・セレクタ(任意の文字列 例:default)・
プライベートキー(pem)へのフルパス
(D:\Program Files\Apache24\md\PKCS#1\ドメイン名\privkey_PKCS#1.pem)

署名テスト

考察

googleのDKIMチェックは管理コンソールから有効にしないとワーニングが消えないようだが,gmailには届くので様子見とする。
DKIMの公開鍵には有効期限があり、定期的に鍵の交換が必要になります。Customers Mail Cloudでは、1年ごとの鍵交換を推奨しています。」とのことであり,当然秘密鍵とペアで作成するので秘密鍵・公開鍵共に1年毎に自ら有効期限を設定して交換する必要がある。

参考

  • DKIM Record Checker(DKIMレコードの登録・パラメーター確認)
  • DKIMCore(DKIMレコードの登録・有効性確認)