пятница, ноября 24, 2006

X509Certificate2 и другие полезные вещи

Недавно в одном форуме проскакивал такой вопрос: "необходимо криптовать данные открытым ключем из сертификата юзера подключенного по SSL...".
По своему опыту работы с Framework 1.0 я считал, что это невозможно. Оказалось, что это не так. Здесь даже есть пример кода, как получить и использовать public key несимметричного алгоритма, который хранится в сертификате. Там несколько страниц жуткого кода.
Так вот, спешу вас обрадовать. В Framework 2.0 все стало гораздо лучше. Теперь задача шифрования открытым ключем из сертификата решается так:

// во первых SSL сертификат можно теперь получить вот так
X509Certificate2 cer = new X509Certificate2(request.ServicePoint.Certificate);
String str = "secret";
// ну а следующая строчка заменяет целые страницы зубодробительного кода
RSACryptoServiceProvider alg = (RSACryptoServiceProvider)cer.PublicKey.Key;
byte[] crypted = alg.Encrypt(Encoding.UTF8.GetBytes(str), false);

Кроме этого, появилась возможность работать с хранилищем сертификатов Windows через класс X509Store.
А вот обработка ошибок, связанных с сертификатами, как была неудобной, так и осталась. Интерфейс ICertificatePolicy объявили устаревшим, а вместо него там же ввели новый делегат ServicePointManager.ServerCertificateValidationCallback тоже статический.
Зато порадовал класс X509Certificate2UI. Его метод DisplayCertificate() отображает стандартное окно свойств сертификата!

Комментариев нет: