Декодировать ASP Request.ClientCertificate («Сертификат») из библиотеки .NET COM - PullRequest
2 голосов
/ 12 июля 2011

В попытке уточнить мой вопрос это третье переписывание.Вот сценарий в двух словах.

  1. Устаревший веб-сайт ASP / VBscript
  2. .NET / C # COM библиотека, которая используется на сайте ASP
  3. Я хочу отправить Request.ClientCertificate («Сертификат») в необработанном виде в мою библиотеку COM .NET и декодировать его, чтобы я мог проверить поля по сертификату клиента в Active Directory.

    • The Документация для Request.ClientCertificate ("Сертификат") говорит, что это строка двоичных данных, которая представляет сертификат в формате ASN.1.Мой метод .NET, который получает это, имеет строковый тип для параметра.Я пытался использовать Encoding.UTF8.GetBytes , Encoding.Unicode.GetBytes и Encoding.ASCII.GetBytes , чтобы преобразовать его в байт [], который X509Certificate2 ожидает конструктор.

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

Поскольку я продолжаю играть с этим, я решил взглянуть наразмер сертификата клиента, возвращенного ASP и ASP.NET, и я обнаружил, что размер не совпадает.Мой сертификат, поступивший из ASP, составлял 647 байт и 1295 байт в ASP.NET.Я не знаю, почему размер искажается между обеими средами.Следовательно, у меня нет проблем с декодированием сертификата клиента, возвращенного ASP.NET, с использованием класса X509Certicate2.

Я также пытался использовать следующую вызванную функцию p /:

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint CertCreateCertificateContext(uint dwCertEncodingType, 
  byte[] pbCertEncoded, uint cbCertEncoded);

Так что в любом случае использования X509Certificate, X509Certificate2 и функции, приведенной выше, я получаю согласованный результат, полученный от сертификатаASP не может использоваться этими функциями.Класс X509Certificate просто выдает исключение, когда я пытаюсь создать его с помощью байта [], представляющего сертификат.

Я пытался использовать библиотеку CAPICOM для импорта сертификата, но я получаю точно такое же исключение, что X509Certificate2класс дает мне.

Не удается найти запрошенный объект

Итак, в общем, я хочу декодировать ASP Request.ClientCertificate ("Certificate") из a.Библиотека NET / C # COM, использующая набор классов X509Certificate.

Ответы [ 3 ]

1 голос
/ 14 июля 2011

Я подозреваю, что проблема связана с маршалингом данных сертификата, когда они передаются через созданный вами интерфейс COM.Обратите внимание, что размер сертификата ASP (647) почти точно равен половине размера сертификата .NET (1295).Возможно, вы случайно конвертируете массив из 8-битных байтов на стороне ASP в 16-битную строку Unicode?Это поможет увидеть определение интерфейса COM-сервера, который вы создали для декодирования сертификата.

1 голос
/ 15 июля 2011

Я наконец понял проблему, и это очень просто.Мне нужно было на основе 64 кодировать Request.ClientCertificate («Сертификат»), используя класс CAPICOM Utilities на стороне ASP.Как только я это сделал, я вызвал мой метод .NET COM с преобразованием ASCII в byte [], и класс X509Certificate2 без проблем расшифровал сертификат.

0 голосов
/ 14 июля 2011

Глядя на эту страницу кажется, что можно взять сертификат и поместить его в кодированный Base64 X509.Если вы передадите эту строку стороне .NET, вы можете создать из нее байтовый массив, а затем использовать X509Certificate2 конструктор для создания экземпляра сертификата.

Возможно, вы будетелучше использовать свойства класса сертификата в ASP, чтобы извлечь нужную информацию и затем передать ее.

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