0

所以我正在使用 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)

到目前为止,我很难真正理解传递给这个方法的内容。我猜该方法只是验证证书是否有效。所以我不确定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 的其余参数传递什么?我什至不知道我说得对不对。

4

1 回答 1

2

使用 WS-Security 规范使用 X.509 证书保护 SOAP 服务当然不是闻所未闻,而且实际上相当普遍——事实上,我们对所有内部和外部 Web 服务都这样做。包括 WCF 在内的所有 Web 服务框架都经过专门设计,以使其尽可能简单。

您永远不必使用 WS-Security 的ServicePointManagerICertificatePolicy与 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 并看看,或者只是问他们。

这里有一个关于整个过程的非常全面的指南——你可能想跳过关于生成证书的部分,除非你在某个地方有 Microsoft CA。同样,对于这一部分,您可能希望尝试使用 OpenSSL 实用程序并按照 PayPal 的说明进行操作,然后在您的服务器上安装证书并跳到该指南的第 7 步。

于 2010-01-25T18:17:10.253 回答