Как всё же подключить DKIM на EXIM + phpMailer на CentOS?

Всем привет

Прочитал уже несколько статей по настройке DKIM, поковырялся в файлах движка и пр., но пока всё не работает как надо. Опыта настройки серверов у меня, можно сказать, нет.
Завёл я ПДД от Яндекса. Планировал использовать web-интерфейс для рабочей переписки, а уведомления от движка рассылать силами сервера, чтобы (в будущем) не тратить дневной лимит на количество получателей писем (5000 шт.).
Получил публичный ключ, который прописал в DNS. Также вытащил через API и приватный ключ, который, как я понял, необходим для настройки отправки почты с сервера.
Что имею:
CentOS 7 x64, Exim 4.84_2, скрипт доски объявлений, который шлёт уведомления через phpMailer.
PTR записи у домена есть, в DNS вроде бы тоже всё верно. Похоже, возникает ошибка в подписи сообщения при отправке. Итог проверки письма на dkimvalidator.com/:
Ошибка: Details: OpenSSL error: data too small for key size

До конца не въеду, где нужно указывать параметры DKIM-подписи, в phpMailer или же в exim? Что ещё может влиять на появление ошибки?
Я пробовал сохранять содержимое файла ключа в одну строку, чтобы избежать "кривых" переносов строк, безрезультатно.

В общем, вот что я вижу в результатах проверки писем:
Original Message:
Received: from gdevpenze.ru (gdevpenze.ru [178.62.251.40])
	by ip-10-31-192-99 (Postfix) with ESMTPS id 67FDF410418
	for <pud6krh3fdy3em@dkimvalidator.com>; Tue, 29 Mar 2016 10:46:51 +0000 (UTC)
Received: from gdevpenze by gdevpenze.ru with local (Exim 4.84_2)
	(envelope-from <hello@gdevpenze.ru>)
	id 1akrAf-00026B-Fp
	for pud6krh3fdy3em@dkimvalidator.com; Tue, 29 Mar 2016 13:46:49 +0300
To: pud6krh3fdy3em@dkimvalidator.com
Subject: =?UTF-8?B?0J/RgNC+0LLQtdGA0LrQsCDQvtGC0L/RgNCw0LLQutC4INC/0L7Rh9GC0Ys=?=
X-PHP-Originating-Script: 502:class.phpmailer.php
Date: Tue, 29 Mar 2016 13:46:49 +0300
From: "Gdevpenze.ru" <hello@gdevpenze.ru>
Message-ID: <b631a487d150b490ef6cd711c309b0d9@gdevpenze.ru>
X-Priority: 3
MIME-Version: 1.0
Content-Type: multipart/alternative;
	boundary="b1_b631a487d150b490ef6cd711c309b0d9"
Content-Transfer-Encoding: 8bit
DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=366; s=mail;
	t=1459248409; c=relaxed/simple;
	h=From:To:Subject;
	d=gdevpenze.ru;
	z=From:=20"Gdevpenze.ru"=20<hello@gdevpenze.ru>
	|To:=20pud6krh3fdy3em@dkimvalidator.com
	|Subject:=20=3D?UTF-8?B?0J/RgNC+0LLQtdGA0LrQsCDQvtGC0L/RgNCw0LLQutC4INC/0L7Rh9GC0Ys=3D?=3D;
	bh=KuD169v+YVCDEGNNZp3X7DK6SxU=;
	b=

--b1_b631a487d150b490ef6cd711c309b0d9
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Поменял DKIM_selector на "mail."


--b1_b631a487d150b490ef6cd711c309b0d9
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

Поменял DKIM_selector на "mail."



--b1_b631a487d150b490ef6cd711c309b0d9--


DKIM Information:
DKIM Signature


