The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"CommuniGate, DKIM, скрипт Харсеко"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Почта / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от Margulisemail (ok), 31-Янв-13, 14:57 
Столкнулся с проблемой подписания почты на 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. Короче, полного совпадения с моей проблемой не нашёл. Это грустно. Может быть, на этом форуме найдётся человечище, который подскажет чего-нибудь дельное?
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от Margulisemail (ok), 31-Янв-13, 16:21 
> кому-то помогло исправление
> в скрипте: вместо "$signature_dkim=~s/\s//g;" выполнялось "$signature_dkim=~s/\n/\015\012/gs;",
> но и там другой reason.

Сейчас уточнил, reason у меня тот же: reason=signature_incorrect.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от Margulisemail (ok), 05-Фев-13, 18:02 
Может быть, кто-нибудь знает, при подписании письма учитываются все поля заголовка или только те, которые указаны в параметре "h="? Например, учитывается ли поле "Received:", при том, что в параметре "h=" у меня его нету?


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от vharsekoemail (?), 27-Авг-13, 00:33 
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";
}

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "CommuniGate, SMIME sign (from user)"  +/
Сообщение от vharsekoemail (?), 27-Авг-13, 00:36 
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";
}

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от vharsekoemail (?), 27-Авг-13, 00:47 
> Может быть, кто-нибудь знает, при подписании письма учитываются все поля заголовка или
> только те, которые указаны в параметре "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=

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

6. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от Margulis (ok), 10-Мрт-15, 18:56 
Внезапно в эту, казалось бы, забытую тему поступила новая вводная:
при использовании DKIM-подписывателя скрытая копия адресату не доставляется.
Вот такая алярма.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от MItryemail (?), 24-Янв-17, 10:25 
https://www.dropbox.com/s/xvkg4zcuingbyrn/domainkeys-sources...
Плагин от Ниверсофт v1.1.11

> Внезапно в эту, казалось бы, забытую тему поступила новая вводная:
> при использовании DKIM-подписывателя скрытая копия адресату не доставляется.
> Вот такая алярма.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "CommuniGate, DKIM, скрипт Харсеко"  +/
Сообщение от Qwas (?), 14-Ноя-18, 03:10 
> https://www.dropbox.com/s/xvkg4zcuingbyrn/domainkeys-sources...
> Плагин от Ниверсофт v1.1.11
>> Внезапно в эту, казалось бы, забытую тему поступила новая вводная:
>> при использовании DKIM-подписывателя скрытая копия адресату не доставляется.
>> Вот такая алярма.

А подскажите как скомпилить этот плагин

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру