S / MimeメッセージをBizTalkに送信しようとしていますが、受信できないようです。
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内から作成すると(もちろん、人間にも獣にも使用できません)、正しく消費されるメッセージを作成できます。メッセージは次のようにフォーマットされていることがわかりました。
Mime Message with Base64 Encoded encrypted content.
=> Decrypts to Mime Message with Base64 Encoded Unicode content.
=> Decodes to message content.
ただし、PowerShellスクリプトを使用して同じパターンを再作成すると、上記の例外が発生します。BizTalkで作成された動作中のメッセージの正確なリテラルを送信すると、正しく機能しているように見えます。これは、他の場所でのエンコードに問題があることを意味しますが、動作中のメッセージからすべてのヘッダーをコピーして、動作していないときに使用します。 1つ(新しい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によって間違ってエンコードされている可能性があるのではないかと思います(Unicodeなどの代わりにASCIIを使用しています)が、それは少し希薄に見え、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メッセージに変換するには、上記のメッセージに示すように、ヒアドキュメントタイプの文字列のヘッダーを先頭に追加し、暗号化されたテキストを最後にプッシュするという、非常によく似た処理を行います。読みやすくするために、それらを72文字のブロックにドロップします。これはBizTalkと同じことであり、PowerShellを介して実行した場合の復号化には影響しません。
これらのリクエストを機能させるために私が他に何をする必要があるかについての考えは歓迎されます。