我正在尝试在 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 证书的方法,这是已知的工作,那么我可能能够工作从那倒过来找出我做错了什么。