Невозможно проверить подпись файла с помощью сертификата X509C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно проверить подпись файла с помощью сертификата X509

Сообщение Anonymous »

У меня есть общедоступный сертификат, который я пытаюсь проверить подпись файла. Я могу загрузить и увидеть большую часть свойств сертификата без проблем, однако всякий раз, когда я пытаюсь использовать функцию x509Certificate2.getDsapublickey, я получаю обратно, что открытый ключ недействителен. Чтобы подтвердить это утверждение, я попытался использовать другую программу, чтобы увидеть, смогу ли я получить подтвержденную подпись для файла, в моем случае я использовал Python. Используя скрипт Python, я обнаружил, что смог проверить подпись файла, используя общественный сертификат. Есть ли что -то, что мне нужно конкретно сделать в C#, чтобы заставить его признать, что общедоступный сертификат действителен? /> using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace S101VerifyDSA
{
class S101VerifyDSA
{
static void Main(string[] args)
{
X509Certificate2 x509 = new X509Certificate2(
Convert.FromBase64String("MIIEkjCCBE8CCQCWKCqpzWh2nzALBglghkgBZQMEAwIwZDELMAkGA1UEBhMCTUMxEzARBgNVBAgMClNvbWUtU3RhdGUxDDAKBgNVBAoMA0lITzEXMBUGA1UEAwwOSUhPIFNjcmV0YXJpYXQxGTAXBgkqhkiG9w0BCQEWCmpwQGloby5pbnQwHhcNMjIwOTI3MTMxOTI3WhcNMzIwODA1MTMxOTI3WjBlMQswCQYDVQQGEwJHQjERMA8GA1UECAwIcHJvZHVjZXIxHTAbBgNVBAoMFElJQyBUZWNobm9sb2dpZXMsIFVLMSQwIgYDVQQDDBt1cm46bXJuOmlobzpzNjI6aWljOjJDOmtleTEwggNGMIICOQYHKoZIzjgEATCCAiwCggEBALsK2LrTON5EtKq2QU8SbD14/bqybjPY5+uGLORcA6LEiu0uUSjfzZX2FlF9A1j4rx4kPpk8fBcvH5OWivmTMbiSpdurvIavfecFXRgTYmbmnLpUC4f8HPewtJO3ESPnIXkF81SPxi7syz11Y0F09yAStZyyIlOc0vHsPeteE7SafurIXdWwNkn1A/zdH1hHa7HTSl0GW9NMfu1BaBTl+kX7JWeKsozsrgdFgO2EETa/6JIkczbsu4eVDQqNnXJoM0mC0AsZQgynkJEPJ84yux3HofNy8t6Apt0CA61bwUJKUMiGyFTco5zNBK4B14agmW/Os+h/tcPerNZfRX1HWHkCIQClLmOUnnrwnPdai0+atceUU6ZYBl16uYsOWshi7Jmd3wKCAQBsUF07Qz7hUriINnJQzGcn5eKEpJTBCTAlrus8Vyd7BOcxLj1sFDhuWiovDE8IjzWFeIDBHMKh78n7vaFv0H22dPDMfxn2n1Xn25YfCxDKMJ7ED5FjuyCMY+SLl6vtk22BqtAuLABqw8LH+bD30vfOZfNYv0F7Fz1zEWNLPRXAO2uRoZIqq6OLh9/gHF9LJWay6GLOoF1R9+G7FdKDemvFx3aNldi+vUlRk9x7ghYXJzhLWRdJEUi4y1n2ep91yK4JyMS8QVfvvnxvwBwm1q2FVwCz0JPpXEYjPvv0ioN0TbH0GLtZcEWQH+0gZvJicJ+jecB/FRuZFDcWx5lYxLqyA4IBBQACggEAG5r1LMogokkNEFFGz8LcNPE+3/k3T7SDEIoj9/AaUuEOadL63Z3/ojG2oJiHUM5A82NjdbJj+onOkBQgjBq/GrVPFGv3029thae5edy+5fsoJ5gMbdBX4ASzE+sEv91ZVEct9kifYGdJYeTmqKD9AQ95l9ayI1erOKDjmNpju0yBcNRyRnbe//duAiakpiHgOvzwjZBCQElIhNraRhCjpMYaqsPMCEBK+pMOtGjQ7NQ7hsmFhk8Tde3jLXcr2FG5C+ZW9XJQq3UIai2ibtQLAN+kLRiTk1pdEeh1B60FZ+EIG9raZ1+6XjIb7N4YsOqJ31odAAiHM2GY1qSPizI3azALBglghkgBZQMEAwIDMAAwLQIUPLXXtV9xPk6DzBmnmfOTOVRJ5k8CFQCZlnr6PtefctC3qPmLBn72p6pLjw==")
);

// Note that you don't need to print the info, more just for debugging
// Print to console information contained in the certificate.
Console.WriteLine("Subject: {0}", x509.Subject);
Console.WriteLine("Issuer: {0}", x509.Issuer);
Console.WriteLine("Version: {0}", x509.Version);
Console.WriteLine("Valid Date: {0}", x509.NotBefore);
Console.WriteLine("Expiry Date: {0}", x509.NotAfter);
Console.WriteLine("Thumbprint: {0}", x509.Thumbprint);
Console.WriteLine("Serial Number: {0}", x509.SerialNumber);
Console.WriteLine("Friendly Name: {0}", x509.PublicKey.Oid.FriendlyName);
Console.WriteLine("Public Key Format: {0}", x509.PublicKey.EncodedKeyValue.Format(true));
Console.WriteLine("Raw Data Length: {0}", x509.RawData.Length);
Console.WriteLine("Certificate to string: {0}", x509.ToString(true));
Console.WriteLine("Certificate to XML String: {0}", x509.PublicKey.Key.ToXmlString(false));

byte[] content = File.ReadAllBytes("101AA0000DS0009.000");
byte[] signature = Convert.FromBase64String("MEQCIBqMq1kbfwMmAu3kvn8JPHWSVkLv1wWzooZwV2Rlva25AiBmb1MR3xbObX9HNZuXwsFyPDgnCy62ArkJrivGrukhkg==");
bool result = x509.GetDSAPublicKey().VerifyData(
content,
signature,
HashAlgorithmName.SHA256
//RSASignaturePadding.Pkcs1
);
Console.WriteLine(result);
}
}
}
< /code>
Я также использовал следующий скрипт Python для проверки подписи файла.import base64
import hashlib
from cryptography import x509
import cryptography
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, dsa, ec
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization

