X509Сертификат сертификации2 - PullRequest
0 голосов
/ 10 февраля 2020

Я работаю над интеграцией платежного шлюза с файлом ключа сертификата (.pfx), предоставленным соответствующим органом, хотя я работаю над localhost , все работает идеально, как я ожидал. Но после публикации в windows сервер 2019 у нас возникла проблема в процессе генерации токена.

Это код генерации токена, который мы используем

RSACng key = new System.Security.Cryptography.RSACng();
            X509Certificate2 publicCert = new X509Certificate2(publicKeyLocation, "123", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
            X509Certificate2 privateCert = null;
            X509Store store = new X509Store(StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            foreach (X509Certificate2 cert in store.Certificates)
            {
                var val1 = publicCert.GetCertHashString();
                if (cert.GetCertHashString() == publicCert.GetCertHashString())
                    privateCert = cert;
            }
            key = privateCert.GetRSAPrivateKey() as RSACng;
            byte[] signature = key.SignHash(hashValue, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
            key = (System.Security.Cryptography.RSACng)publicCert.GetRSAPublicKey();
            if (!key.VerifyHash(hashValue, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1))
                throw new CryptographicException();
            return signature;

Это ответ, который мы получаем при вызове API из localhost

Success Response Got In Localhost

Это ответ API после публикации sh на windows сервере 2019

Failure response after publishing the api

1 Ответ

2 голосов
/ 10 февраля 2020

Проблема заключается здесь: X509Store store = new X509Store(StoreLocation.CurrentUser); Это работает на вашем P C, потому что у вас есть сертификат, хранящийся в хранилище CurrentUser, но при развертывании приложения на Windows сервере пользователь, на котором запущено приложение, не имеет указанного c сертификата в своем Сертифицированный магазин. Установите сертификат в хранилище сертификатов LocalMachine и получите его оттуда:

X509Store store = new X509Store(StoreLocation.LocalMachine);

или установите сертификат для исправления хранилища CurrentUser (не рекомендуется, пользователь может быть NetworkUser или System, ...)

...