[Java] iPack -The iOS Application Packager

原文はこちら。
https://blogs.oracle.com/jfxprg/entry/ipack_the_ios_application_packager

iOSアプリケーションは、 .ipaというアーカイブファイルで配布されています。これらのファイルは通常のzipファイルで、この中にアプリケーションリソースは実行ファイルが含まれています。不正な変更から守り、ipaファイルのソースの識別を可能とするために、アーカイブの内容が署名されています。署名は.ipaアーカイブのアプリケーションの実行可能ファイルに含まれており、実行ファイルそのものと関連するリソースファイルを保護しています。AppleはiOSの実行ファイルに署名するためのネイティブのMac OSツールを提供しています(実際には、一般的なMach-Oコード署名ツールです)が、これらのツールは、一般的には他のプラットフォームで利用できません。JavaFXのベースのiOSアプリケーションのためのマルチプラットフォーム開発環境を提供するために、JavaにiOSの署名およびパッケージ機能を移植し、専用のiPackツールを作成しました。

このiPackツールを様々なOSで.ipaパッケージを作成する最後の段で使うことができます。iPadで動作するJavaFXアプリケーションのための最終配布アーカイブを作成する際にプロトタイプをテストしました。なお、開発からパッケージングまでの全てをWindows 7で実施しました。

ソースコード

iPackツールのソースコードはOpenJFXプロジェクトのリポジトリにあります。
<openjfx root>/rt/tools/ios/Maven/ipack
iPackツールをビルドするには以下のコマンドを実行します。
<openjfx root>/rt/tools/ios/Maven/ipack$ mvn package
ビルドが完了したら、ツールを実行できます。
java -jar <path to ipack.jar> <arguments>

キーストアの署名


ツールはjavaキーストアを使って署名する証明書と関連する秘密鍵を読み取ります。このようなキーストアを準備するため、JDKからキーツールを使うことができます。

可能性のあるシナリオの一つとして、既存の秘密鍵と証明書をMac OSで使っているキーストアからインポートする、というものがあります。

既存のキーストアの内容を表示し、ソースエイリアスを識別するには…
keytool -list -keystore <src keystore>.p12 -storetype pkcs12 -storepass <src keystore password>
Javaキーストアを作成し、キーストアに署名付き秘密鍵をインポートするには…
keytool -importkeystore \
        -destkeystore <dst keystore> -deststorepass <dst keystore password> \
        -srckeystore <src keystore>.p12 -srcstorepass <src keystore password> -srcstoretype pkcs12 \
        -srcalias <src alias> -destalias <dst alias> -destkeypass <dst key password>
別のシナリオとして、秘密/公開鍵のペアを直接Javaキーストアで生成し、このキーペアから証明書リクエストを作成する、というものがあります。Appleにリクエストを送信した後、証明書のレスポンスをJavaキーストアにインポートして、証明書の署名が完了します。

両方のシナリオで、Javaキーストアに生成されるエイリアスには一つの証明書のみが含まれているはずです。以下のコマンドで確認することができます。
keytool -list -v -keystore <ipack keystore> -storepass <keystore password>
証明書チェーンの長さのエントリを見ると、その横にある数が1になっています。

実行可能ファイルがMac OSで署名されている場合には、(CMSフォーマットの)署名には、AppleのルートCAまでの証明書チェーン全体が含まれていますが、iPackツールの場合、コマンドラインで指定されたエイリアス以下に格納されているチェーンだけを含んでいます。そのため、署名にチェーン全体が入るように、対応する完全な証明書チェーンを持つエイリアスでその証明書エントリを交換する必要があります。

この対策のため、まず別のファイルにチェーンを作成する必要があります。Base64エンコードのPEMフォーマットの証明書を扱っている場合には、このようなチェーンを作成するのは簡単です。証明書チェーンをPEM証明書を連結して作成することができます。つまり、チェーンを単一ファイルに形成するというわけです。

iOSの署名のために、我々のチェーンに以下の署名が必要です。
  • Apple Root CA
  • Apple Worldwide Developer Relations CA
  • 自分たちが署名している証明書(leaf certificate)
バイナリのDERフォーマット(.der、.cer)からPEMフォーマットへ証明書を変換するには…
keytool -importcert -noprompt -keystore temp.ks -storepass temppwd -alias tempcert -file <certificate>.cer
keytool -exportcert -keystore temp.ks -storepass temppwd -alias tempcert -rfc -file <certificate>.pem
署名した証明書をPEMフォーマットとしてエクスポートするには…
keytool -exportcert -keystore <ipack keystore> -storepass <keystore password> -alias <signing alias> -rfc -file SigningCert.pem
AppleIncRootCertificate.pem、AppleWWDRCA.pem、SigningCert.pemからチェーンを作成してから、以下のコマンドを使ってキーストアにインポートし直します。
keytool -importcert -noprompt -keystore <ipack keystore> -storepass <keystore password> -alias <signing alias> -keypass <key password> -file SigningCertChain.pem
まとめると、以下の例が完全な証明書チェーン置き換えプロセスです。
keytool -importcert -noprompt -keystore temp.ks -storepass temppwd -alias tempcert1 -file AppleIncRootCertificate.cer
keytool -exportcert -keystore temp.ks -storepass temppwd -alias tempcert1 -rfc -file AppleIncRootCertificate.pem
keytool -importcert -noprompt -keystore temp.ks -storepass temppwd -alias tempcert2 -file AppleWWDRCA.cer
keytool -exportcert -keystore temp.ks -storepass temppwd -alias tempcert2 -rfc -file AppleWWDRCA.pem
keytool -exportcert -keystore ipack.ks -storepass keystorepwd -alias mycert -rfc -file SigningCert.pem
cat SigningCert.pem AppleWWDRCA.pem AppleIncRootCertificate.pem >SigningCertChain.pem
keytool -importcert -noprompt -keystore ipack.ks -storepass keystorepwd -alias mycert -keypass keypwd -file SigningCertChain.pem
keytool -list -v -keystore ipack.ks -storepass keystorepwd

使い方

iPackツールを引数無しで起動すると、以下のように利用方法を表示します。
Usage:

 ipack <archive> <signing opts> <application opts> [ <application opts> ... ]

Signing options:

 -keystore <keystore>   keystore to use for signing
 -storepass <password>  keystore password
 -alias <alias>         alias for the signing certificate chain and
                        the associated private key
 -keypass <password>    password for the private key

Application options:

 -basedir <directory>   base directory from which to derive relative paths
 -appdir <directory>    directory with the application executable and resources
 -appname <file>        name of the application executable
 -appid <id>            application identifier

Example:

 ipack MyApplication.ipa -keystore ipack.ks -storepass keystorepwd
                         -alias mycert -keypass keypwd
                         -basedir mysources/MyApplication/dist
                         -appdir Payload/MyApplication.app
                         -appname MyApplication -appid com.myorg.MyApplication

0 件のコメント:

コメントを投稿