def read_x509_certificate_from_base64(base64_string):
"""
Reads an X.509 certificate from a base64 encoded string.

Args:
base60_string: The base64 encoded string of the certificate.

Returns:
An x509.Certificate object, or None if an error occurs.
"""
try:
# Decode the base64 string
der_bytes = base64.b64decode(base64_string)
# Load the DER encoded certificate
certificate = x509.load_der_x509_certificate(der_bytes, default_backend())
return certificate
except Exception as e:
print(f"Error reading certificate: {e}")
return None

# Example usage
base64_certificate = """
MIIEkjCCBE8CCQCWKCqpzWh2nzALBglghkgBZQMEAwIwZDELMAkGA1UEBhMCTUMxEzARBgNVBAgMClNvbWUtU3RhdGUxDDAKBgNVBAoMA0lITzEXMBUGA1UEAwwOSUhPIFNjcmV0YXJpYXQxGTAXBgkqhkiG9w0BCQEWCmpwQGloby5pbnQwHhcNMjIwOTI3MTMxOTI3WhcNMzIwODA1MTMxOTI3WjBlMQswCQYDVQQGEwJHQjERMA8GA1UECAwIcHJvZHVjZXIxHTAbBgNVBAoMFElJQyBUZWNobm9sb2dpZXMsIFVLMSQwIgYDVQQDDBt1cm46bXJuOmlobzpzNjI6aWljOjJDOmtleTEwggNGMIICOQYHKoZIzjgEATCCAiwCggEBALsK2LrTON5EtKq2QU8SbD14/bqybjPY5+uGLORcA6LEiu0uUSjfzZX2FlF9A1j4rx4kPpk8fBcvH5OWivmTMbiSpdurvIavfecFXRgTYmbmnLpUC4f8HPewtJO3ESPnIXkF81SPxi7syz11Y0F09yAStZyyIlOc0vHsPeteE7SafurIXdWwNkn1A/zdH1hHa7HTSl0GW9NMfu1BaBTl+kX7JWeKsozsrgdFgO2EETa/6JIkczbsu4eVDQqNnXJoM0mC0AsZQgynkJEPJ84yux3HofNy8t6Apt0CA61bwUJKUMiGyFTco5zNBK4B14agmW/Os+h/tcPerNZfRX1HWHkCIQClLmOUnnrwnPdai0+atceUU6ZYBl16uYsOWshi7Jmd3wKCAQBsUF07Qz7hUriINnJQzGcn5eKEpJTBCTAlrus8Vyd7BOcxLj1sFDhuWiovDE8IjzWFeIDBHMKh78n7vaFv0H22dPDMfxn2n1Xn25YfCxDKMJ7ED5FjuyCMY+SLl6vtk22BqtAuLABqw8LH+bD30vfOZfNYv0F7Fz1zEWNLPRXAO2uRoZIqq6OLh9/gHF9LJWay6GLOoF1R9+G7FdKDemvFx3aNldi+vUlRk9x7ghYXJzhLWRdJEUi4y1n2ep91yK4JyMS8QVfvvnxvwBwm1q2FVwCz0JPpXEYjPvv0ioN0TbH0GLtZcEWQH+0gZvJicJ+jecB/FRuZFDcWx5lYxLqyA4IBBQACggEAG5r1LMogokkNEFFGz8LcNPE+3/k3T7SDEIoj9/AaUuEOadL63Z3/ojG2oJiHUM5A82NjdbJj+onOkBQgjBq/GrVPFGv3029thae5edy+5fsoJ5gMbdBX4ASzE+sEv91ZVEct9kifYGdJYeTmqKD9AQ95l9ayI1erOKDjmNpju0yBcNRyRnbe//duAiakpiHgOvzwjZBCQElIhNraRhCjpMYaqsPMCEBK+pMOtGjQ7NQ7hsmFhk8Tde3jLXcr2FG5C+ZW9XJQq3UIai2ibtQLAN+kLRiTk1pdEeh1B60FZ+EIG9raZ1+6XjIb7N4YsOqJ31odAAiHM2GY1qSPizI3azALBglghkgBZQMEAwIDMAAwLQIUPLXXtV9xPk6DzBmnmfOTOVRJ5k8CFQCZlnr6PtefctC3qPmLBn72p6pLjw==
"""
cert = read_x509_certificate_from_base64(base64_certificate)

