Exim 4.72 и подпись DKIM

Есть технология, как DKIM (DomainKeys Identified Mail), позволяет письма подписывать ключами. Сервер получателя письма в ДНС берет информацию о ключе и сам ключ. После сверки информации из ДНС с заголовками письма, которое пытается поступить, можно судить об отправителе -- доверять ему или нет.
На сегодняшний день этот метод больше используется бесплатными почтовыми службами или крупными почтовыми серверами, которые частенько подставляют спамеры. Я не уверен вообще, что это кто-то будет использовать, но мало-ли.

Как подписывать свою почту при помощи DKIM на примере freebsd 7.0 и exim 4.72.

Создаем ключ для домена:

ns# openssl genrsa -out /usr/local/etc/exim/dkim/domain.ru.key 1024
Generating RSA private key, 1024 bit long modulus
..................................................................++++++
................++++++
e is 65537 (0x10001)
ns#

Устанавливаем права достуба к файлам и папкам:

chown mailnull:wheel /usr/local/etc/exim/dkim/
chmod u=rx,go= /usr/local/etc/exim/dkim/

Создаем публичный ключ, который будет предоставляться всем желающим для проверки исходящих писем.

ns# openssl rsa -in /usr/local/etc/exim/dkim/domain.ru.key -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFL0ZKBqNsCkcffWDyZyRDebsn
y+iImYiKe4uYNKmk7vuKjszPgP9NUMUY5yNDlU0mEv2uuOOCkm/derhzjM90WWmp
YrtoWXP5a1PWJYhzJk91YegkVQfu7ujUwaQHpGyg1pAze0FkjI8jGZ6rapSnqIo9
eGlErcbCxFNDq2knzwIDAQAB
-----END PUBLIC KEY-----
ns#

Копируем ключ и вставляем в ДНС зоне нашего домена domen.ru в поле ( Пример зоны ):

$ORIGIN .
$TTL 38400    ; 10 hours 40 minutes
domain.ru    IN    SOA    ns.domain.ru. root.domain.ru. (
            2012060400
            10800
            3600
            604800
            38400 )
domain.ru.    IN    NS    ns.domain.ru.
domain.ru.    IN    NS    ns.provider.ru.
domain.ru.    IN    MX    10 mail.domain.ru.
$ORIGIN domain.ru.
@    IN    A    55.55.55.55
domain.ru.    IN    A    55.55.55.55
mail.domain.ru.    IN    A    55.55.55.55
ns.domain.ru.    IN    A    55.55.55.55
www.domain.ru.    IN    A    55.55.55.55

dkim._domainkey.domain.ru.    IN    TXT    "k=rsa; t=s; p={MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFL0ZKBqNsCkcffWDyZyRDebsny+iImYiKe4uYNKmk7vuKjszPgP9NUMUY5yNDlU0mEv2uuOOCkm/derhzjM90WWmpYrtoWXP5a1PWJYhzJk91YegkVQfu7ujUwaQHpGyg1pAze0FkjI8jGZ6rapSnqIo9eGlErcbCxFNDq2knzwIDAQAB}"
domain.ru.    IN    TXT    "v=spf1 a -all"
domain.ru.    IN    TXT    "v=spf1 a mx ~all"
55.55.55.55.in-addr.arpa.    1D    IN    PTR    domain.ru.
localhost.    IN    A    127.0.0.1
_domainkey.domain.ru.    IN    TXT    "t=s; o=~;"
55.55.55.55.in-addr.arpa.    1D    IN    PTR    mail.domain.ru.

Внимание: ключ должен располагаться одной строкой, без переносов и пробелов. Обновляем serial в зоне и обновляем зону. Проверяем, что получилось:

ns# host -t txt dkim._domainkey.domain.ru.
dkim._domainkey.domain.ru descriptive text "k=rsa\; t=s\; p={MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeRLdHO9rnmJQ2zpjy+pfRfzQ7eNFfsc/CzKhnho/43dkytYVqnksyiJB4wOH6S7zhLnMdoXqfJn5NA4G8oA4jtGXULKkB/K2xys6npJ9sBcTZWKKh+laaMMQgjMcs4ngoGXIzNFjwbTwD9KXHi0ZX6gS7mMgRfrBkrO2sA69o1wIDAQAB}"
ns#

