web-services - 如何使用 WCF 连接 Apple 的 GSX NewGeneration Web 服务?

标签 web-services wcf wsdl x509 x509certificate2

从 2015 年 8 月 15 日开始,Apple 的 GSX 网络服务将升级到更安全的版本,每个请求都需要客户端 SSL 证书。我需要采取哪些步骤才能使用 WCF 框架和 C#.NET 连接到这个新一代 Web 服务?

Apple 的文档指出第一步是生成 CSR(证书签名请求),将其发送给 Apple,他们将返回证书以确保 future 连接的安全。

如何生成此 CSR?接下来我需要采取哪些步骤才能成功连接并获得有效响应?

上述和之前的“查找我的 iPhone”web 服务实现给我带来了相当大的麻烦,我希望这能帮助其他用户。

(注意,我想添加 apple-gsx 标签,但我没有所需的声誉)

最佳答案

为了成功调用网络服务,需要执行以下步骤:

  1. 确保你有 OpenSSL安装和工作
  2. 生成 key 对:
    openssl genrsa -aes256 -out [NameOfPrivateKey].pem 2048
    保留此私钥PRIVATE,不要与任何人分享!
  3. 出现提示时,选择安全密码并妥善保管。
  4. 生成证书签名请求 (CSR):
    openssl req -new -sha256 -key [NameOfPrivateKeyFromStep2].pem -out [NameOfTheSigningRequest].csr
    当上述命令因“警告:无法打开配置文件:/usr/local/ssl/openssl.cnf”而失败时,运行命令 set OPENSSL_CONF=c:\[您的 OPENSSL 目录的路径]\bin\openssl .cfg 在管理员命令提示符下)
  5. 将 .csr(证书签名请求)发送给 Apple,将 .key 保密。 Apple 返回一个 .pem 证书文件
  6. 确保 .pem 和 .key 的 MD5 匹配。以下命令的输出应该是相同的:

    openssl x509 -noout -modulus -in [CertificateReceivedFromApple].pem | openssl md5

    openssl rsa -noout -modulus -in [NameOfPrivateKeyFromStep2].pem | openssl md5

  7. 将证书和 key 合并到一个 .p12 容器中 (More info here)

    openssl pkcs12 -export -in [CertificateReceivedFromApple].pem -inkey [NameOfPrivateKeyFromStep2].pem -out [FilenameOfNewKeyContainer].p12

  8. 出现提示时,选择安全密码并妥善保管。

  9. 让 VisualStudio 生成一个代理类,基于您可以从 Apple 下载的 WSDL 文件,例如将其命名为 GsxWSEmeaAspService

  10. 使用下面的代码验证您自己的身份。 userSessionId 是进一步调用实际发送或接收数据所必需的。

    public void Authenticate() {
        using (GsxWSEmeaAspService client = new GsxWSEmeaAspService()) {
            X509Certificate2 cert = new X509Certificate2(
                [PathToContainerFromStep7].p12"),
                [YourPasswordFromStep8],
                X509KeyStorageFlags.MachineKeySet);
            client.ClientCertificates.Add(cert);
    
            GsxWSEmeaAspService.authenticateRequestType req = new GsxWSEmeaAspService.authenticateRequestType();
            req.languageCode = "EN";
            req.serviceAccountNo = [YourAppleServiceAccountNumber];
            req.userId = [YourUserID];
            req.userTimeZone = "CEST";
    
            client.Proxy = null;
    
            GsxWSEmeaAspService.authenticateResponseType res = client.Authenticate(req);
            userSessionId = res.userSessionId;
        }
    }
    
  11. 确保您没有运行任何 HTTP 代理,例如 Fiddler,因为当代理处于事件状态时,请求会失败。在 SoapUI 中运行请求也是如此:需要关闭代理设置。

  12. 请随时评论问题,如果他们提供有值(value)的信息,我会改进答案。

(注意,抱歉,无法说服解析器正确格式化,欢迎任何帮助..)

关于web-services - 如何使用 WCF 连接 Apple 的 GSX NewGeneration Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31583062/

相关文章:

带有httpurlconnection的android api 23中的Java rest api

php - 如何从 PHP 轻松使用 Web 服务

WCF 数据服务代理不想两次使用相同的命名空间

c# - WSDL 应该如何构建?

xml - Node SOAP : How to create a complex message with specific attributes?

c# - 在 C# Windows 应用程序中使用 Web 服务

wcf - Silverlight 4和WCF:Windows身份验证不断弹出

vb.net - 如何在 VB.Net 中将 'test service' 页面添加到 WCF Web 服务

.net - 自动别名生成的 SOAP 代理

java - 如何传递 BufferedInputStream 或包含 JAX-WS 中其他对象的对象?