base64-Encoding нарушает шифрование сообщений электронной почты - PullRequest
0 голосов
/ 15 марта 2012

Я использую Mime :: Lite для создания и отправки электронных писем.Теперь мне нужно добавить поддержку S / Mime-шифрования и, наконец, можно зашифровать мою электронную почту (единственный Perllib, который я мог установить, кажется сломанным, поэтому я использую systemcall и openssl smime), но когда я пытаюсь создать mime-против этого, E-Mail будет сломан, как только я установлю Content-Transfer-Encoding на base64.Чтобы сделать его еще более любопытным, это происходит, только если я установлю его через $myMessage->attr.Если я использую конструктор -> new, то все в порядке, кроме небольшого предупреждения, которое я подавляю, используя MIME::Lite->quiet(1);

Это ошибка или моя ошибка?Вот два способа создания mime-объекта.

  1. Настройка Content-Transfer-Encoding через construtor и подавление предупреждения:

    MIME::Lite->quiet(1); 
    my $msgEncr = MIME::Lite->new(From   =>'me@myhost.com',
                            To     => 'you@yourhost.com',
                           Subject => 'SMIME Test',
                           Data    => $myEncryptedMessage,
                           'Content-Transfer-Encoding' => 'base64');
    
    $msgEncr->attr('Content-Disposition'        =>  'attachment');
    $msgEncr->attr('Content-Disposition.filename'   =>  'smime.p7m');
    $msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime');
    $msgEncr->attr('Content-Type.smime-type' => 'enveloped-data');
    $msgEncr->attr('Content-Type.name' => 'smime.p7m');
    
    $msgEncr->send;             
    
    MIME::Lite->quiet(0);
    
  2. Установка Content-Transfer-Encoding через $myMessage->attr, которая разбивает зашифрованные данные, но не вызывает предупреждения:

    my $msgEncr = MIME::Lite->new(From  => 'me@myhost.com',
                           To         => 'you@yourhost.com',
                           Subject    => 'SMIME Test',
                           Data => $myEncryptedMessage);
    
    $msgEncr->attr('Content-Disposition'        =>  'attachment');
    $msgEncr->attr('Content-Disposition.filename'       =>  'smime.p7m');
    $msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime');
    $msgEncr->attr('Content-Type.smime-type' => 'enveloped-data');
    $msgEncr->attr('Content-Type.name' => 'smime.p7m');
    $msgEncr->attr('Content-Transfer-Encoding' => 'base64');
    
    $msgEncr->send; 
    

Я просто не получаюпочему мое сообщение не работает, когда я использую атрибут-установщик.Заранее благодарю за помощь!

Кроме того, я не могу прикрепить файл к этому электронному письму без повторного взлома зашифрованного сообщения.

Ответы [ 4 ]

0 голосов
/ 29 марта 2012

Я не могу проверить это на реальном почтовом клиенте, но я думаю, что это может работать для нескольких частей.

use MIME::Lite;
use Net::SMTP;
use MIME::Base64;
MIME::Lite->send('sendmail', "./showmail.pl"); ## <---- for testing only
my $from_address = "nobody@localhost";
my $to_address = "somebody@localhost";
my $mail_host = "localhost";
my $subject = "Subject list";
my $message_body = "Attachment list";
my @files = ("crypt.data1","crypt.data2");
$msg = MIME::Lite->new (
  From => $from_address,
  To => $to_address,
  Subject => $subject,
  Type =>'multipart/mixed'
) or die "Error creating multipart container: $!\n";

foreach $c(@files) {
   $msg->attach (
     Disposition => 'attachment',
     Type => "application/x-pkcs7-mime; name=smime.p7m; smime-type=enveloped-data",
     Path => $c,
   ) or die "Error adding $c: $!\n";
}
$msg->send;
0 голосов
/ 26 марта 2012

Для отладки Создайте скрипт, вызовите showmail.pl

#!/usr/bin/perl
while (<STDIN>) { print $_; }

Протестируйте как

use MIME::Lite;
use Net::SMTP;
use MIME::Base64;
$myEncryptedMessage = encode_base64("This is not valid encrypted message\n");
MIME::Lite->send('sendmail', "./showmail.pl"); ## Add this for debugging.
MIME::Lite->quiet(1); my $msgEncr = MIME::Lite->new(From   =>'me@localhost',
                 To     => 'you@localhost',
                 Subject => 'SMIME Test',
                 Data    => $myEncryptedMessage,
                 'Content-Transfer-Encoding' => 'base64');
$msgEncr->attr('Content-Disposition'        =>  'attachment');
$msgEncr->attr('Content-Disposition.filename'   =>  'smime.p7m');
$msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime');
$msgEncr->attr('Content-Type.smime-type' => 'enveloped-data');
$msgEncr->attr('Content-Type.name' => 'smime.p7m');
$msgEncr->send();

, вы должны увидеть что-то вроде.сообщение кодируется base64, но реальное сообщение все еще должно быть правильно зашифровано.Вы должны убедиться, что это так, так как $ myEncryptedMessage передается. С выходом отладки вы можете сравнить с известной хорошей зашифрованной почтой и посмотреть, хороши ли заголовки, насколько я вижу, что заголовки в порядке, этоВероятно, это недействительные данные.

0 голосов
/ 28 марта 2012

Как я уже сказал в одном комментарии, различие в настройке кодировки в конструкторе мимеобъекта или с помощью ->attr -Sterter заключается в том, что этот конструктор просто устанавливает кодировку в мимхедере. С помощью ->attr -Setter MIME кодирует данные с base64.

Так что в моем случае мой ранее сгенерированный mimeobject - который закодирован в base64 и зашифрован s / mime - для чтения из файла требуется , чтобы установить кодировку в конструкторе (и подавить предупреждение), так MIME больше не будет кодировать. В противном случае mime снова закодирует данные и, следовательно, нарушит шифрование и само письмо.

Я наконец-то получил вложения на работу. Чтобы добиться этого, я создаю обычный многокомпонентный / смешанный мимобъект, печатаю этот объект в обычный файл, зашифровываю этот файл с помощью openssl smime, считываю весь этот файл (за исключением 6 заголовков) в переменную и использую его в качестве данных. Кроме того, я установил Content-Transfer-Encoding на base64 с помощью construtor (поэтому кодирование моих данных не производится).

Надеюсь, это поможет кому-то другому, кроме меня;)

0 голосов
/ 25 марта 2012

Замените $ myEncryptedMessage на encode_base64 ($ myEncryptedMessage)

и используйте MIME :: Base64;

...