Проверять подпись только с открытым ключом - PullRequest
1 голос
/ 20 марта 2019

У меня есть два приложения.Один подписывает файл, другой проверяет.

Приложение для подписи выполняет следующие действия:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "cert.pfx", "password");

using (RSA rsa = certificate.GetRSAPrivateKey())
{
    signature = rsa.SignData(exeContent, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

cert.pfx - это самозаверяющий сертификат, созданный с помощью Openssl.

Проверяющее приложение:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "cert.pfx", "password");

using (RSA rsa = certificate.GetRSAPublicKey())
{
    return rsa.VerifyData(exeContentWithoutSignature, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

Насколько я понимаю, файл .pfx содержит информацию об открытом и закрытом ключах, поэтому я не должен делать его доступным для всех.Насколько мне известно, для проверки требуется только открытый ключ.Как я могу использовать rsa.VerifyData или другие функции для проверки подписи, не раскрывая мой файл pfx?

1 Ответ

1 голос
/ 21 марта 2019

У меня уже был файл .pfx, который можно сгенерировать следующим образом:

openssl req -x509 -days 365 -newkey rsa:2048 -keyout test-key.pem -out test-cert.pem
openssl pkcs12 -export -in test-cert.pem -inkey test-key.pem -out test-cert.pfx

Для извлечения сертификата, содержащего только открытый ключ, можно использовать следующую команду:

openssl pkcs12 -in test-cert.pfx -clcerts -nokeys -out cert.pem

-clcerts - только выходные сертификаты клиента.
-nokeys - не выводить закрытые ключи.

Cert.pem можно использовать для создания экземпляра X509Certificate2:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "test-cert.pem");

using (RSA rsa = certificate.GetRSAPublicKey())
{
    return rsa.VerifyData(exeContentWithoutSignature, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}
...