Есть ли способ создать файлы .pfx для подписи документов, я нашел программу под названием x509 Certificate Generate, но я хочу знать, можно ли ее сгенерировать в коде с использованием С#.
Как создать файл .pfx?
Ответы (6)
Существует инструмент командной строки Microsoft makecert, который можно использовать для сертификаты. Это часть Windows SDK. На моей машине есть полдюжины версий, например. в 1_. Затем в своем коде вы можете запустить процесс для запуска исполняемого файла с соответствующими параметрами.
Вы можете проверить Bouncy Castle API, его можно использовать для создания сертификатов с помощью C#.
Во-первых, подписывать документы самоподписанными сертификатами не имеет смысла, если у вас в организации нет настраиваемой иерархии PKI (а в последнем случае нужно хорошо знать, что вы делаете, что, похоже, не так).
PFX — это контейнер для одного или нескольких сертификатов со связанными закрытыми ключами. Таким образом, вы не создаете «файл PFX». Вы генерируете пару ключей и создаете сертификат, который затем можно экспортировать в файл PFX или в другой формат.
Как упоминалось выше, BouncyCastle может генерировать сертификаты, и наша библиотека SecureBlackbox также может генерировать сертификаты, а также сохранять и загружать их в различных форматах.
Если вы прочитаете о makecert, на который ссылается ответ @David Clarke, вы увидите, что для выполнения вашего требования вам просто нужен управляемый makecert, написанный на .NET.
К счастью, ребята из Mono уже давно реализовали это.
https://github.com/mono/mono/blob/master/mcs/tools/security/makecert.cs
Вы можете сделать цифровую подпись с помощью Adobe Reader
если вы используете Adobe X - затем перейдите к 3-му варианту слева - здесь вы можете увидеть настройку подписи - откройте это и перейдите к добавлению идентификатора - просто введите свои данные, и ваш файл .pfx готов, где бы вы его ни просматривали .. .. -действителен 6 лет
Для этого вы можете использовать библиотеку OpenSSL.NET.
Вот пример кода, как это сделать:
public X509Certificate2 GeneratePfxCertificate(string certificatePath, string privateKeyPath,
string certificatePfxPath, string rootCertificatePath, string pkcs12Password)
{
string keyFileContent = File.ReadAllText(privateKeyPath);
string certFileContent = File.ReadAllText(certificatePath);
string rootCertFileContent = File.ReadAllText(rootCertificatePath);
var certBio = new BIO(certFileContent);
var rootCertBio = new BIO(rootCertFileContent);
CryptoKey cryptoKey = CryptoKey.FromPrivateKey(keyFileContent, string.Empty);
var certificate = new OpenSSL.X509.X509Certificate(certBio);
var rootCertificate = new OpenSSL.X509.X509Certificate(rootCertBio);
using (var certChain = new Stack<OpenSSL.X509.X509Certificate> { rootCertificate })
using (var p12 = new PKCS12(pkcs12Password, cryptoKey, certificate, certChain))
using (var pfxBio = BIO.MemoryBuffer())
{
p12.Write(pfxBio);
var pfxFileByteArrayContent =
pfxBio.ReadBytes((int)pfxBio.BytesPending).Array;
File.WriteAllBytes(certificatePfxPath, pfxFileByteArrayContent);
}
return new X509Certificate2(certificatePfxPath, pkcs12Password);
}