Импорт ключа DSA из строки XML завершился неудачно для одного пользователя. Разрешения? Сломанная установка? Плохой KSP?

Пользователь недавно сообщил о странной ошибке при использовании моего программного обеспечения. Я использую подписи DSA для проверки лицензий. Когда программное обеспечение импортирует открытый ключ для проверки подписи, поставщик DSA ' s FromXmlString метод генерирует исключение CryptographicException с описанием « Ключ недопустим для использования в указанном состоянии. »

Похоже, что метод _OpenCSP, вызванный из System.Security.Cryptography.Utils.CreateProvHandle возвращает NTE_BAD_KEY_STATE (0x8009000b). Это первый раз, когда мне сообщили об этой ошибке, и этот код не менялся годами.

Каковы вероятные причины этого? Ошибка замаскированных разрешений? Не работает установка CAPI? Заблокировано настройками доверия / разрешений .net? Мусор, хранящийся у поставщика хранилища ключей, или KSP, возвращающий что-то неожиданное в cryptoapi?

Я искал в Google код ошибки / описание / и т. Д., Но не нашел никаких реальных ответов относительно того, что может вызвать это ...

] Изолированная версия отказавшего кода находится здесь: http://forum.huagati.com/getattachment.ashx?fileid=78

using System;
using System.Security.Cryptography;
using System.Reflection;

public class Test
{
  public static void Main()
  {
    try
    {
      string key = "

wrjxUnfKvH/1s5cbZ48vuhTjflRT5PjOFnr9GeUPZSIoZhYATYtME4JRKrXBtSkyioRNtE1xgghbGAyvAJ5jOWw88fLBF+P1ilsZyq72G1YcbB+co8ImQhAbWKmdCicO9/66Th2MB+7kms/oY3NaCzKEuR7J3b23dGrFpp4ccMM=

xmxoSErIJCth91A3dSMjC6yQCu8=bwOLeEaoJHwSiC3i3qk9symlG/9kfzcgrkhRSWHqWhyPAfzqdV1KxJboMpeRoMoFr2+RqqKHgcdbzOypmTeN4QI/qh4nSsl5iEfVerarBOrFuRdOVcJO0d8WE233XQznd1K66nXa5L8d9SNZrM6umZ1YuBjhVsTFdPlIXKfGYhk=wZnEEdMUsF3U3NBQ8ebWHPOp37QRfiBn+7h5runN3YDee1e9bC7JbJf+Uq0eQmU8zDs+avEgD68NpxTKEHGr4nQ3rW6qqacj5SDbwO7nI6eN3wWrVhvrWcQm0tUO93m64HsEJREohfoL+LjqgrqIjZVT4D1KXE+k/iAb6WKAsIA=+zmcCCNm2kn1EXH9T45UcownEe7JH+gl3Lw2lhVzXuX/dYp5sGCA2lK119iQ+m3ogjOuwABATCVFLo6J66DsSlMd0I8WSD5WKPvypQ7QjY0Iv71J2N0FW0ZXpMlk/CE8zq4Z7arM1N564mNeQDrZrUFowquY5Uay8YtUFOXnv28=Gg==
"; DSACryptoServiceProvider csp2 = new DSACryptoServiceProvider(); csp2.FromXmlString(key); Console.WriteLine("Success!"); } catch (Exception ex) { int hResult = 0; try { PropertyInfo pi = typeof(Exception).GetProperty("HResult", BindingFlags.NonPublic | BindingFlags.Instance); hResult = (int)pi.GetValue(ex, null); } catch (Exception ex2) { Console.WriteLine("HResult lookup failed: " + ex2.ToString()); } Console.WriteLine("Initializing CSP failed: " + ex.ToString() + "\r\nHResult: " + hResult.ToString("x")); } Console.WriteLine("\r\nPress Enter to continue"); Console.ReadLine(); } }

... и на компьютере затронутого пользователя он возвращает:

Initializing CSP failed: System.Security.Cryptography.CryptographicException: Ke
y not valid for use in specified state.

at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters paramete
rs, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.get_StaticDssProvHandle()
at System.Security.Cryptography.DSACryptoServiceProvider.ImportParameters(DSA
Parameters parameters)
at System.Security.Cryptography.DSA.FromXmlString(String xmlString)
at Test.Main()
HResult: 8009000b

Обновление: Тот же код отлично работает при запуске под .net fx 2.0 на том же компьютере, но не работает под .net fx 4.0.

Обновление 2: Похоже, что поставщик DSA ищет ключи, хранящиеся в% APPDATA% \ Microsoft \ Crypto \ DSS \ [SID ] даже после инициализации существующим ключом. Мог ли быть конфликт с этим механизмом? Кто-нибудь знает больше о том, как работает это хранилище ключей, и почему он срабатывает при загрузке открытого ключа из строки?

28
задан KristoferA 27 November 2010 в 05:56
поделиться