X509AsymmetricSecurityKey.GetAsymmetricAlgorithm возвращает нулевое значение после обновления .Net 4.7.2 - PullRequest
0 голосов
/ 29 ноября 2018

У меня проблема с X509AsymmetricSecurityKey.GetAsymmetricAlgorithm, работающим в стандартном модульном тесте.В течение многих лет тест проходил на .Net Framework версии 4.5.2 (C #), однако после обновления проекта до версии 4.7.2 он потерпел неудачу, так как GetAsymmetricAlgorithm возвращает значение NULL.Точно такой же код отлично работает вне теста.

X509Certificate2 cert = null;
var store = new X509Store(StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);

// I'm actually using FindByThumbprint, just changing this here to protect keys
cert = store.Certificates[0];

// cert is valid X509, securityKey is valid
X509AsymmetricSecurityKey securityKey = new X509AsymmetricSecurityKey(cert);

// rsa is null
RSACryptoServiceProvider rsa = securityKey.GetAsymmetricAlgorithm(SecurityAlgorithms.RsaSha256Signature, true) as RSACryptoServiceProvider;

Тот же код, тот же сертификат, работает, хотя тест GetAsymmetricAlgorithm возвращает ноль, работает на «живом» коде (библиотека классов, вызываемая из WebAPI), он работает отлично.

Есть идеи почему?Я не вижу ничего в документах для предыдущих изменений .Net, ничего в документах Microsoft.

https://docs.microsoft.com/en-us/dotnet/api/system.identitymodel.tokens.x509asymmetricsecuritykey.getasymmetricalgorithm?view=netframework-4.7.2

Спасибо за любую помощь в этом.

1 Ответ

0 голосов
/ 29 ноября 2018

Как Crypt32 предложил в комментарии, проблема в том, что после перехода с таргетинга <= 4.6.2 на таргетинг 4.7 (+) вы получили «<a href="https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/retargeting/" rel="nofollow noreferrer"> изменение ретаргетинга », в котором говорится, что GetAsymmetricAlgorithm разрешеновозвращать экземпляры RSACng, который является лучшим классом RSA в .NET Framework.

Лучшее действие в вашем коде - изменить строку на

RSA rsa = securityKey.GetAsymmetricAlgorithm(SecurityAlgorithms.RsaSha256Signature, true) as RSA;

Затем найдите места, в которых кодбольше не компилируется и изменяется от метода варианта RSACryptoServiceProvider к новым методам RSA (базовый класс).(например, SignData(byte[], object) => SignData(byte[], RSASignaturePadding)).

Вы действительно хотите не говорить RSACng или RSACryptoServiceProvider, если можете помочь, поскольку есть теоретические случаи, когда RSACng не будет работатьи вместо него будет возвращено RSACryptoServiceProvider (более старые смарт-карты / HSM, имеющие драйвер CAPI, но не драйвер CNG).

Это конкретное изменение ретаргетинга - версия System.IdentityModel https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/retargeting/4.5-4.7.2#wcf-transport-security-supports-certificates-stored-using-cng,который, кажется, не был записан.Если вам нужно отключить это, имя параметра будет Switch.System.IdentityModel.DisableCngCertificates.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...