ICerfiticatePolicy и ServicePoint - PullRequest
       13

ICerfiticatePolicy и ServicePoint

0 голосов
/ 21 января 2010

Так что я использую PayPal API. Им требуется, чтобы крупные компании отправляли сертификат X509 вместе с каждым запросом SOAP API. Я никогда не слышал об использовании сертификата, он всегда отправлял подпись API вместе с запросом API.

Итак, я сначала создал класс с именем Cerficate, который реализует .NET ICerfiticatePolicy. Один из методов-членов, действительно единственный, который вам нужно реализовать:

System.Net.ICertificatePolicy.CheckValidationResult(System.Net.ServicePoint, System.Security.Cryptography.X509Certificates.X509Certificate, System.Net.WebRequest, int)

Пока у меня проблемы с пониманием того, что перейти к этому методу. Я предполагаю, что метод просто подтверждает, что Сертификат действителен. Поэтому я не уверен, что такое ServicePoint и что в него передать. Я предположил, что это была моя ссылка на веб-сервис и прокси-класс внутри, такой как PayPalAPIAAInterfaceClient

Я также вижу очень старый пример, использующий ServicePointManager.S для чего-то, но я не понимаю этого, даже после просмотра MSDN. Так что я думаю, что вы должны использовать ServicePointManager.ServerCertificateValidationCallback, и я полагаю, установить обратный вызов для CheckValidationResult? Если да, то когда ты это делаешь? Это меня очень смущает.

Кроме того, я предполагаю, что я создаю экземпляр своего класса Certificate и устанавливаю свойства сертификата, считывая сертификат P12 с моего диска, а затем передаю его этому методу, чтобы проверить, действителен ли он? Я думаю, это правильно.

Я все еще пытаюсь выяснить все это, и я действительно застрял в ServicePoint, а также в WebRequest, потому что в действительности я использую прокси-класс в PayPal, который выполняет скрытую отправку запроса. Так что я не вижу, как я могу даже передать тип WebRequest, потому что я все равно использую метод прокси для этого. Так что бы я даже принял за параметр WebRequest? Я использую SOAP API WSDL, а не NVP, поэтому я, например, не создаю переменную HttpWebRequest, как вы делаете со службами REST, чтобы отправить запрос API через Http.

пока вот что я пробовал:

    PayPalAPIAAInterfaceClient client = new PayPalAPIAAInterfaceClient();
    Certificate x509Certificate = new Certificate();
    ServicePointManager.ServerCertificateValidationCallback = x509Certificate.CheckValidationResult();
    client.ClientCredentials.ClientCertificate.Certificate = x509Certificate;

проблема в том, что мне передать для ServicePiont и остальные параметры для CheckValidationResult ?? Я даже не знаю, правильно ли я это называю.

1 Ответ

2 голосов
/ 25 января 2010

Это, безусловно, небезызвестный и на самом деле довольно распространенный способ защиты служб SOAP с помощью сертификатов X.509 с использованием спецификации WS-Security - фактически мы делаем это для всех наших внутренних и внешних веб-служб. Все каркасы веб-сервисов, включая WCF, специально разработаны, чтобы сделать это как можно проще.

Вам никогда не придется использовать ServicePointManager или ICertificatePolicy со службой SOAP, использующей WS-Security. Если в API PayPal нет чего-то действительно странного, я думаю, вы ошибаетесь. Все, что вам нужно сделать в WCF, это:

var client = new PayPalAPIInterfaceClient();
X509Certificate2 certificate = (...);
client.ClientCredentials.ClientCertificate.Certificate = certificate;
client.AddressVerify(...);  // or whatever method you want to call

Вам даже не нужно писать этот код; если у вас установлен сертификат в хранилище сертификатов на сервере, вы просто редактируете элементы привязки и поведения в app.config - или используете редактор конфигурации службы WCF, что намного проще.

Конечно, для этого вам необходимо иметь сертификат X.509, и PayPal должен знать об этом. Вы не можете просто написать new X509Certificate2(). Вам нужно иметь где-нибудь файл .pfx или .p12 или, как уже упоминалось выше, физически установить сертификат (это самый простой и самый безопасный способ, поскольку вы не жестко программируете пароль). И вам нужно загрузить открытый ключ в PayPal.

Вы можете иметь возможность использовать OpenSSL для создания сертификата. Страница EWP PayPal предполагает, что они примут их, и дает инструкции о том, как их создать, хотя не совсем ясно, можно ли использовать один и тот же процесс для их SOAP API. Возможно, им требуется «настоящий» сертификат от Verisign, Thawte и т. Д. - я сначала попробую OpenSSL и посмотрю или просто спрошу их.

Здесь есть довольно полное руководство по всему процессу здесь - вы, вероятно, захотите пропустить разделы о создании сертификата, если у вас где-то не установлен Microsoft CA. Опять же, для этой части вы, вероятно, захотите попробовать использовать утилиту OpenSSL и следовать инструкциям PayPal, затем установить сертификат на свой сервер и перейти к шагу 7 этого руководства.

...