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

时间:2015-07-23 09:15:09

标签: web-services wcf wsdl x509 x509certificate2

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

Apple的文档说明第一步是生成CSR(证书签名请求),将其发送给Apple,他们将返回证书以确保未来的连接。

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

上面和之前的Find My iPhone webservice实现给我带来了相对大的麻烦,我希望这能帮助其他用户。

(N.B。我想添加apple-gsx标签,但我没有所需的声誉)

1 个答案:

答案 0 :(得分:3)

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

  1. 确保已安装OpenSSL并正常工作
  2. 生成密钥对:
    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'在Admin命令提示符下运行命令set OPENSSL_CONF=c:\[PATH TO YOUR OPENSSL DIRECTORY]\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. 将证书和密钥合并到一个.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. 如果他们添加了有价值的信息,请随时回答问题。
  13. (N.B。抱歉,无法说服解析器正确格式化,欢迎任何帮助..)