将S / Mime消息发送到BizTalk - 但Biztalk无法对其进行解码

时间:2013-03-01 17:20:30

标签: powershell biztalk smime

我正在尝试向BizTalk发送S / Mime消息但它似乎无法接收它。

我可以使用BizTalk证书和System.Security.Cryptography.Pkcs类从我的代码(我在Powershell中作为概念证明)加密和解密消息。但是,当我努力将其直接传递给BizTalk时,我看到了这样的信息:

There was a failure executing the receive pipeline: 
[... application name ... ]
Source: "MIME/SMIME decoder" 
Receive Port: "ReceiveEncryptedPort" 
URI: "FORMATNAME:DIRECT=OS:.\PRIVATE$\encrypted_queue"
Reason: There was an authentication failure. "Failed to decode the S/MIME message. The S/MIME message may not be valid.".  

如果我从BizTalk中做到这一点,我可以创建一个正确使用的消息(当然没有用于man或beast)并且发现消息的格式如此:

Mime Message with Base64 Encoded encrypted content.
    => Decrypts to Mime Message with Base64 Encoded Unicode content.
    => Decodes to message content.

但是,当我使用PowerShell脚本重新创建相同的模式时,会出现上述异常。如果我发送在BizTalk中创建的工作消息的确切文字它似乎正常工作,这意味着我的编码在其他地方有问题,但因为我已经复制了工作消息中的所有标头以用于非工作那些(除了我添加一个新的Content-Id)我发现很难理解BizTalk失败的区别。

示例消息如下所示:

Content-ID: {28c96069-f9a4-4cb3-9587-f1cb229dd54b} 
Bcc: MIME-Version 1.0
Content-type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

MIICggYJKoZIhvcNAQcDoIICczCCAm8CAQAxgcgwgcUCAQAwLjAaMRgwFgYDVQQDEw93d3cuZGxy
    -- More Base64 Encoded Text --
FZ6L1V+AylyzI7H+P0pmhA9yRl2Q/OiqRnNQ6tmw0mXkZxinuVryVha5aPkVhF19LJiS+vbjVWTF
jCDLdfJh4jMmOHlAiVOPc+TAIA==

我想知道是否有可能以某种方式将文本编码错误的Powershell - 使用ASCII而不是Unicode或其他东西 - 但这似乎有点脆弱,使BizTalk看起来令人难以置信的脆弱。

我用来加密邮件的代码是这样的:

function encryptWithCms( $text,  $certPath="cert:\CurrentUser\TrustedPeople", $certName="CN=myCertificate" )
{
   Add-Type -assemblyName "System.Security";
   $cert = Get-ChildItem $certPath | Where-Object { $_.Subject -eq $certName };
   $unicode = new-object System.Text.UnicodeEncoding;
   #this part copied directly from the internal message that BizTalk will accept.
   $pretext = @'
Content-Type: text/plain; charset="utf-16"
Content-Transfer-Encoding: base64
Content-Description: body

'@;
   $pretext+= "`r`n";
    $text = [System.Convert]::ToBase64String( $unicode.GetBytes( $text ));
    $text = $pretext+$text;
    Write-Host $text;
   $encryptData = $unicode.GetBytes( $text );
   $contentInfo = new-object System.Security.Cryptography.Pkcs.ContentInfo (,$encryptData);
   $cmsRecipient = new-object System.Security.Cryptography.Pkcs.CmsRecipient $cert;
   $envelopedCms = new-object System.Security.Cryptography.Pkcs.EnvelopedCms $contentInfo;
   $envelopedCms.Encrypt($cmsRecipient);
   return  [System.Convert]::ToBase64String($envelopedCms.Encode());
}

要将其转换为S / Mime消息,我会做一些非常类似的事情,在heredoc类型字符串前面加上标题,然后按照上面的消息所示在末尾推送加密文本。为了便于阅读,我将它们放入72个字符块中,这与BizTalk的功能相同,并且在通过PowerShell运行时不会影响解密。

我们欢迎任何关于为了让这些请求正常工作我还需要做些什么的想法。

1 个答案:

答案 0 :(得分:0)

以下问题的原因是由于提供的输入不是MIME格式。检查提供的输入,它接受Base64格式。

Error: There was an authentication failure. "Failed to decode the S/MIME message. The S/MIME message may not be valid.".  

如果MIME邮件的格式错误,我们将面临此问题。