if cert:
# Note that you don't have to print this, it's more for debugging
print("Certificate loaded successfully:")
print(f" Subject: {cert.subject}")
print(f" Issuer: {cert.issuer}")
print(f" Serial Number: {cert.serial_number}")
print(f" Not valid before: {cert.not_valid_before}")
print(f" Not valid after: {cert.not_valid_after}")

public_key = cert.public_key()

# Note that you can skip this as well as I was checking to see the type of public key it was
if isinstance(public_key, rsa.RSAPublicKey):
print("RSA")
elif isinstance(public_key, dsa.DSAPublicKey):
print("DSA")
elif isinstance(public_key, ec.EllipticCurvePublicKey):
print("EC")
else:
print("Unknown")

with open("101AA0000DS0009.000", "rb") as file:
content = file.read()
hash_sha256 = hashlib.sha256()
hash_sha256.update(content)
try:
cert.public_key().verify(
signature=base64.b64decode("MEQCIBqMq1kbfwMmAu3kvn8JPHWSVkLv1wWzooZwV2Rlva25AiBmb1MR3xbObX9HNZuXwsFyPDgnCy62ArkJrivGrukhkg=="),
data=content,
algorithm=hashes.SHA256(),
)
print("File is verified!", hash_sha256.hexdigest())
except cryptography.exceptions.InvalidSignature as e:
print('ERROR: Payload and/or signature files failed verification!')
else:
print("Failed to load certificate.")
< /code>
Вы можете найти файлы и сертификат здесь. Сертификат (в BASE64) находится в элементе S100SE: Сертификат, и данные можно найти в папке S-101/DATASET_FILES в том же репозитории. и сообщение об ошибке. < /p>
стек вызовов: строка 27 < /p>

system.security.cryptography.crpytographicexception: 'Provider's Public Key является недействительным.' HResult -2146893803 Stack Trace: at
system.security.cryptography.x509Certificates.x509Pal.constructdSspublickeyCspblob(byte=br /> incodedkeyvalue, byte [] incodparameters) у
/> system.security.cryptography.x509certiationates.x509pal.decodepublickey(oid
oid, byte [] oncodkeyvalue, byte [] incodparameters, icertificatepal
certictive) у
system.security.cryptography.x509certificates.publickey.get_key()

at s101verifydsa.s101verifydsa.main (string [] args) в
.\ program.cs:line 27 < /p>
< /blockquote>

Подробнее здесь: https://stackoverflow.com/questions/796 ... ertificate
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Невозможно проверить подпись файла с помощью сертификата X509
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Невозможно проверить подпись файла с помощью сертификата X509
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Проверьте подпись сертификата x509
    Anonymous » » в форуме C#
    0 Ответы
    50 Просмотры
    Последнее сообщение Anonymous
  • Проверьте подпись сертификата x509
    Гость » » в форуме C#
    0 Ответы
    85 Просмотры
    Последнее сообщение Гость
  • С# создание нового сертификата X509 с использованием файла PFX не работает
    Anonymous » » в форуме C#
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»