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 証明書) の証明書チェーン全体を含むエイリアスが 1 つしかないため、証明書が作成されない理由がわかりません。要求されたときに送信されます。証明書情報を送信しない理由についての助けをいただければ幸いです。
編集:また、誰かがパスの署名に使用される .p12 から、または単に iOS 開発ポータルからダウンロードした通帳証明書から SSL 証明書を取得する方法を投稿した場合、それは機能することが知られています。そこから逆戻りして、私が間違っていることを理解します。