none
WCF. Проблема с доступам к приватным ключам x509 сертификата RRS feed

  • Вопрос

  • Добрый день! Есть WCF сервис который использует x509 сертификат. OS Windows7. WCF сервис хостит написанный мной WindowsService из под учетной записи system.

    1) Если устанавливаю x509 сертификат с помощью виндовой оснастки "Сертификаты" в хранилище My/LocalMachine то все работает.

    2) Если добавляю сертификат из кода,в то же хранилище то:

    - из под учетной записи "system" сервис не запускается,пишет что не имеет доступа к приватным ключам ,хотя доступ к приватному ключу у "system" я руками выставил.

    - если запустить сервис из под моей учетной записи (из под которой инсталировался сертификат) то имеет доступ к приватным ключам и все работает.

    Буду признаетеле если подскажете почему такое происходит.

    p.s.

    Собственно пока сервис получается запустить только из под моей учетной записи,из под всех других пишет что нет доступа к приватному ключу (хотя в настройке приватного ключа сертификата я такой доступ давал)

    Что такого может быть у моей учетной записи чего нет у системной?

    в процессе изысканий выяснилось что если добавлять сертификат с помощью оснастки винды то приватный ключь кладется в папку "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys", а если из кода то в "C:\Users\msamsonenko\AppData\Roaming\Microsoft\Crypto\RSA\" может дело в этом?




    • Изменено smv_89 12 апреля 2012 г. 5:04 дополнио
    12 апреля 2012 г. 3:00

Ответы

  • В коде, который создает объект X509Certificate2 перед добавление в Store, нужно явно указать X509KeyStorageFlags.MachineKeySet. По умолчанию скорее всего вписан UserKeySet, а это приводит к тому, что: 

    Private keys are stored in the current user store rather than the local computer store. This occurs even if the certificate specifies that the keys should go in the local computer store.

    Полный пример есть в статье Installing a PFX file using X509Certificate from a standard .NET application.

    • Помечено в качестве ответа smv_89 12 апреля 2012 г. 17:34
    • Снята пометка об ответе smv_89 13 апреля 2012 г. 3:39
    • Помечено в качестве ответа smv_89 13 апреля 2012 г. 4:12
    12 апреля 2012 г. 15:25

Все ответы

  • C:\Users\msamsonenko\AppData\Roaming\Microsoft\Crypto\RSA\ - это явно хранилище для текущего пользователя (My user profile в оснастке). Проверяйте код добавления, скорее всего там хранилище неверно указывается.
    12 апреля 2012 г. 11:34
  • Это да,но дело в том что сам сертификат ложится в хранилище локальной машины.

    Насчет кода добавления,в добавлении приватного ключа я никак не участвую,это происходит автоматом,а сертификат добавляется строчкой 

    x509Store.add( ertificate, Storelocation.LocalMachine ) так что тут то же не понятно где ошибка.

    12 апреля 2012 г. 12:02
  • Может быть ошибка внутри этого x509Store.Add? Стандартный X509Store принимает StoreLocation как параметр конструктора. Может где-то по дороге теряется значение? Отладьте до стандартного класса и проверьте у него .Name и .Location перед вызовом Add(certificate).
    12 апреля 2012 г. 12:14
  • Хорошо,попробую,хотя к Location у меня притензий нет,он добавляет как надо в LocalMachine каталог My а вот с пароль кладет в пользовательское хранилище а не LocalMachine
    12 апреля 2012 г. 12:51
  • хотя если добавлять сертификат через виндовую оснастку то все то же самое только приватный ключь ложится в каталог C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys .
    12 апреля 2012 г. 13:04
  • В коде, который создает объект X509Certificate2 перед добавление в Store, нужно явно указать X509KeyStorageFlags.MachineKeySet. По умолчанию скорее всего вписан UserKeySet, а это приводит к тому, что: 

    Private keys are stored in the current user store rather than the local computer store. This occurs even if the certificate specifies that the keys should go in the local computer store.

    Полный пример есть в статье Installing a PFX file using X509Certificate from a standard .NET application.

    • Помечено в качестве ответа smv_89 12 апреля 2012 г. 17:34
    • Снята пометка об ответе smv_89 13 апреля 2012 г. 3:39
    • Помечено в качестве ответа smv_89 13 апреля 2012 г. 4:12
    12 апреля 2012 г. 15:25
  • Большое спасибо! Не знал этого! 
    12 апреля 2012 г. 16:02
  • Здравствуйте.

    Если вы разобрались с проблемой и решением является одно из сообщений PashaPash, то пожалуйста, отметьте это сообщение как ответ (кнопка Пометить как ответ).

    Спасибо.


    Для связи [mail]

    • Помечено в качестве ответа smv_89 12 апреля 2012 г. 17:31
    • Снята пометка об ответе smv_89 12 апреля 2012 г. 17:35
    12 апреля 2012 г. 17:04
  • Попробовал

    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    			X509Certificate2 certificate2 = new X509Certificate2("client.p12", "123456789", X509KeyStorageFlags.MachineKeySet);
    			store.Open(OpenFlags.ReadWrite);
    			store.Add(certificate2);
    			store.Close();

    при X509KeyStorageFlags.MachineKeySet приватный ключь не добавляется, при остальных настройках X509KeyStorageFlags то же, ключь добавляется только при X509KeyStorageFlags.PersistKeySet но кладется в личное хранилище пользователя а не в хранилище машины как необходимо.
    13 апреля 2012 г. 3:53
  • Извиняюсь,не внимательно прочитал статью из предыдущего поста,все работает!

    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    			X509Certificate2 certificate2 = new X509Certificate2(@"Certificate\" + "client.pfx", "123456789", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
    			store.Open(OpenFlags.ReadWrite);
    			store.Add(certificate2);
    			store.Close();
    Большое спасибо!
    13 апреля 2012 г. 4:11