GADGET FACTORY 雑記帳

iPhone アプリ / Flash コンテンツ /Adobe AIR などを開発していて気づいたことや備忘録、TIPS、HACKなど

Androidアプリ用keystoreファイルをAdobe AIR アプリで利用する方法の調査 [とりあえず解決?]

Androidアプリ用のkeystoreファイルを、Adobe AIRアプリで利用する方法について、昨日懸案となっていたことの続報です。

結論としては、昨日紹介した方法で問題はありませんでした。

最終的には、もらった keystore ファイルの問題ではないか? ということになりました。

以下、その結論を出すまでの過程となります。

keystoreファイルのの中身を確認する

原因がわからないので、まずは受け取っていたkeystoreファイルの中身がどのようなものかについて、確認することにしました。

ターミナルを起動した後、

keytool -v -list -keystore [keystoreファイル]

と入力し、要求されるkeystoreファイルのパスワードを入力することで、keystore内の情報を確認してみました。

例えば、keystoreファイルが「hoge.keystore」という名前の場合は、

keytool -v -list -keystore hoge.keystore

と入力すれば中身の情報が表示されます。

ただ、Androidアプリをストアに上げる際に実際に利用する keystore ファイルの内容を知らないので、データが正しいのかどうかは判断ができませんでした。
データの中身の表示自体は問題なく行われることから、keystoreファイル自体が壊れているということはありませんでした。

変換した後のp12ファイルの中身を確認する

もらっている keystore ファイルの中身と、こちらで出力したp12ファイルの中身に、データの相違がないかを確認することにしました。

ところが、p12ファイルは、そのままでは中身を確認する術がありません。
そこで、p12ファイルから PEMファイルに変換して、PEMファイルの中身を確認することにしました。

ターミナルから

openssl pkcs12 -in [p12ファイル名] -out [PEMファイル名]

と入力すると、

Enter Import Password:

と表示され、まずはp12ファイルで使われているパスワードの入力を求められます
パスワードを入力したところ、

MAC verified OK

の表示の後、エラーらしきものが表示されました。
どうやら、p12ファイルからPEMに変換する際に、エラーが発生してしまったようです。

PEMへ変換するコマンドにミスがあるのか、p12ファイルを生成した際に失敗しているのか、この時点では原因が分かりませんでした。



Androidアプリ用のkeystoreファイルのサンプル作成

Androidのネイティブアプリをリリースしたことがある方にご協力いただき、通常のAndroidアプリを提出する際に作るダミーのkeystoreファイルを作成してもらって、テストしてみました。

まずは、昨日と同様に、もらったテスト用のkeystoreファイルから、p12ファイルを生成します。
コマンドは昨日と同じもので、

sudo keytool -importkeystore -srckeystore [keystoreファイル名] -srcstoretype JKS  -srcalias [取り出すalias名] -destkeystore [p12ファイル名]  -deststoretype PKCS12

と入力し、p12ファイルを生成しました。

次に、先ほど失敗した、p12ファイルからPEMファイルへのコンバートです。
コマンドを入力すると

Enter Import Password:

と表示され、p12ファイルのパスワードを入力します。

すると、今度は

MAC verified OK
Enter PEM pass phrase:

と表示され、出力するPEMファイル用のパスワードを入力するように求められました。
先ほどは、この段階でエラーが発生した場面です。

そのまま、PEMファイルが無事に生成されました。

生成されたPEMファイルの中身を確認するために、以下のコマンドを入力する。

cat [pemファイル名]

すると、中身のデータがずらずらと表示されます。

今回のテスト用のkeystore ファイルだと、ここまで無事に進行することができました。

テスト用keystoreで制作したp12ファイルを Adobe AIRへ組み込んでみる

ここまで進むということは、途中段階で特に問題がないということだと判断できます。
それなら、このkeystoreファイルで生成に成功しているp12ファイルを、Flash Professionalの認証ファイルとして設定し、パブリッシュすれば、Adobe AIR ファイルがAndroid端末へインストールできるはず。

早速試してみたところ、昨日とはうってかわって、何事もなくそのままパブリッシュすることができ、さらにAndroid端末へのインストールも完了しました。

ここから判断できることは、keystore から p12 ファイルへの書き出し方法については、間違ってはいないということです。
昨日テストした方法で、やり方としては問題がないということになります。

では、受け取ったkeystoreファイルと、テストで作ってもらったkeystoreファイルの違いはどこにあるのか?

keystore ファイルの中身を確認するコマンドを2つのファイルでテストしてみました。

keytool -v -list -keystore [keystoreファイル]

中身についていうと、

キーストアのタイプ:JKS
キーストアのプロバイダ:SUN
証明連鎖の長さ: 1
エントリタイプ:privateKeyEntry

などは全く同じ

所有者:
発行者:
シリアル番号:
有効期間の開始: 終了日:
証明書のフィンガープリント:
 MD5:
 SHA1:
 署名アルゴリズム名:

などに差がありました。

この中で、個人的に一番気になった点が、

署名アルゴリズム名:

の違い。

受け取った keystore ファイルでは、

署名アルゴリズム名: SHA1withRSA

となっていて、テストで作ってもらった keystore ファイルでは、

署名アルゴリズム名: SHA256withRSA

となっていました。

もしかしたら、この部分の違いによって、keystore から p12 ファイルへの変換がうまくいくか、いかないかの差があるのかもしれません。

この部分の違いの原因を調べると、ADTが利用しているJavaのバージョンの違いによるもののようです。

昔のJava(Java5?)で keystore を生成した場合は、

SHA1withRSA

が利用されるらしく、最近のJava(Java7)でkeystore を生成した場合は、

SHA256withRSA

が利用されているようです。

おそらく、こちらで使っている Java のバージョンと、先方から届いた Java のバージョンの違いが、動作不良の原因ではないかと思われます。

先方に、Java のバージョンを上げて、再度 keystoreファイルを作ってもらえば、解決するのかもしれません。

しかし、さらに何度かやりとりをして、時間がかかることを考えると、こちらで Flash Professional から利用する p12 ファイルを生成する方が早いということになり、先方から登録に必要な情報をもらって、そのまま Flash Professional で p12 ファイルを作成して、パブリッシュ用の認証ファイルにすることになりました。

時間があれば、もう少し原因を追求する事も出来たかもしれませんが、調査にこれ以上時間をかけすぎるのももったいないので、今回はこれで調査終了となりました。

個人的には、少々消化不良な感はありますが、多分これだろうという原因も何となく分かったので、まぁ、良かったのかなぁという感じです。