2014-01-07 2 views
2

У меня нет большого опыта в области безопасности, но теперь я должен реализовать процедуру подписи в python.Невозможно подписать данные с X509Certificate в python

У меня есть сертификат somename.cer. У меня есть пример внедрения c# того, как подписать мою строку с этой строкой следующим образом:

CertColl - это коллекция сертификатов, в которых соответствующий код находит связанный сертификат с Thumbprint в предыдущих строках и возвращает список сертификатов.

X509Certificate2 cert = certColl[0] 
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey; 
return Convert.ToBase64String(rsa.SignData(Encoding.GetEncoding(1251).GetBytes(my_string), new SHA1CryptoServiceProvider())); 

my_string является строка, которая будет подписана и построена в коде, но мне не нужно, чтобы добавить эти шаги здесь

Так что я пытаюсь осуществить это в Python с помощью this previous Q&A

from Crypto.Util.asn1 import DerSequence 
from Crypto.PublicKey import RSA 
from binascii import a2b_base64 

pem = open("some-path/somefile.cer") # I have a certificate with `cer` extension 
lines = pem.replace(" ",'').split() 
der = a2b_base64(''.join(lines[1:-1])) 

cert = DerSequence() 
cert.decode(der) 
tbsCertificate = DerSequence() 
tbsCertificate.decode(cert[0]) 
subjectPublicKeyInfo = tbsCertificate[6] 

rsa_key = RSA.importKey(subjectPublicKeyInfo) 

Как и ожидалось, теперь я могу подписать my_string с этим.

rsa_key.sign("Hello World", "") 

Но я получаю следующее сообщение об ошибке:

TypeError: Private key not available in this object

я делаю что-то не так, как usnig неправильный метод, чтобы имитировать rsa.SignData в Python?

ответ

2

В вашем сертификате нет закрытого ключа.

Из того, что я вижу в вашем коде на C#, я предполагаю, что вы получаете сертификат из хранилища сертификатов Windows. Этот магазин может содержать сертификаты как с закрытым ключом, так и без него.

.cer Файлы, с другой стороны, (обычно) не содержат закрытых ключей - у них есть только открытые ключи. Вот почему подписание с ним невозможно.

Я предполагаю, что вы экспортировали файл .cer из хранилища сертификатов Windows и не выбрали опцию «Экспорт закрытого ключа». Вам лучше повезти, реэкспортируя его в формате .pfx или .pvk и попробуйте подписаться с этим файлом.

See more on this topic here

Смежные вопросы