繁体   English   中英

ICerfiticatePolicy和ServicePoint

[英]ICerfiticatePolicy and ServicePoint

所以我正在使用PayPal API。 他们要求更大的公司与每个SOAP API请求一起发送X509证书。 我从未听说过使用证书,它一直只是随API请求一起发送API签名。

因此,我首先创建了一个名为Cerficate的类,该类实现了.NET ICerfiticatePolicy 成员方法之一,实际上唯一需要实现的是:

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

到目前为止,我很难真正理解该方法要传递的内容。 我猜该方法只是证明Cerfiticate有效。 因此,我不确定ServicePoint是什么以及传递给它的内容。 我以为这是我的Web服务引用以及其中的代理类,例如PayPalAPIAAInterfaceClient

我也看到了一个使用ServicePointManager.S的非常老的示例,但即使看了MSDN,我也不理解。 所以我猜您将使用ServicePointManager.ServerCertificateValidationCallback,并且我想将回调设置为CheckValidationResult吗? 如果是这样,您什么时候这样做? 这让我很困惑。

另外,所以我想我创建了Certificate类的实例,并通过从磁盘读取P12证书来设置证书属性,然后将其传递给此方法以检查其是否有效? 我想是对的。

我仍在尝试弄清楚这件事,我真的在ServicePoint和WebRequest上都卡住了,因为实际上我在PayPal中使用了代理类,它在后台发送请求。 因此,我什至看不到如何传递WebRequest类型,因为无论如何我都在使用代理方法。 那么我什至会通过WebRequest参数呢? 我使用的是SOAP API WSDL,而不是NVP,因此,例如,我不会像创建REST服务那样创建HttpWebRequest变量,以便通过Http发送API请求。

到目前为止,这是我尝试过的方法:

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

问题是,我应该为ServicePiont和CheckValidationResult的其余参数传递什么? 我什至不知道我是否打这个电话。

使用WS-Security规范使用X.509证书保护SOAP服务当然不是闻所未闻,并且实际上是相当普遍的-实际上,我们对所有内部和外部Web服务都执行此操作。 包括WCF在内的所有Web服务框架都经过专门设计,以使其尽可能地容易。

您永远不必将ServicePointManagerICertificatePolicy与使用WS-Security的SOAP服务一起使用。 除非贝宝(PayPal)的API确实存在真正的怪异,否则我认为您的做法是错误的。 您在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创建证书。 PayPal的EWP页面建议他们接受这些内容,并提供有关如何创建它们的说明,尽管尚不清楚是否可以将相同的过程用于其SOAP API。 可能是他们需要Verisign,Thawte等提供的“真实”证书。-我会先尝试OpenSSL并查看,或者问他们。

有一个非常全面的指导,整个过程在这里 -你可能会想跳过生成证书的部分,除非你有一个微软CA地方。 再次,对于那一部分,您可能想要尝试改用OpenSSL实用程序并按照PayPal的说明进行操作,然后将证书安装在服务器上,并跳至该指南的第7步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM