Создать отдельную подпись CMS PKCS # 7, совместимую с командой OpenSSL SMIME - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать отдельную подпись XML-файла, чтобы отправить сообщение правительственной организации.Заявление со стороны правительства требует, чтобы PKCS # 7 отделяла подпись без сертификатов и данных (?).В документации они используют openssl в качестве примера.Из строки «это строка» (без кавычек) команда openssl:

openssl smime -sign -outform pem -signer C: \ Temp \ cert_test_np.pem -in C: \ Temp \ test.XML -out C: \ Temp \ Podpis2.xml -nocerts

генерирует эту подпись строку

----- НАЧАТЬ PKCS7 ----- MIIC0QYJKoZIhvcNAQcCoIICwjCCAr4CAQExDzANBglghkgBZQMEAgEFADALBgkq hkiG9w0BBwExggKZMIIClQIBATCBhjB /MQswCQYDVQQGEwJDWjEoMCYGA1UEAwwf SS5DQSBUZXN0IFB1YmxpYyBDQS9SU0EgMTEvMjAxNTEtMCsGA1UECgwkUHJ2bsOt IGNlcnRpZmlrYcSNbsOtIGF1dG9yaXRhLCBhLnMuMRcwFQYDVQQFEw5OVFJDWi0y NjQzOTM5NQIDAU1jMA0GCWCGSAFlAwQCAQUAoIHkMBgGCSqGSIb3DQEJAzELBgkq hkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE5MDYwNzE1MjcyMFowLwYJKoZIhvcN AQkEMSIEIDY + iM9Vpap9krHOHyxKSyBHRZM20eaMwQFR7OpqrryFMHkGCSqGSIb3 DQEJDzFsMGowCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBFjALBglghkgBZQMEAQIw CgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsO AwIHMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEBAQUABIIBAIeN8SPBeNfDmip0 NrpCoJ7c7YuuDW36OE9TN30D / ijRWcNMdgsObyNTFSrY0 / 51Gy655kejppfhwicv л / AdEXZcmM8JoWR9vHeRcklWmHLn1XYnKhDDWSQMZ0Kp62TTBTBsA6dLjizOhWx0 u4Rj / lVv5 / PmGsrQ4JmNreCaoSBAdqYOFCy2ZrvWNfhvpKPE + SDlAVMayfY0nqwM ds5pSb5o + YAWgsbfSQQU7uJp2K8XU4B1YAvGsg + aoGOxf / uiWNoppluQ9hpFAMzx tqndj8d1E2MUGkc6rISrMv + eoNheU + RM9ovDHQh9IVUDrdq8IalnjYVFsj + / 0Wcz 1O14IY0 = ----- ----- END PKCS7

I»ве написал следующий код в C #

 public static string GetSignatureString(string stringToSign, X509Certificate2 certificateToUse)
        {
            byte[] array = Encoding.ASCII.GetBytes(stringToSign);
            ContentInfo content = new ContentInfo(array);
            certificate = certificateToUse;
            SignedCms signedCMS = new SignedCms(content, true);

            CmsSigner signer = new CmsSigner(certificate);
            signer.IncludeOption = X509IncludeOption.None;
            signer.DigestAlgorithm =new Oid("2.16.840.1.101.3.4.2.1");
            signer.SignedAttributes.Add(new Pkcs9SigningTime());

            signedCMS.ComputeSignature(signer, true);
            byte[] signed = signedCMS.Encode();

            string sToWrite = Convert.ToBase64String(signed,Base64FormattingOptions.InsertLineBreaks);
            return "-----BEGIN PKCS7-----\r\n" + sToWrite + "\r\n-----END PKCS7-----\r\n";
        }

, который возвращает следующий PKCS # 7 строки

----- НАЧАТЬ pkcs7 ----- MIICVQYJKoZIhvcNAQcCoIICRjCCAkICAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwEx ggIdMIICGQIBATCBhjB / MQswCQYDVQQGEwJDWjEoMCYGA1UEAwwfSS5DQSBUZXN0IFB1YmxpYyBD QS9SU0EgMTEvMjAxNTEtMCsGA1UECgwkUHJ2bsOtIGNlcnRpZmlrYcSNbsOtIGF1dG9yaXRhLCBh LnMuMRcwFQYDVQQFEw5OVFJDWi0yNjQzOTM5NQIDAU1jMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTkwNjA3MTUzMjU0WjAvBgkqhkiG 9w0BCQQxIgQg3Obi7c6uoQfynW4GHXd9NRkmncvsYE1jAPUrepXO8PEwDQYJKoZIhvcNAQEBBQAE ggEAebxo2B + ка / xHWBWniTHSMkH8wNtRN6gWpqyI / Qq8 / ZCchcT5PiUGnUFsDWXTJVaYuFG8NLOh uRNc6pFJduPyDRCtGJxNE8o2G5mAqAvARhuY6I4DvL88 + a2Zvt1UgMyESzQqGOUT4EVCK8h + hkIy jlBpMESiJkMO6A + gLB0hfqjS5L4oIhtqr4SLhSSmyP8h / slBABYzRB6LZipFXy5252zPcgxxb8ZE ​​hutzCD1K8o / qMcyXdnZT3Tm5pqKx39P3i3dLOnsus4zIDXzb2oKJwq6HfWapVngJO / bqozmhQnJj T1uM4W / KE + sx7z / uSBOKO1DWqG48OHO4PFCRdLwAng == ----- END PKCS7 -----

Оба знаки действительны, есливы вставляете их в онлайн-декодер pkcs7 (например, https://redkestrel.co.uk/products/decoder/), но у них есть другой октет дайджеста сообщения внутри auth_attributes, который является частью, которую правительство использует, чтобы проверить, является ли сообщение действительным.

Я знаю, чтоони используют / bend over openssl smime функцию, которая должна быть для электронной почты и для CMS, они должны использовать более новую openssl cms функцию, но CMS должна быть совместима с smime, который старше.

Что я делаю не так в своей функции, что дайджест одной и той же строки отличается?

Я использую алгоритм SHA256 (они тоже), без сертификатов.внутри PKCS # 7 (они тоже), добавляя время для авторизации.атрибут (они тоже).

Только две вещи разные.1) Они сгенерировали некоторую информацию, связанную с SMIME, внутри auth.атрибут, но он должен быть вне игры, так как нам нужен тот же дайджест сообщения.

2) Я получаю сертификат непосредственно от cert.хранить внутри windows для приложения C #.OpenSSL использует .pem, экспортированный из магазина.Но они должны быть равны.

Есть ли способ, как воспроизвести тот же алгоритм (получить тот же дайджест), который используется функцией smime OpenSSL, без привязки библиотек C ++?

Спасибо

...