PHP-код проверяет подпись iPizza из банка:
$key = openssl_pkey_get_public (file_get_contents ($preferences['bank_certificate']));
if (!openssl_verify ($data, $signature, $key)) {
trigger_error ("Invalid signature", E_USER_ERROR);
}
Я пытался преобразовать его в ASP .NET, используя
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/bankert.crt"), "");
RSACryptoServiceProvider rsaCryptoIPT = new RSACryptoServiceProvider();
rsaCryptoIPT.ImportCspBlob(cert.RawData);
if (!rsaCryptoIPT.VerifyData(data, CryptoConfig.MapNameToOID("SHA1"), signature))
throw new InvalidOperationException("Invalid signature from bank ");
, но строка rsaCryptoIPT.ImportCspBlob (cert.RawData) вызываетCryptography.CryptographicException неверная версия провайдера:
StackTrace:
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.Utils._ImportCspBlob(Byte[] keyBlob, SafeProvHandle hProv, CspProviderFlags flags, SafeKeyHandle& hKey)
at System.Security.Cryptography.Utils.ImportCspBlobHelper(CspAlgorithmType keyType, Byte[] keyBlob, Boolean publicOnly, CspParameters& parameters, Boolean randomKeyContainer, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.ImportCspBlob(Byte[] keyBlob)
...
Как исправить?
файл bank_certificate содержит
----- НАЧАТЬ СЕРТИФИКАТ -----MIIDRTCCAq6gAwIBAgIBADANBgkqhkiG9w0BAQQFADB7MQswCQYDVQQGEwJFRTEO .... C82uR / wUZJDw9kj + R1O46 / byG8yA + S9FVw = * ----- END CERTIFICATEтиранидный ответ на
var cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/banksert.crt"), "");
var rsaCryptoIPT = (RSACryptoServiceProvider)cert.PublicKey.Key;
var sha1 = new SHA1CryptoServiceProvider();
if (!rsaCryptoIPT.VerifyData(data, sha1, signature))
throw new InvalidOperationException("Invalid signature from bank ");
Этот код вызывает неверную подпись из банковского исключения.Проверка объекта сертификата в показывает данные сертификата.Как это исправить, чтобы подпись была проверена?Отладчик показывает, что срок действия банковского сертификата истек.Возможно, это приводит к ошибке или второй параметр VerifyDate неверен.
Я могу успешно подписать данные, и банк принимает подпись, используя код
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/P12File.p12"), "");
RSACryptoServiceProvider rsaCryptoIPT = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] binSignature = rsaCryptoIPT.SignData(binData, sha1);
Проверка подписи банка должна быть обратной к этому процессу, те же алгоритмыиспользуются.Как проверить подпись?