ДНС настроен.
Первое слово, до _domainkey в ДНС-записи -- это будет наш dkim-selector. Его можно любой использовать и пользоваться для разных случаев разными селекторами и тем самым использовать кучу ключей.

Настройка exim! В configure указываем следующее:

acl_smtp_dkim = acl_check_dkim

## DKIM:
DKIM_DOMAIN                     = ${lc:${domain:$h_from:}}
DKIM_FILE                       = /usr/local/etc/exim/dkim/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY                = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

######################################################################
#                       ACL DKIM                                     #
######################################################################

acl_check_dkim:
warn  log_message   = Recipient verify DKIM $sender_address
dkim_status =

accept

######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################

begin transports

remote_smtp:
driver = smtp
dkim_domain = DKIM_DOMAIN
dkim_selector = dkim
dkim_strict = false
dkim_private_key = DKIM_PRIVATE_KEY

Перечитываем конфиг exim:

/usr/local/etc/rc.d/exim reload

Отправляем тестовое письмо так, чтобы оно уходило при помощи транспорта remote_smtp

X-AntiVirus: Checked by Dr.Web [version: 6.0.3.08040, engine: 6.0.300.01310, virus records: 3386342, updated:  4.06.2012]
Received: from mxfront7h.mail.yandex.net ([127.0.0.1])
        by mxfront7h.mail.yandex.net with LMTP id hQYSwVH3
        for <test@test.ru>; Mon, 4 Jun 2012 15:43:26 +0400
Received: from mail.domen.ru (mail.domen.ru [55.55.55.55])
        by mxfront7h.mail.yandex.net (nwsmtp/Yandex) with ESMTP id hPv48rBP-hPvGC7X4;
        Mon,  4 Jun 2012 15:43:25 +0400
X-Yandex-Front: mxfront7h.mail.yandex.net
X-Yandex-TimeMark: 1338810205
X-Yandex-Spam: 1
Authentication-Results: mxfront7h.mail.yandex.net; spf=pass (mxfront7h.mail.yandex.net: domain of domen.ru designates 55.55.55.55 as permitted sender) smtp.mail=test@domen.ru; dkim=pass header.i=@domen.ru
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=domen.ru; s=dkim;
        h=Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:To:Message-ID:From:Date; bh=1OXq2NwUQP2sUEk0Tqswk/6kFfj3MuD5xBH+RUjmBjo=;
        b=k8UU7ocgi5ydAfrvIt4qCcTMMynn0dT+ztQkoXfppR3g1q8U1MTLfq2Mxd+UJgCLIsqvD/Mf/YbU47aMZ+VeZ/EnHom5QA9zEBgpqtqCU3T16LgFVRXMRLStpXWIE1YCPzPHu13F0pXH5VZUGnTXRqg/ThFzlJTK3L/K1O7470E=;
Received: from [62.117.84.71] (helo=Prochor)
        by mail.domen.ru with esmtpa (Exim 4.71 (FreeBSD))
        (envelope-from <test@domen.ru>)
        id 1SbViY-000ELd-SU
        for test@test.ru; Mon, 04 Jun 2012 15:45:02 +0400
X-AntiVirus: Checked by Dr.Web [version: 6.0.3.08040, engine: 6.0.300.01310, virus records: 3386342, updated:  4.06.2012]
Date: Mon, 4 Jun 2012 15:41:22 +0400
From: =?windows-1251?B?z/Du9e7w7uIgzejq7uvg6Q==?= <test@domen.ru>
X-Priority: 3 (Normal)
Message-ID: <12610371961.20120604154122@domen.ru>
To: test@test.ru
Subject: 1541
MIME-Version: 1.0
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: quoted-printable
Return-Path: test@domen.ru
X-Yandex-Forward: efb10603ffffffe8fb0917b870c6edf3

Все работает.