Message contains this DKIM Signature:
DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=366; s=mail;
	t=1459248409; c=relaxed/simple;
	h=From:To:Subject;
	d=gdevpenze.ru;
	z=From:=20"Gdevpenze.ru"=20
	|To:=20pud6krh3fdy3em@dkimvalidator.com
	|Subject:=20=3D?UTF-8?B?0J/RgNC+0LLQtdGA0LrQsCDQvtGC0L/RgNCw0LLQutC4INC/0L7Rh9GC0Ys=3D?=3D;
	bh=KuD169v+YVCDEGNNZp3X7DK6SxU=;
	b=


Signature Information:
v= Version:         1
a= Algorithm:       rsa-sha1
c= Method:          relaxed/simple
d= Domain:          gdevpenze.ru
s= Selector:        mail
q= Protocol:        dns/txt
bh=                 KuD169v+YVCDEGNNZp3X7DK6SxU=
h= Signed Headers:  From:To:Subject
b= Data:            
Public Key DNS Lookup


Building DNS Query for mail._domainkey.gdevpenze.ru
Retrieved this publickey from DNS: v=DKIM1; k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7HPB88p6JYjToUcmMBSBzwtNGQrL9O81Pa4CRW/KuR30kDBYP84EUJohnL5bV33c931VH+PuZEhK4y6ymmvSrjzArKFcM/L1hFQK3zUsMpAG96T5bynvTl7hH31Zj9TwC+FvDgzCA2enD3V7Y37Tl/980NhfY60Ctlj4N4FxHOwIDAQAB
Validating Signature


result = fail
Details: OpenSSL error: data too small for key size


SPF Information:
Using this information that I obtained from the headers


Helo Address = gdevpenze.ru
From Address = hello@gdevpenze.ru
From IP      = 178.62.251.40
SPF Record Lookup


Looking up TXT SPF record for gdevpenze.ru
Found the following namesevers for gdevpenze.ru: ns1.reg.ru ns2.reg.ru
Retrieved this SPF Record: zone updated 20160329 (TTL = 21599)
using authoritative server (ns1.reg.ru) directly for SPF Check
Result: pass (Mechanism 'ip4:178.62.251.40' matched)


Result code: pass
Local Explanation: gdevpenze.ru: 178.62.251.40 is authorized to use 'hello@gdevpenze.ru' in 'mfrom' identity (mechanism 'ip4:178.62.251.40' matched)
spf_header = Received-SPF: pass (gdevpenze.ru: 178.62.251.40 is authorized to use 'hello@gdevpenze.ru' in 'mfrom' identity (mechanism 'ip4:178.62.251.40' matched)) receiver=ip-172-31-3-128.us-west-1.compute.internal; identity=mailfrom; envelope-from="hello@gdevpenze.ru"; helo=gdevpenze.ru; client-ip=178.62.251.40


Прошу помощи.
Спасибо.
  • Вопрос задан
  • 1757 просмотров
Решения вопроса 1
steff
@steff Автор вопроса
Владимир, посмотрел сейчас class.phpmailer.php:
...
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } else {
                if ($current && strpos($header, ' =?') === 0) {
                    $current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack("H*", sha1($body))); // Base64 of packed binary SHA-1 hash of body
        $ident = ($this->DKIM_identity == '') ? '' : " i=" . $this->DKIM_identity . ";";
        $dkimhdrs = "DKIM-Signature: v=1; a=" .
            $DKIMsignatureType . "; q=" .
            $DKIMquery . "; l=" .
            $DKIMlen . "; s=" .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }
    ...

Как я понял, лимитом на размер подписываемого содержимого как раз является длина этого самого содержимого (то, что в "body"). И все остальные метки определяются здесь же. Их точно можно удалить? Они не все обязательны?

Возможно, я где-то ещё накосячил. Есть следы, указывающие на это?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
У вас настроен лимит на размер подписываемого содержимого (l=366) и этот лимит конфликтует с размером ключа. Уберите этот лимит, его использование крайне нерекомендуется.

P.S. временную метку (t=) я бы тоже рекомендовал убрать из подписи, иначе можете получать ошибки если у вас часы будут вперед хотя бы на секунду относительно получателя.

P.P.S. и нормализацию используйте relaxed/relaxed, меньше проблем будет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы