openssl cms
(также более ранний и менее способный smime
) использует внутренние подпрограммы, которые реализуют формат SMIME только для Content-Transfer-Encoding: Base64 и не поддерживают Content- Transfer -Encoding: двоичный. FWIW они задокументированы как ошибки, поэтому могут когда-нибудь быть исправлены.
Как обходной путь, в Unix вы можете отбросить заголовки MIME с помощью sed
оставив двоичное тело, которое openssl
может обработать (как der):
$ sed '1,/^\r$/d' <suA97544.mime >suA97544.body
$ ll suA975*
-rw-r--r--. 1 [redacted] 2760 Jul 6 23:07 suA97544.body
-rw-r--r--. 1 [redacted] 2934 Jul 6 22:26 suA97544.mime
$ openssl cms -uncompress -inform der -in suA97544.body
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="boundaryk/tP"
--boundaryk/tP
Content-Type: application/edi-x12
Content-Transfer-Encoding: binary
Content-Disposition: Attachment; filename="test_data_1.edi"
[content snipped but it does look like EDI to me]
--boundaryk/tP
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Disposition: attachment; filename="smime.p7s"
Content-Transfer-Encoding: base64
MIIETwYJKoZIhvcNAQcCoIIEQDCCBDwCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCCAoUw
ggKBMIIB6qADAgECAgICzDANBgkqhkiG9w0BAQsFADCBhTEPMA0GA1UEAxMGUlNTQnVzMQ8wDQYD
VQQKEwZSU1NCdXMxDzANBgNVBAsTBlJTU0J1czEPMA0GA1UEBxMGUlNTQnVzMQ8wDQYDVQQIEwZS
U1NCdXMxCzAJBgNVBAYTAlVTMSEwHwYJKoZIhvcNAQkBFhJjb250YWN0QHJzc2J1cy5jb20wHhcN
MTYwNzA2MDM0OTMwWhcNMjEwNzA1MDM0OTMwWjCBhTEPMA0GA1UEAxMGUlNTQnVzMQ8wDQYDVQQK
EwZSU1NCdXMxDzANBgNVBAsTBlJTU0J1czEPMA0GA1UEBxMGUlNTQnVzMQ8wDQYDVQQIEwZSU1NC
dXMxCzAJBgNVBAYTAlVTMSEwHwYJKoZIhvcNAQkBFhJjb250YWN0QHJzc2J1cy5jb20wgZ8wDQYJ
KoZIhvcNAQEBBQADgY0AMIGJAoGBAOX0Z14r96LO/4MucxgoIEa2UZkpxHhvR00mwVpqBS0l0Kn9
2zI8RbVnDXUotaNB0KzadVct+AjivFj07YbX+EW0WAPhspXLrIxsxX3AIqfGC6KEK4CCfhwdazns
8n9jIHWCqk/kfnYpTWINeAPxQs3OgzbZrd3AowI+dFsYKFqRAgMBAAEwDQYJKoZIhvcNAQELBQAD
gYEAZVU+LCu1fARUGDxyGk10EeTXhMTSukw6EOLEAixUA8rr3nvj4dk2EbUlKNeaQ+4VjTJMRBGp
PF/0Pdw6olBerldJYq6Ri7XLFOwexNc2/j4oEEahAUHxH5YTGLiDiaTKJ2jjP0CVSqF34ElFLcdq
pKjgJe/wRZDk845AgGjvu00xggGSMIIBjgIBATCBjDCBhTEPMA0GA1UEAxMGUlNTQnVzMQ8wDQYD
VQQKEwZSU1NCdXMxDzANBgNVBAsTBlJTU0J1czEPMA0GA1UEBxMGUlNTQnVzMQ8wDQYDVQQIEwZS
U1NCdXMxCzAJBgNVBAYTAlVTMSEwHwYJKoZIhvcNAQkBFhJjb250YWN0QHJzc2J1cy5jb20CAgLM
MAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
NjA3MDYwNDA4MjlaMCMGCSqGSIb3DQEJBDEWBBRlZtMMIUzoSqDb4wc6ClFNPoEvpjANBgkqhkiG
9w0BAQEFAASBgKNvF+6hCS1TH1XPEfty2Dz9OvJ6LqKCDfzC/W9GPvo3Te0u00T21hPM1imfJJaD
oc6LFxiyE5JwXkgJBq7kx1yaYXL3coDdlnrrff3dvJos6yoY1DoHc+/b1wQyDIfrZTQeUf2F3XkA
RYV+n0be2C4zaBCz6F5JrCJob3uw2xVK
--boundaryk/tP--
Если вместо отображения распакованного вывода я помещаю его в файл и пробую на нем cms -verify
(в формате SMIME по умолчанию), он успешно анализируется, но не проходит проверку, поскольку сертификат самоподписан; если я извлекаю сертификат и доверяю ему вручную (что, конечно, небезопасно, но это всего лишь тест), он действительно проверяет.
НТН.