2013-03-01 4 views
0

Я пытаюсь отправить сообщение S/Mime в BizTalk, но оно, похоже, не может его получить.Отправка сообщения S/Mime BizTalk - но Biztalk не может его декодировать

Я могу зашифровать и расшифровать сообщение из моего кода (я работаю в Powershell в качестве доказательства концепции), используя сертификат BizTalk и классы System.Security.Cryptography.Pkcs. Однако, когда я пытаюсь передать его в 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 (не использовать ни для человека, ни зверя, конечно), и обнаружили, что сообщение отформатирован следующим образом:

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.

Любые мысли о том, что еще мне нужно сделать для того, чтобы эти запросы работали, приветствуются.

+0

Вы пытались сравнить результат с вашего сценария Powershell и эквивалентного сообщения BizTalk для проверки различий? –

+0

@NickHeppleston действительно, вот как я составил список того, что содержит каждый шаг кодирования/шифрования. Самое большое различие, которое я вижу, заключается в том, что на самом внутреннем уровне кодирования, где фактические данные сообщений сами кодируются base64, он выглядит по-разному закодированным с Powershell, как он кодируется Biztalk, хотя он выглядит одинаково декодированным из обоих. – glenatron

ответ

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 неверен.

+0

Как вы можете видеть, текст создается 'System.Convert.ToBase64String', так как Powershell (или любое другое приложение, которое я использовал) имеет отношение к кодировке _is_ base64, но тот же текст отличается друг от друга при кодировании Biztalk. Если вы можете пролить свет на это, это будет полезно. – glenatron

 Смежные вопросы

  • Нет связанных вопросов^_^