Member 13036075 Ответов: 1

PKCS12 подписывает строку


У меня есть код, написанный на C#, чтобы подписать и обернуть строку для отправки в веб-службу, этот код получает сертификат в формате .pfx и пароль сертификата.

string myString = "Hello World";
X509Certificate2 cert = new X509Certificate2(@"<MY PFX FILE>", "<MY PASS>");
CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, cert);
signer.DigestAlgorithm = new Oid("<MY OID>");

ContentInfo content = new ContentInfo(new Oid("<MY OID>"), new System.Text.UTF8Encoding().GetBytes(myString));
SignedCms signedCms = new SignedCms(content, false);

signedCms.ComputeSignature(signer, false);

var asig = signedCms.Encode();


Теперь мне нужно написать код, который делает точно то же самое, но в C, выполнив несколько поисков в google, я нашел несколько библиотек. вот и работаю с этим типом информации, и в этом поиске я нашел OpenSSL.

Но я не нашел, как я мог бы подписать и обернуть сообщение, точно так же, как я делаю это в C#. Заранее спасибо, если кто-нибудь может мне помочь, как я могу сделать то же самое, что я делаю в C# в C.

Что я уже пробовал:

Я провел несколько тестов с Либ " Чилкат", C RSA подписывает с помощью закрытого ключа от .pfx/. p12 до подписи Base64[^], когда я зашифровал одну и ту же информацию с помощью моей программы на C# и с помощью этой программы на C++, выход был совершенно другим, и я не знал, как использовать алгоритм дайджеста OID...

С OpenSSL я не нашел, как я могу подписать сообщение с помощью сертификации PKCS#7.

Garth J Lancaster

Я не завидую вашей задаче - есть так много параметров/переменных, которые должны быть "просто так" с каждой стороны - это достаточно плохо, используя "общую библиотеку", но только c# vs OpenSSL (например)

Я сделал "похожее", но потом обманул - нашел библиотеку на c++, написал высокоуровневую оболочку для требуемых от нее функционалов на c++, экспортировал эту оболочку как dll, а затем использовал слой взаимодействия P/Invoke из c# - это означало, что я использую яблоки и яблоки с каждой стороны.

Этот комментарий, скорее всего, вам совсем не поможет - и я повернул свое решение "наоборот", основывая его на стороне c++, а не на c# .. Я не сомневаюсь, что это выполнимо в OpenSSL и C#, но, скорее всего, это потребует большого количества исследований и экспериментов

1 Ответов

Рейтинг:
0

manoranjan

Есть довольно много шагов, которые необходимо сделать при использовании OpenSSL:
1. Сначала считайте данные pfx (закодированные в формате DER) из источника (например, файла)
2. Разобрать его, чтобы получить его содержимое (закрытый ключ, сертификат и КАС)
3. подпишите данные с помощью закрытого ключа

OpenSSL предоставляет набор функций, например d2i_PKCS12_fp () для импорта данных DER в свою внутреннюю структуру данных. d2i_PKCS12_fp считывает данные PKCS12 в формате DER из файла (заданного указателем файла).

Используйте PKCS12_parse (), чтобы получить закрытый ключ.
Видишь https://www.openssl.org/docs/man1.1.0/crypto/PKCS12_parse.html

Вы можете использовать EVP_Sign (или его варианты) для подписи ваших данных. Однако это не создает подпись PKCS#7.

Используйте PKCS7_sign () для создания подписи PKCS#7.
Видишь https://www.openssl.org/docs/man1.1.0/crypto/PKCS7_sign.html

Удачи вам!