Підписуйте електронні листи за допомогою DKIM

5 років тому від David Grudl  

DKIM (DomainKeys Identified Mail) – це технологія для підвищення довіри до електронних листів, яка також допомагає виявляти підроблені повідомлення. Надіслане повідомлення підписується SMTP-сервером за допомогою приватного ключа домену відправника, і цей підпис зберігається в заголовку електронного листа. Сервер отримувача порівнює цей підпис із публічним ключем, що зберігається в DNS-записах домену. Якщо підпис збігається, це доводить, що електронний лист дійсно надійшов з домену відправника і що під час передачі повідомлення не було змінено.

Nette\Mail підтримує DKIM з версії 3.1. Використання дуже просте:

$options = [
	'domain' => 'myweb.com',
	'selector' => 'lovenette',
	'privateKey' => file_get_contents('dkim.priv'),
//	'passPhrase' => '****',
	'testMode' => true,
];

$mailer = new Nette\Mail\SendmailMailer; // або SmtpMailer
$mailer->setSigner(new Nette\Mail\DkimSigner($options));
$mailer->send($mail);

Або ви можете використовувати файл конфігурації:

mail:
	dkim:
		domain: myweb.com
	    selector: lovenette
	    privateKey: %appDir%/cert/dkim.priv
	    passPhrase: ...
	    testMode: ...

Селектор – це довільний буквено-цифровий рядок малими літерами, який є частиною DNS-запису.

Приватний і публічний ключ можна згенерувати за допомогою онлайн-сервісів (наприклад, easydmarc) або локально за допомогою openssl:

openssl genrsa -out dkim.priv 1024
openssl rsa -in dkim.priv -pubout > dkim.pub

Опублікуйте публічний ключ, створивши TXT-запис у DNS вашого домену, назва якого буде поєднанням селектора, рядка ._domainkey. та домену. У нашому прикладі це було б lovenette._domainkey.myweb.com. У деяких адміністративних панелях домен може бути вже попередньо заповнений.

Значенням запису буде поєднання рядка v=DKIM1;t=s;k=rsa;p= та публічного ключа, який ви скопіюєте з файлу dkim.pub. Видаліть обгорткові коментарі -----BEGIN PUBLIC KEY----- і з'єднайте рядки в один довгий:

v=DKIM1;t=s;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi5y95Mi8FZ8LOSmi7nA/EFhn4a4/Zq3BnnmPFdu1IvduDwMGRrRW5V9FKjXvr4AnUq7eMLRtEdWYRpR9BXLdCWiJ2N4yKJG7SEEir8DMYOGGeqJZoR/kWFiG++GW++sdhfukFflPusJjrWr+4Pc4/qxMSrqUk/rVdsSlTDDRy/QIDAQAB

Для перевірки налаштувань DKIM ви можете скористатися, наприклад, сервісом MailTester.

David Grudl A web developer since 1999 who now specializes in artificial intelligence. He's the creator of Nette Framework and libraries including Texy!, Tracy, and Latte. He hosts the Tech Guys podcast and covers AI developments on Uměligence. His blog La Trine earned a Magnesia Litera award nomination. He's dedicated to AI education and approaches technology with pragmatic optimism.