Столкнулся с проблемой подписания почты на CommuniGate подписью DKIM. Тема в Интернете не очень развитая. В результате её изучения мне стало известно всего лишь 2 пути решения: некое изделие от Niversoft и перловый скрипт Валерия Харсеко. Первый вариант не рассматривается ввиду его платности. Второй вариант рассматривается уже несколько дней, но не работает.
Приватный и публичный ключ пробовал генерить разными путями:
1) http://www.port25.com/support/domainkeysdkim-wizard/
2) openssl
3) opendkim-genkey
Тестирование DNS-записи (вот тут: http://dkimcore.org/c/keycheck) проходит успешно.
Письма подписываются, но на Mail.ru аутентификацию не проходят:
Authentication-Results: ... spf=pass...
dkim=fail reason=signature_incorrect header.i=имя_домена.ru;
dkim=fail reason=signature_incorrect header.i=ыыы@имя_домена.ru
Вот, собственно, и вопрос: в чём дело?
Мне попадались похожие темы, но не идентичные. Например, у кого-то аутентификация зарубалась по причине изменения тела письма после подписания, но там был другой reason: что-то связанное с body hash mismatch. Ещё кому-то помогло исправление в скрипте: вместо "$signature_dkim=~s/\s//g;" выполнялось "$signature_dkim=~s/\n/\015\012/gs;", но и там другой reason. Короче, полного совпадения с моей проблемой не нашёл. Это грустно. Может быть, на этом форуме найдётся человечище, который подскажет чего-нибудь дельное?
> кому-то помогло исправление
> в скрипте: вместо "$signature_dkim=~s/\s//g;" выполнялось "$signature_dkim=~s/\n/\015\012/gs;",
> но и там другой reason.Сейчас уточнил, reason у меня тот же: reason=signature_incorrect.
Может быть, кто-нибудь знает, при подписании письма учитываются все поля заголовка или только те, которые указаны в параметре "h="? Например, учитывается ли поле "Received:", при том, что в параметре "h=" у меня его нету?
vharseko@www1:~$ cat /var/CommuniGate/sign.pl
#!/bin/perl
#
# DKIM/DomainKeys signer for CommuniGate CGP free (implemented as a Content-Filtering script)
#
# Version: 0.2
#
# Copyright (c) 2005-2007 Valera V.Kharseko. This program is free software.
# You can redistribute it and/or modify it under the terms of the
# GNU Public License as found at http://www.fsf.org/copyleft/gpl.html.
#
# Written by vharseko@xxlive.ru.use Mail::DKIM::Signer;
use Mail::DKIM::DkSignature;
use Mail::DKIM::TextWrap;
use Getopt::Long;
use Pod::Usage;sub signer_policy {
my $dkim = shift;$dkim->add_signature(Mail::DKIM::Signature->new(
Algorithm => "rsa-sha256",
Method => "simple/relaxed",
Headers => $dkim->headers(),
Domain => $dkim->message_sender->host,
Selector => "default",
Expiration => time() + 86400,
Query => "dns/txt",
Timestamp => time(),
Identity => $dkim->message_sender->address
));
$dkim->add_signature(Mail::DKIM::DkSignature->new(
Algorithm => "rsa-sha1",
Method => "simple",
Headers => $dkim->headers,
Domain => $dkim->message_sender->host,
Selector => "default",
Expiration => time() + 86400,
Identity => $dkim->message_sender->address
));
return;
}sub Log {
print "* $_[0]\n";
}
$| = 1;
Log "DKIM is running";Log "";
mkdir "Submitted" if ( !-d "Submitted" );
while (<>) {
my @line = split( / /, $_ );
chomp( $line[0] );
print "$line[0] OK\n" and next if ( $line[1] =~ /^quit$/i );
print "$line[0] INTF 3\n" and next if ( $line[1] =~ /^intf$/i );
print "$line[0] OK\n" and next if ( $line[1] =~ /^key$/i );
print "$line[0] FAILURE\n" and next if ( $line[1] !~ /^file$/i );
$line[2] =~ s|\\|/|g;
chomp( $line[2] );Log "DKIM process: $line[2]";
if ( !open( MSG, $line[2] ) ) {
Log "Error: file not found $line[2]";
print "$line[0] OK\n";
}
else {
my ( $sender, @recipients );
#CGP headers
while (1) {
$line = <MSG>;
chomp($line);
last if ( $line eq '');
if ( $line =~ /^(\w).+<(.+)>/ ) {
if ( $1 eq 'P' ) {
$sender = $2;
}
else {
push @recipients, $2;
}
}
}
#mail headers and body
my $EntireMessage="";
my $dkim = new Mail::DKIM::Signer(Policy => \&signer_policy,KeyFile => "/var/CommuniGate/rsa.private");
while (<MSG>){
$EntireMessage=$EntireMessage.$_;
chomp $_;
s/\015?$/\015\012/s;
$dkim->PRINT($_);
}
close MSG;
if ( $EntireMessage !~ /DKIM-Signature:/i ) {
$dkim->CLOSE;
Log "DKIM sign for user=".($dkim->message_sender->address)." domain=".($dkim->message_sender->host);
my $signature_dkim=($dkim->signatures())[0]->as_string;
$signature_dkim=~s/\r\n/\n/g;
my $signature_dk=($dkim->signatures())[1]->as_string;
$signature_dk=~s/\r\n/\n/g;
my $alertFileName.="Submitted/A".time().int(rand(10000));
open(SUBM,">$alertFileName.tmp");
print SUBM "$signature_dk\n";
print SUBM "$signature_dkim\n";
print SUBM $EntireMessage;
close SUBM;
rename("$alertFileName.tmp","$alertFileName.sub");
print "$line[0] DISCARD\n";
}
else {
Log "DKIM skip file: $line[2]"; print "$line[0] OK\n";
}
}
open STDOUT, ">&STDOUT";
}
vharseko@www1:~$ cat /var/CommuniGate/personal.sign.pl
#!/bin/perl
#
# SMIME signer for CommuniGate CGP free (implemented as a Content-Filtering script)
#
# Version: 0.1
#
# Copyright (c) 2009 Valera V.Kharseko. This program is free software.
# You can redistribute it and/or modify it under the terms of the
# GNU Public License as found at http://www.fsf.org/copyleft/gpl.html.
#
# Written by vharseko@xxlive.ru.use Crypt::SMIME;
use Getopt::Long;
use Pod::Usage;my $personal_key_path="/var/CommuniGate/personal.keys";
sub Log {
print "* $_[0]\n";
}
$| = 1;
Log "SMIME signer is running";Log "";
mkdir "Submitted" if ( !-d "Submitted" );
while (<>) {
my @line = split( / /, $_ );
chomp( $line[0] );
print "$line[0] OK\n" and next if ( $line[1] =~ /^quit$/i );
print "$line[0] INTF 3\n" and next if ( $line[1] =~ /^intf$/i );
print "$line[0] OK\n" and next if ( $line[1] =~ /^key$/i );
print "$line[0] FAILURE\n" and next if ( $line[1] !~ /^file$/i );
$line[2] =~ s|\\|/|g;
chomp( $line[2] );Log "SMIME signer process: $line[2]";
if ( !open( MSG, $line[2] ) ) {
Log "Error: file not found $line[2]";
print "$line[0] OK\n";
}
else {
my ( $sender, @recipients );
#CGP headers
while (1) {
$line = <MSG>;
chomp($line);
last if ( $line eq '');
if ( $line =~ /^(\w).+<(.+)>/ ) {
if ( $1 eq 'P' ) {
$sender = lc($2);
}
else {
push @recipients, $2;
}
}
}
#mail headers and body
my $EntireMessage=join("",<MSG>);
close MSG;
if ( $EntireMessage !~ /x-pkcs7-signature/i ) {
if (open(FILE,"$personal_key_path/$sender.pem"))
{
Log "SMIME sign from user=$sender ";
#get keys
my $key;
$key = join("", <FILE>);
close FILE;
#sign
my $smime = Crypt::SMIME->new();
$smime->setPrivateKey($key, $key,"1111");
my $signed=$smime->sign($EntireMessage);
$signed=~s/\r\n/\n/g;
my $alertFileName.="Submitted/A".time().int(rand(10000));
open(SUBM,">$alertFileName.tmp");
print SUBM $signed;
close SUBM;
rename("$alertFileName.tmp","$alertFileName.sub");
print "$line[0] DISCARD\n";
}
else {
Log "SMIME key not found $personal_key_path/$sender"; print "$line[0] OK\n";
}
}
else {
Log "SMIME signer skip (already signed): $line[2]"; print "$line[0] OK\n";
}
}
open STDOUT, ">&STDOUT";
}
> Может быть, кто-нибудь знает, при подписании письма учитываются все поля заголовка или
> только те, которые указаны в параметре "h="? Например, учитывается ли поле
> "Received:", при том, что в параметре "h=" у меня его нету?нет
h=mime-version :content-type:date:from:to:message-id:in-reply-to:references :subject;Domainkey-Signature: a=rsa-sha1; c=simple; d=erp.travel; h=mime-version :content-type:date:from:to:message-id:in-reply-to:references :subject; q=dns; s=default; b=cajeoj4smjFDadrll9Zi6Rk6IR1JJqNCmN tjIhVEKDW6MGCsybrOyqrzD72kip6xuzAYOK7vvgrtX3kOFMstt5zT5X9CYbWC1c /arKsDd9PySRckjmnUjcLa1hbFld3yMfiYKAVVxZLLin2HFd77H/3/MN1OZ0eGS3 A/BO0bnJ8=
Dkim-Signature: v=1; a=rsa-sha256; c=simple/relaxed; d=erp.travel; h= mime-version:content-type:date:from:to:message-id:in-reply-to :references:subject; q=dns/txt; s=default; i=support@erp.travel; t=1377542753; x=1377629153; bh=4SVYIBAohOwZtuHqmz7Mr+m8Uv/FI315 sko7pUQ/zg8=; b=p9ezJioNWxe08jsL7rElcH4D5ZHMOSCs7rsTf+To0S3xXAw8 IdBRuCVE414hRhZ0LZAVyYRFvU615GQ7mjRd9w2bcFxEbQIBEKnI5vpJRqvWm9xk m1fb6PbAtUrPcFFaJ/BP+Yu4yj4ESEkQXy6K3mM666pNMr5uu7+2AMqYDRk=
Внезапно в эту, казалось бы, забытую тему поступила новая вводная:
при использовании DKIM-подписывателя скрытая копия адресату не доставляется.
Вот такая алярма.
https://www.dropbox.com/s/xvkg4zcuingbyrn/domainkeys-sources...
Плагин от Ниверсофт v1.1.11> Внезапно в эту, казалось бы, забытую тему поступила новая вводная:
> при использовании DKIM-подписывателя скрытая копия адресату не доставляется.
> Вот такая алярма.
> https://www.dropbox.com/s/xvkg4zcuingbyrn/domainkeys-sources...
> Плагин от Ниверсофт v1.1.11
>> Внезапно в эту, казалось бы, забытую тему поступила новая вводная:
>> при использовании DKIM-подписывателя скрытая копия адресату не доставляется.
>> Вот такая алярма.А подскажите как скомпилить этот плагин