DKIM не работает, но не может найти никаких проблем с хэшированием или подписью синтаксиса - PullRequest
0 голосов
/ 16 января 2020

Я пишу свою собственную реализацию DKIM в Node.js, и у меня возникают проблемы с передачей моего DKIM.

Вот мое тело письма:

dGVzdA == \ r \ n

Вот тело, которое * ha sh (sha256):

STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE =

Вот мой заголовок dkim ha sh input:

from:test@test.test.org \ r \ ndkim-signature: v = 1; a = rsa-sha256; c = расслабленный; s = wo8vy2th; d = test.test.org; h = from; bh = STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE =; b =

Затем я подписываю этот код:

crypto.createSign('rsa-sha256').update(headerHash).sign({key: processItem.sharedData.dkim_private_key, passphrase: dkimDomainKeyPassphrase}, 'base64');

И все же по прибытии я получаю dkim = fail. Мой DNS _domainkey разрешается правильно.

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

РЕДАКТИРОВАТЬ: вот исходный источник электронной почты, который терпит неудачу:

Delivered-To: wyatt5@ethereal.email
Return-Path: <test@test2.cybermancy.org>
Authentication-Results: mx.ethereal.email; spf=permerror smtp.mailfrom=test2.cybermancy.org; dkim=fail header.i=@test2.cybermancy.org
Received-SPF: PermError (mx.ethereal.email: domain of test2.cybermancy.org does not designate 67.205.181.191 as permitted sender) receiver=mx.ethereal.email; identity=mailfrom; client-ip=67.205.181.191; helo=mta.postagent.io; envelope-from=<test@test2.cybermancy.org>
Received-SPF: None (mx.ethereal.email: domain of mta.postagent.io does not designate 67.205.181.191 as permitted sender) receiver=mx.ethereal.email; identity=helo; client-ip=67.205.181.191; helo=mta.postagent.io; envelope-from=<test@test2.cybermancy.org>
Received: from mta.postagent.io ([67.205.181.191])
    by mx.ethereal.email (Haraka/2.8.23) with ESMTP id A08331BF-93B5-41C1-ADBA-B7B0F9DEF1CF.1
    envelope-from <test@test2.cybermancy.org>;
    Fri, 17 Jan 2020 14:18:12 +0100
Message-ID: <23e18f92-e6f3-4fab-bfa3-649584bec5b4+1579267090958@mta.postagent.io>
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=wo8vy2th;        
    h=mime-version:from:to:date:subject;        
    d=test2.cybermancy.org;        
    bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=;        
    b=RH/CNjqKlOcLEuwT8zCEo2k0UyDDAlCfsEVkPBU83pbNNDNxVMUVDQmHsxjPUw/GLm0osY948u1YhUIC8clAfUdaaVQqHfWXDmuk24t+uaeHLwQu/dTRuLJfFjO+lXlnx4VFNxQHj3kBAWJ6/aNhO5kq3QI7u7uGWtGf+4pZzg8=
To: wyatt5@ethereal.email
From: test@test2.cybermancy.org
Subject: test subject
Date: Fri, 17 Jan 2020 13:18:10 +0000
X-report-abuse: Please forward a copy of this message, including all headers, to abuse@test.org
Mime-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

dGVzdA==

Примечание: я пробовал значение подписи со свертыванием и без , Для этого примера я не сложил его.

Вот мой заголовок, который имеет sh input:

mime-version:1.0\\r\\nfrom:test@test2.cybermancy.org\r\nto:wyatt5@ethereal.email\r\ndate:Fri, 17 Jan 2020 13:18:10 +0000\r\nsubject:test subject\r\ndkim-signature:v=1;a=rsa-sha256;c=relaxed;s=wo8vy2th;d=test2.cybermancy.org;h=mime-version:from:to:date:subject;bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=;b=

DKIM-селектор: wo8vy2th DKIM publi c ключ на wo8vy2th._domainkey.test2 .cybermancy.org

k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7V0yupUNowYt7ciprmmn3s2sQkQA8cI7LVywrTwAOAS1RMAAcPRGIO0By/XHlh8uTMf0Kw+GscrHRz90TUJpRdDx9lCKCwUE6taWVsdsgUPmpJ1AxHDCrmbadFdjsc0hNTCt8niNsmph8qiV/6T6Qjtt/4piVlxKxzLPIJn976QIDAQAB

РЕДАКТИРОВАТЬ 2:

Вот мой закрытый ключ, напечатанный с помощью JSON .stringify ():

