Могу ли я использовать X509Certificate2 в ASP.NET без использования хранилища сертификатов? - PullRequest
7 голосов
/ 20 января 2010

Я пытаюсь использовать сертификат X509 в веб-службе ASP.NET в Rackspace Cloud.У меня такое чувство, что хранилища сертификатов на облачных узлах могут вызывать проблемы.У меня также есть вопрос, связанный с этим, за исключением того, что я получаю в SslStream.AuthenticateAsClient Исключение при использовании провайдера push-уведомлений Apple iPhone (apns-sharp) C #

Внутри apns-sharpВ проекте я использовал следующий код:

certificate = new X509Certificate2(p12File)

Однако я получил исключение, и изменение кода на следующий разрешило исключение X509Certificate2.Новый код выглядит следующим образом:

certificate = new X509Certificate2(p12File, String.Empty, X509KeyStorageFlags.MachineKeySet);

Я хотел бы знать, могу ли я использовать X509Certificate2 в ASP.NET без использования хранилища сертификатов?Могут ли хранилища сертификатов вызывать проблемы с узлами Rackspace Cloud?

Обновление № 1 Rackspace сообщает, что доступ к хранилищу сертификатов локального компьютера запрещен.Есть ли другой способ обойти использование хранилища сертификатов?Может быть, с помощью сторонней библиотеки?

Ответы [ 2 ]

4 голосов
/ 20 января 2010

Причина, по которой первый конструктор не работает, заключается в том, что ASP.NET не загружает хранилище профилей пользователей, которое является хранилищем по умолчанию, если вы не указали место хранения с помощью X509KeyStorageFlags. Однако хранилище компьютеров всегда загружается ASP.NET, поэтому работает второй конструктор.

Я предполагаю, что вы намерены использовать закрытый ключ в сертификате для шифрования или создания цифровых подписей (хеширования), и в этом случае вы не можете избежать использования хранилища сертификатов, поскольку к закрытым ключам можно получить программный доступ только из импортированного сертификаты, а не напрямую из BLOB-объектов или файлов.

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

Я не могу комментировать ситуацию в Rackspace - могут быть проблемы с импортом сертификатов в код, работающий в среде с частичным доверием, так как загрузка контейнера закрытого ключа требует определенных разрешений, которые могут не предоставляться вашей сборке.

1 голос
/ 23 февраля 2010

Я импортировал X509Certificate2 из файла, и закрытый ключ и открытый ключ были доступны с использованием этого кода:

            X509Certificate2 cert = new X509Certificate2();
            // Key Location: the physical file location (C:\cert.pfx)
            // Key Password: the password for the certificate
            cert.Import(keyLocation, keyPassword, X509KeyStorageFlags.Exportable);

По моему опыту, ключом к его работе был X509KeyStorageFlags.Exportable.Без этого я не смог бы получить доступ к закрытому ключу.

...