Ich habe einen funktionierenden Code, der eine korrekte Signatur eines Strings erzeugt, wenn ich ein Zertifikat aus einer Datei oder aus dem Speicher des aktuellen Benutzers lade. Wenn ich jedoch das exakt gleiche Zertifikat (derselbe .p12 und derselbe Fingerabdruck) vom Computer-Zertifikatspeicher laden, verhält es sich anders. Wenn sie von diesem Speicher geladen werden, sind die von meinem C # -Code erzeugten Signaturen die halbe Länge (1024 Bits anstelle von 2048) und sind inkorrekt. Der private Schlüssel scheint in beiden Fällen ordnungsgemäß geladen zu werden.
Warum macht das, von dem das Zertifikat geladen wird, einen Unterschied bezüglich der Signatur? Und warum sollte die Signatur die Hälfte der Länge sein?
Geladen von CurrentUser:
%Vor%(richtig)
Von LocalMachine geladen:
%Vor%(falsch - und notieren Sie die 1024-Bit-Schlüsselgröße und Signaturlänge)
Hier ist die C #, die ich verwende:
%Vor%Es stellte sich heraus, dass es etwas mit dem Dateiformat des Zertifikats zu tun hatte, das ich mit OpenSSL erstellt hatte, und dass der Kryptoanbieter nicht eingestellt war. Der kritische Befehl ist Nummer 5 unten:
Hier sind die Befehle, die ich verwendet habe, um das Arbeitszertifikat zu erstellen:
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
openssl req -new -key private_key.pem -out csr.csr
openssl x509 -req -days 1095 -in csr.csr -signkey private_key.pem -out certificate.crt
openssl pkcs12 -export -in certificate.crt -inkey private_key.pem -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider" -out TEST_pfx.pfx
Tags und Links c# cryptography encryption x509certificate