base64-Encoding打破smime加密的emaildata

时间:2012-03-15 13:19:42

标签: perl smime

我正在使用Mime :: Lite来创建和发送电子邮件。现在我需要添加对S / Mime加密的支持,最后可以加密我的电子邮件(我可以安装的唯一Perllib看起来很破,所以我使用的是系统调用和openssl smime),但当我尝试创建一个mime -object with it,一旦我将Content-Transfer-Encoding设置为base64,电子邮件就会被破坏。为了让它更加好奇,只有通过$myMessage->attr设置它才会发生。如果我正在使用构造函数 - >新的一切都很好,除了我用MIME::Lite->quiet(1);

压制的一点警告

这是一个错误还是我的错?以下是我创建mime-object的两种方法。

  1. 通过construtor设置Content-Transfer-Encoding并禁止警告:

    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. 通过$myMessage->attr设置Content-Transfer-Encoding,它会破坏加密数据,但不会引起警告:

    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; 
    
  3. 当我使用属性设置器时,我只是不知道为什么我的消息被破坏了。在此先感谢您的帮助!

    除此之外,我无法在不破坏加密邮件的情况下将任何文件附加到此电子邮件。

4 个答案:

答案 0 :(得分:0)

调试这个 制作一个脚本调用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();
你应该看到类似的东西。

MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Length: 49
Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
X-Mailer: MIME::Lite 3.028 (F2.74; B3.07; Q3.07)
Date: Mon, 23 Mar 2012 10:40:51 -0400
From: me@localhost
To: you@localhost
Subject: SMIME Test
Content-Transfer-Encoding: base64

VGhpcyBpcyBub3QgdmFsaWQgZW5jcnlwdGVkIG1lc3NhZ2UK

消息编码为base64,但真实消息仍需正确 encypted。你需要确保是这种情况,因为$ myEncryptedMessage是 通过调试输出,您可以与已知良好的加密邮件进行比较 并查看标题是否良好,据我所知,标题很好,很可能 无效的数据。

答案 1 :(得分:0)

正如我在一篇评论中所说,在mimeobject或->attr - Setter的construtor中设置编码的区别在于,construtor只是在mimeheader中设置编码。通过使用->attr - Setter mime使用base64对数据进行编码。

所以在我的情况下,我之前生成的mimeobject--它是base64编码的并且加密了s / mime - 从文件中读取需要来设置construtor中的编码(并禁止警告)因此,mime不再进行编码。否则,mime会对数据再次进行编码,从而破坏加密和电子邮件本身。

我终于得到了工作的附件。为了实现这一点,我创建了一个普通的multipart / mixed mimeobject,将这个对象打印到普通文件中,用openssl smime加密这个文件,将整个文件(除了6个标题行)读入变量并将其用作datainput。另外,我使用construtor将Content-Transfer-Encoding设置为base64(因此不对我的数据进行编码)。

我希望这会帮助别人,然后我;)

答案 2 :(得分:0)

我无法使用真正的邮件客户端对此进行测试,但我认为这可能适用于多部分。

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;

答案 3 :(得分:-1)

将$ myEncryptedMessage替换为encode_base64($ myEncryptedMessage)

并使用MIME :: Base64;

相关问题