Я пытаюсь отправить сообщение 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.
Любые мысли о том, что еще мне нужно сделать для того, чтобы эти запросы работали, приветствуются.
Вы пытались сравнить результат с вашего сценария Powershell и эквивалентного сообщения BizTalk для проверки различий? –
@NickHeppleston действительно, вот как я составил список того, что содержит каждый шаг кодирования/шифрования. Самое большое различие, которое я вижу, заключается в том, что на самом внутреннем уровне кодирования, где фактические данные сообщений сами кодируются base64, он выглядит по-разному закодированным с Powershell, как он кодируется Biztalk, хотя он выглядит одинаково декодированным из обоих. – glenatron