c# - ICerfiticatePolicy 和 ServicePoint

标签 c# web-services wsdl paypal x509certificate

所以我正在使用 PayPal API。他们要求大公司随每个 SOAP API 请求一起发送 X509Certificate。我从未听说过使用证书,它一直只是将 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?如果是这样,你什么时候这样做?这让我很困惑。

另外,我想我创建了一个证书类的实例,并通过从我的磁盘读取 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 的绑定(bind)和行为元素 - 或者使用 WCF 服务配置编辑器,这会容易得多。

当然,要做到这一点,您必须拥有 X.509 证书,而且 PayPal 必须知道它。您不能只编写 new X509Certificate2()。您需要在某处有一个 .pfx.p12 文件,或者如上所述,物理安装证书(这是最简单的方法,也是最安全的,因为您不对密码进行硬编码)。并且您需要将公钥上传到 PayPal。

可能能够使用 OpenSSL 创建证书。 Paypal 的EWP page建议他们接受这些并提供有关如何创建它们的说明,尽管尚不完全清楚是否可以将相同的过程用于他们的 SOAP API。可能是他们需要来自 Verisign、Thawte 等的“真实”证书。我会先尝试 OpenSSL 看看,或者问问他们。

整个过程有一个相当全面的指南here - 除非您在某处拥有 Microsoft CA,否则您可能希望跳过有关生成证书的部分。同样,对于该部分,您可能想尝试使用 OpenSSL 实用程序并按照 PayPal 的说明进行操作,然后在您的服务器上安装证书并跳至该指南的第 7 步。

关于c# - ICerfiticatePolicy 和 ServicePoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106328/

相关文章:

c# - WebReference 生成的命名空间

java - 本地 WSDL 的 FileNotFoundException

c# - XmlReader.GetAttribute() 不会抛出异常

c# - 显示名称属性与显示属性

c# - 如何使用 c# 驱动程序删除 mongodb 文档中的嵌套数组元素

c# - 将不同的选项传递给方法

java - CXF 拦截器不工作

java - JAXM SOAP 消息解析

soap - 在wsdl文件中是否可以要求参数的最小和最大字符串长度?

c# - Java 序列化与 .NET 序列化