"-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIb03M5gGl7LECAggA\nMAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBCag7vzzjSCpDbgd9m2qci1BIIC\ngF2BIPWvOYMREJcbfs8JF3TAyUsuY6rXjW4ff3GPNqOHw8k45JCejSwOpHA1xgK8\n1jLVHf8kdhjCPqw9S9+l6GT59VXQqmFXKte5gTSwgOHz1Vy+fsH7OLZpPlxAhDFX\nXoyGBLAOnRUQ25Jl9eSEZ2Zs20L0Qd0XJL3MITWzTmHql+MpnZFkNW9mRZuhJ//j\nWmjJ7MTmDe6dhG5CYs2wS8cYET4z9tltDVBk287gwyMzg9dNdvbu2vvihvjiN3r6\ndYwH81ILDUoi6TFZeItjZVRk1wrDXemDhP4WWtWYA5fIMW/DDXjWSlja6aytfSAy\nzcZJMDYKhu8XGBYffFoG/3vP4Nbv8J9+XlQ0Av9LnHG1OjDpdFAaYOgwl7Cv2lWt\n0agNFrsaVgU4lkuBF9UMJp9QySsRmSb/pIIpUp/KvA7GpSmRyXc+MGgOMdekh+Tp\n52i+0y/2DYMrlfCRiLu5mOs5Ks6UN5W80TBQdwnB+vM2/0DYkemQCocQqdmc0aZB\nvGnsriqbmhZLbHL79DlqFyJ+HB5j8WzjNUHO+LF2aBAbu92y2t6P6BDBlzsauu0D\ndvdiMiLh7ifzIkWWHsGMGng5FM+xsv/fQIZNDjjCT1Anb29BywneFZjBc0cghvw7\nbqAnwO4HJLXocDQIfWu9gmjsjodLfTzPBS622Qnu1J0HXMvasY7IBopVWfKncT6u\nkzd68EN0QyPeWgh3wQTOpwoakjTsorIGJ+Ph+AhemH3V1jhQchjtPbxxqU7QU1NG\nQBZn/YPkiQYSk23G5QbYdHNzOrTMI9DGsdqukArUo+HMv2viTbRDqPcEa3MEd0Rq\n67kB7QutXMLsv/S36UioBbg=\n-----END ENCRYPTED PRIVATE KEY-----\n"

Зашифрованный приватный пароль ключа:

nkwsrcdk7gaah4vl7h0fdd1xjssefyibtyftyfjd98ewjmfnkisjt5t5jjjdfghgfdsrtyurtyu

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Сигнатура s, которую вы создаете с помощью crypto.createSign(), должна немедленно проверить с помощью:

    crypto.createVerify('RSA-SHA256').update(ch, 'binary').verify(pk, s, 'base64');

, где ch - канонизированный заголовок, и pk вашего открытого ключа c (украшен '-----BEGIN PUBLIC KEY-----\n' и аналогично тому, чтобы OpenSSL это сделал Я попытался с заголовком ha sh input , указанным выше, с двойной обратной косой чертой и без нее после первого поля заголовка. Я также попытался с канонизированным заголовком, полученным из сообщения выше:

    ch = 'mime-version:1.0\r\nfrom:test@test2.cybermancy.org\r\n' +
         'to:wyatt5@ethereal.email\r\n' +
         'date:Fri, 17 Jan 2020 13:18:10 +0000\r\nsubject:test subject\r\n' +
         'dkim-signature:v=1; a=rsa-sha256; c=relaxed; s=wo8vy2th;' +
         ' h=mime-version:from:to:date:subject;' +
         ' d=test2.cybermancy.org;' +
         ' bh=STFhz2ITzV8iSPWgLK0kfUa69jvk327MHRw2ZpGDvWE=;' +
         ' b=';

Ни в коем случае подпись не была проверена. Следовательно, что-то не так в данных, которые вы предоставили выше.

Вы должны строго следовать инструкциям по канонизации , чтобы подписывающее лицо и верификатор получали один и тот же BLOB-объект.

0 голосов
/ 17 января 2020

И у вас есть ключ publi c ключа подписи, опубликованный в записи DNS: wo8vy2th._domainkey.test.test.org?

Для этого требуется доступ к тесту. DNS-зона org.

Для подписей DKIM требуются ключи домена - это единственный способ проверить подпись.

Вы прочитали RF C 6376? Одна вещь состоит в том, что CR + LF должен быть закодирован. Посмотрите на 3.4.3 и посмотрите, получает ли пустое тело правильный sha-256: (для c = relaxed)

47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

Попробуйте воссоздать хэши, используя входящую подтвержденную DKIM почту в качестве ввода данных для проверки вашего есть расчеты. Это должно быть тривиально, чтобы проверить ваше хэширование / расслабление / простоту на известных хороших письмах. Скажи, отправил из Gmail для себя

...