当源消息具有 unix 行结尾时,Openssl 验证不起作用
Openssl verification does not work when the source message has unix line endings
我正在构建一个系统来接收来自外部合作伙伴的 AS2 消息。
我能够成功解密并验证消息的签名。但是,当我们的合作伙伴向我们发送带有 unix 行结尾的文件时,我无法验证签名:
Verification failure
140390438954304:error:2E09A09E:CMS routines:CMS_SignerInfo_verify_content:verification failure:../crypto/cms/cms_sd.c:847:
140390438954304:error:2E09D06D:CMS routines:CMS_verify:content verify error:../crypto/cms/cms_smime.c:393:
任何其他在签名、加密之前具有 dos 行结尾的源文件都可以在我这边进行验证。
验证命令:
openssl cms -verify -noverify -nointern -in message_dos_signed.txt -out verified.txt -certfile mb24arcesb.cer
我已经上传了带有unix和dos行尾的示例文件,我们可以看到示例文件message_unix_signed.txt在消息部分有unix行尾,但在签名部分有dos行尾,因为来源消息有 unix 结尾。
https://www.mediafire.com/folder/8svkcvq86elgg/Testfiles
没有明显的原因会发生这种情况。我们的合作伙伴正在使用 arcesb 进行 AS2 通信。如果他将两个文件都发送到另一个 arcesb 实例,则两个文件都可以被解密和验证。他使用相同的测试证书和测试密钥。使用我们的真实证书文件,其行为相同。所以也许我在验证步骤中遗漏了什么?
更新
我可以在本地重现该问题。使用这些命令,它适用于任何行结尾。
openssl cms -sign -in msg/RAW.edi -out msg/1_SIGNED.edi -inkey ../certs/mb24arcesb.pem -signer ../certs/mb24arcesb.cer
openssl cms -encrypt -in msg/1_SIGNED.edi -out msg/2_ENCRYPTED.edi ../certs/mb24arcesb.cer
openssl cms -decrypt -in msg/2_ENCRYPTED.edi -recip ../certs/mb24arcesb.cer -inkey ../certs/mb24arcesb.pem -out msg/3_DECRYPTED.edi
openssl cms -verify -nointern -noverify -in msg/3_DECRYPTED.edi -out msg/4_EDIFACT.edi -certfile ../certs/mb24arcesb.cer
但是当我使用-binary 选项对文件进行签名时,验证仅在源文件具有dos 行结尾时才有效。所以我猜我们合作伙伴的软件正在使用 -binary 选项对其进行签名。我怎样才能以这种方式验证它? “验证二进制文件”不起作用。
尝试使用 openssl cms 命令的 -binary
选项。来自手册页:
https://www.openssl.org/docs/man3.0/man1/openssl-cms.html
-binary
Normally the input message is converted to "canonical" format which
is effectively using CR and LF as end of line: as required by the
S/MIME specification. When this option is present no translation
occurs. This is useful when handling binary data which may not be
in MIME format.
这是 openssl 版本 <= 1.1.1 中的错误。
https://github.com/openssl/openssl/issues/17797
我正在构建一个系统来接收来自外部合作伙伴的 AS2 消息。 我能够成功解密并验证消息的签名。但是,当我们的合作伙伴向我们发送带有 unix 行结尾的文件时,我无法验证签名:
Verification failure
140390438954304:error:2E09A09E:CMS routines:CMS_SignerInfo_verify_content:verification failure:../crypto/cms/cms_sd.c:847:
140390438954304:error:2E09D06D:CMS routines:CMS_verify:content verify error:../crypto/cms/cms_smime.c:393:
任何其他在签名、加密之前具有 dos 行结尾的源文件都可以在我这边进行验证。
验证命令:
openssl cms -verify -noverify -nointern -in message_dos_signed.txt -out verified.txt -certfile mb24arcesb.cer
我已经上传了带有unix和dos行尾的示例文件,我们可以看到示例文件message_unix_signed.txt在消息部分有unix行尾,但在签名部分有dos行尾,因为来源消息有 unix 结尾。
https://www.mediafire.com/folder/8svkcvq86elgg/Testfiles
没有明显的原因会发生这种情况。我们的合作伙伴正在使用 arcesb 进行 AS2 通信。如果他将两个文件都发送到另一个 arcesb 实例,则两个文件都可以被解密和验证。他使用相同的测试证书和测试密钥。使用我们的真实证书文件,其行为相同。所以也许我在验证步骤中遗漏了什么?
更新
我可以在本地重现该问题。使用这些命令,它适用于任何行结尾。
openssl cms -sign -in msg/RAW.edi -out msg/1_SIGNED.edi -inkey ../certs/mb24arcesb.pem -signer ../certs/mb24arcesb.cer
openssl cms -encrypt -in msg/1_SIGNED.edi -out msg/2_ENCRYPTED.edi ../certs/mb24arcesb.cer
openssl cms -decrypt -in msg/2_ENCRYPTED.edi -recip ../certs/mb24arcesb.cer -inkey ../certs/mb24arcesb.pem -out msg/3_DECRYPTED.edi
openssl cms -verify -nointern -noverify -in msg/3_DECRYPTED.edi -out msg/4_EDIFACT.edi -certfile ../certs/mb24arcesb.cer
但是当我使用-binary 选项对文件进行签名时,验证仅在源文件具有dos 行结尾时才有效。所以我猜我们合作伙伴的软件正在使用 -binary 选项对其进行签名。我怎样才能以这种方式验证它? “验证二进制文件”不起作用。
尝试使用 openssl cms 命令的 -binary
选项。来自手册页:
https://www.openssl.org/docs/man3.0/man1/openssl-cms.html
-binary
Normally the input message is converted to "canonical" format which
is effectively using CR and LF as end of line: as required by the
S/MIME specification. When this option is present no translation
occurs. This is useful when handling binary data which may not be
in MIME format.
这是 openssl 版本 <= 1.1.1 中的错误。 https://github.com/openssl/openssl/issues/17797