0

我正在尝试在 Grails 中编写一个服务来发送推送通知以更新存折通行证。我已经到了可以测试连接到 APN 服务器的代码是否正常工作的地步,但是,我似乎无法使用 Java SSLSocket 方法建立连接。

连接的第一部分有效,我从服务器接收证书并在证书链中找到受信任的证书;但是,在那之后,由于某种原因,我的客户端证书/证书链从未发送到服务器,因此连接失败。

我似乎无法弄清楚为什么没有发送证书,我使用以下代码来设置密钥库:

void setupSSLPropertiesForConnection() {
    System.setProperty("javax.net.ssl.keyStore", "superSecretFile.p12")
    System.setProperty("javax.net.ssl.keyStorePassword", "superSecretPassword")
    System.setProperty("javax.net.ssl.keyStoreType", "PKCS12")

    System.setProperty("javax.net.ssl.trustStore", "trustStoreFile")
    System.setProperty("javax.net.ssl.trustStorePassword", "trustStorePassword")
    System.setProperty("javax.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol")
}

然后尝试连接到 APN 服务器:

setupSSLPropertiesForConnection()
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault()
SSLSocket socket = (SSLSocket)factory.createSocket("gateway.push.apple.com", 2195)

我使用 Java 的 keytool 查看了 PKCS12 文件,只有一个别名,其中包含我的存折证书(证书、WWDR、Apple 证书)的整个证书链,所以我不知道为什么证书不是请求时发送。任何关于它为什么不发送证书信息的帮助将不胜感激!

编辑:另外,如果有人要发布一种从用于签署通行证的 .p12 或仅从从 iOS 开发门户下载的存折证书获取 SSL 证书的方法,这是已知的工作,那么我可能能够工作从那倒过来找出我做错了什么。

4

1 回答 1

0

现在我觉得很傻,显然我的客户端 PKCS12 文件和信任库文件的文件名都是错误的,但是在使用 System.setProperty 设置密钥库和信任库时,如果找不到或打开文件,它不会抛出任何错误.

我尝试更改我的代码,以便从使用 TrustManagerFactory 和 KeyManagerFactory 创建的 SSLContext 创建 SSLSocketFactory,当我尝试它时,它抛出了 FileNotFoundError。现在它似乎至少工作了。叹。

于 2013-04-10T22:12:30.753 回答