読者です 読者をやめる 読者になる 読者になる

opendkim lua programming(2)

前回のエントリに引き続きopendkimにluaによるフックを仕掛ける。
前回はAUTH LOGINでログインしてきたユーザ名をluaの中で取得した。
今回はodkim.sign関数を使い、DKIMの署名をしてみる。
http://www.opendkim.org/opendkim-lua.3.html

ちなみにluaを使わなくても当然ながら、署名は可能である。
ただのテストである。(もちろんその先にはちゃんと目的がある)

前提知識

以下のように設定した場合、
example.comをメッセージボディーのFROMに指定すると署名が付与される。

/etc/opendkim.conf
KeyTable    refile:/etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
/etc/opendkim/SigningTable
*@example.com default._domainkey.example.com
/etc/opendkim/KeyTable
default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private
秘密鍵を生成する
$ cd /etc/opendkim/keys/example.com
$ sudo opendkim-genkey -t -s default -d example.com
$ sudo chown opendkim:opendkim /etc/opendkim/keys/* 

luaの中で署名を指定する。

設定等は前回のエントリを参考に。
前回のtest.luaに対して以下のように追記した。

test.lua

local author = odkim.get_mtasymbol(ctx, "{auth_authen}")
print ("name" .. author )
odkim.log(ctx, "name" .. author )
odkim.sign(ctx, "notdefault._domainkey.example.com")

設定ファイルも変更

/etc/opendkim/KeyTable

notdefault._domainkey.example.com example.com:notdefault:/etc/opendkim/keys/example.com/notdefault.private

default→notdefault

/etc/opendkim/SigningTable

(空)

SigningTableを空にすることでFromを判定して自動的に署名できなくなる。

秘密鍵を生成する

$ cd /etc/opendkim/keys/example.com
$ sudo opendkim-genkey -t -s notdefault -d example.com
$ sudo chown opendkim:opendkim /etc/opendkim/keys/* 

notdefaultに対応する秘密鍵を生成。

以上で準備が整った。

結果を確認する

telnetでメールを送る。
$ telnet localhost smtp
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ESMTP Postfix
AUTH LOGIN
******
******
MAIL FROM: test@example.com
RCPT TO: test@localhost
DATA
FROM: test@example.com
Subject: hogehoge
hogehoge
.
quit
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 2.7.0 Authentication successful
250 2.1.0 Ok
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>
250 2.0.0 Ok: queued as 6260E161C6D
221 2.0.0 Bye
Connection closed by foreign host.
メールの中身を確認する。
From test@example.com  Wed Sep 18 14:38:20 2013
Return-Path: <test@example.com>
X-Original-To: test@localhost
Delivered-To: test@localhost
Received: from localhost (localhost [127.0.0.1])
        by localhost (Postfix) with SMTP id 6260E161C6D
        for <test@localhost>; Wed, 18 Sep 2013 14:38:20 +0900 (JST)
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com;
        s=notdefault; t=1379482700;
        bh=U84RQJxCYmPtDKg95URE0hTFEfcj3DCpcZm8uGc/KJg=;
        h=FROM:Subject:Date:From;
        b=jGAlfdVmSMU3hFd2M8K0blAcXOqHXeUkHKmAPKHbQoWyVTwFmeX39IWaeMHqN0jGx
         UHxsQL4UzWHbwMJ1079Yk7UxIhMdyFTSjGpOz2sAOeLdaWrRMjopvHnN2vg4LzXnKP
         UC/aLayB/GXBJ/DRG2BN9YT6cTH8Xu6F21A8pGeo=
FROM: test@example.com
Subject: hogehoge
Message-Id: <20130918053820.6260E161C6D@localhost>
Date: Wed, 18 Sep 2013 14:38:20 +0900 (JST)

hogehoge

「s=notdefault」などの文字列から署名が実行されたことがわかる。
次回はAUTH LOGINでログインしてきたユーザ別に署名をつけられるようにtest.luaに実装をする予定。