私が実行している場合のJava 6からアップルは、Java 6のJava 7/8
のJava 8にAPNSを経由してAppleデバイスにプッシュ通知を送信するアプリケーションをアップグレードするプロセスにいるよへのアップグレード後に動作していないプッシュし同じPKCS12証明書ファイルを使用してJava 8上でJava 6で動作する同じJARです。プッシュを送信しようとすると、状態コード8(無効なトークン)が返されます。
この原因は何ですか?
私が実行している場合のJava 6からアップルは、Java 6のJava 7/8
のJava 8にAPNSを経由してAppleデバイスにプッシュ通知を送信するアプリケーションをアップグレードするプロセスにいるよへのアップグレード後に動作していないプッシュし同じPKCS12証明書ファイルを使用してJava 8上でJava 6で動作する同じJARです。プッシュを送信しようとすると、状態コード8(無効なトークン)が返されます。
この原因は何ですか?
この問題は、PKCS12ファイルの内容の組み合わせとJava 6と7質問にpkcs12ファイルにopenssl pkcs12 -in filename
を実行
間KeyStore
オブジェクトにJavaがPKCS12ファイルを読み込む方法の変化によって引き起こされます以下が得られます。
Enter Import Password:
MAC verified OK
Bag Attributes
friendlyName: Apple Development IOS Push Services: app.id.1
localKeyID: .... snip ....
subject=/UID=app.id.1/CN=Apple Development IOS Push Services: app.id.1/OU=PRXXXXXXXX/C=US
issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
-----BEGIN CERTIFICATE-----
... snip ...
-----END CERTIFICATE-----
Bag Attributes
friendlyName: Apple Development IOS Push Services: app.id.2
localKeyID: .... snip ....
subject=/UID=app.id.2/CN=Apple Development IOS Push Services: app.id.2/OU=PRXXXXXXXX/C=US
issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
-----BEGIN CERTIFICATE-----
... snip ...
-----END CERTIFICATE-----
Bag Attributes
friendlyName: User Name
localKeyID: ... snip ...
Key Attributes: <No Attributes>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
... snip ...
-----END ENCRYPTED PRIVATE KEY-----
Bag Attributes
friendlyName: User Name
localKeyID: ... snip ...
Key Attributes: <No Attributes>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
... snip ...
-----END ENCRYPTED PRIVATE KEY-----
あなたがPKCS12ファイルには、異なるアプリケーションIDのために2つの証明書と秘密鍵2(実際には同じキーの2つのコピー)、それぞれが含まれていることをここで見ることができます。リストされている最初のものは意図したApp IDですが、2番目は使用している別のアプリケーションのものです。
このファイルはKeyStore
に読み込まれ、続いてAppleに接続するためにSSLSocket
に渡されます。だから、
keystore classname: java.security.KeyStore
*** entry name: User Name
entry as string: Private key entry and certificate chain with 1 elements:
[
[
Version: V3
Subject: C=US, OU=PRXXXXXXXX, CN=Apple Development IOS Push Services: app.id.2, UID=app.id.2
:
はkeystore classname: java.security.KeyStore
*** entry name: User Name
entry as string: Private key entry and certificate chain with 1 elements:
[
[
Version: V3
Subject: C=US, OU=PRXXXXXXXX, CN=Apple Development IOS Push Services: app.id.1, UID=app.id.1
....
は、Java 7または8の下で、我々はこれを取得:
は、Java 6の下では、上記実行すると、以下の私たちを与えるString password = "my_password";
KeyStore.ProtectionParameter pwParam = new KeyStore.PasswordProtection(password.toCharArray());
KeyStore keystore = KeyStore.getInstance("PKCS12");
System.out.println("keystore classname: " + keystore.getClass().getName());
FileInputStream fileStream = new FileInputStream("certificate_file.p12");
keystore.load(fileStream, password.toCharArray());
for (Enumeration<String> e = keystore.aliases(); e.hasMoreElements();) {
String alias = e.nextElement();
System.out.println("*** entry name: " + alias);
KeyStore.Entry entry = keystore.getEntry(alias, pwParam);
System.out.println("entry as string: " + entry.toString());
for (Certificate cert: keystore.getCertificateChain(alias)) {
System.out.println("*** cert: " + cert);
}
}
:これは以下のように行われます両方の証明書が同じ秘密鍵を参照するため、一方が他方の証明書を上書きするため、KeyStore
には2つの証明書のうち1つだけが含まれます。 Java 6では、最初の証明書は保持されますが、Java 7および8は2番目の証明書を保持します。そのため、Appleに接続すると間違った証明書が送信され、送信されるプッシュトークンのApp IDが接続に使用された証明書のApp IDと一致しないため、送信されたプッシュは無効とみなされます。
これを修正するには、PKCS12ファイルを意図したApp IDのみで生成する必要があります。これにより、適切な証明書が読み取られ、その後Appleに接続するために使用されます。