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

Я пытаюсь использовать X509Certificate в веб-службе ASP.NET в Rackspace Cloud. У меня есть ощущение, что сертификаты, хранящиеся в облачных узлах, могут вызывать проблемы. У меня также есть вопрос, связанный с этим, за исключением того, что я получаю в Исключение SslStream.AuthenticateAsClient при использовании iPhone Apple Push Notification Provider (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 сообщает мне, что доступ к хранилищу сертификатов локальной машины запрещен. Есть ли другой способ обойти использование хранилища сертификатов? Может быть, использовать стороннюю библиотеку?


person Luke    schedule 20.01.2010    source источник


Ответы (2)


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

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

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

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

person Sam    schedule 20.01.2010
comment
Хорошо, спасибо. Я предполагаю, что сертификат содержит закрытый ключ, поскольку он используется для службы push-уведомлений Apple iPhone. Не могли бы вы предоставить более подробную информацию о возможных проблемах с импортом сертификатов в код, работающий в среде с частичным доверием, поскольку для загрузки контейнера закрытого ключа требуются определенные разрешения, которые могут не предоставляться вашей сборке.? - person Luke; 20.01.2010
comment
Кроме того, я запускаю код на своем сервере разработчика, используя тот же модифицированный файл среднего доверия, который Rackspace использует в нижней части cloudsites.rackspacecloud.com/index.php/ Я не получаю никаких исключений на моем dev. сервер. - person Luke; 20.01.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. Без этого я не мог получить доступ к закрытому ключу.

person MarkMcDowell_LL    schedule 23.02.2010