Я пытаюсь создать отдельную подпись 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 ++?
Спасибо