iOS7.1から企業内アプリ配布にSSLが必須となったので自己証明書でなんとかしてみた
突然社内へのiOSアプリ配信が動かなくなったと連絡を受けた。
原因はこれ。
iOS7.1からplistファイルの配布にhttpsが必須になっていた。
しかし社内向けのしかもテスト用の配信システムににわざわざ予算を掛けてまでSSL証明書など買っていられないので自己証明書でなんとかならないかやってみた。
IISで作る自己証明書はiOSと互換性がない
配信サーバーがIISであることから、まずIISの自己証明書作成機能をつかってみた。opensslコマンドでpfx->pem->cerなど形式を変換しつつiOSに自己証明書をインストールしてみた。しかし相変わらずアプリの配信ができない。よくよく調べてみるとIISで作る自己証明書はiOSと互換性がないので使えないとのことだった。
MacのopensslでCAから作ってみる
結局ネットでみつけたここのTip #5、自己CAから自己証明書を発行して~の手順でうまくいった。
Macのopensslコマンドで各種証明書を生成。それらをIISやiOSデバイスに取り込んだ。
手順
1.自己CAのための秘密鍵を生成
openssl genrsa -out myserverCA.key 2048
2.自己CA証明書の生成(有効期限730日)
openssl req -x509 -new -key myserverCA.key -out myserverCA.cer -days 730 -subj /CN="Myserver Custom CA"
できあがるmyserverCA.cerが自己CA証明書になる。
3.自己証明書のための秘密鍵を生成
openssl genrsa -out myservercert1.key 2048
4.自己証明書を生成するためのリクエストを生成
openssl req -new -out myservercert1.req -key myservercert1.key -subj /CN=myserver.example.com
元々http://myserver.example.com/iOShogehoge...というURLだったのでCNはmyserver.example.comとなる。
5.自己証明書を生成するためのリクエストを承認して自己証明書を生成(有効期限365日)
openssl x509 -req -in myservercert1.req -out myservercert1.cer -CAkey myserverCA.key -CA myserverCA.cer -days 365 -CAcreateserial -CAserial serial
生成されたmyservercert1.cerが自己証明書になる。
6.IISで読み込むためにcer形式をpfx形式に変換
openssl pkcs12 -export -out myserver.selfsigned.pfx -inkey myservercert1.key -in myservercert1.cer
7.myserverCA.cerとmyserver.selfsigned.pfxをIISのサーバーにコピー
8.myserverCA.cerをダブルクリックで証明書ストアにインポート
9.IIS管理コンソールのツリーからサーバー名を選択してサーバー証明書ビューからmyserver.selfsigned.pfxをインポート
インポートした証明書は名前欄が空白になってしまった。生成時のオプション不足?
10.IIS管理コンソールのツリーからWebサイトを選択してバインドメニューからhttpsを追加
この時先程インポートした証明書を使うようにする。
11.iPhone構成ユーティリティでmyserverCA.cerを含んだ構成プロファイルを生成し署名ありでエクスポート
ファイル名はmyserver-ssl.mobileconfigにした。
12.エクスポートしたmyserver-ssl.mobileconfigをIISにコピーしてhttpでアクセスできるようにハイパーリンクなどを追加する
13.IISのMIMEタイプに拡張子".mobileconfig"、種類"application/x-apple-aspen-config"を追加
14.plistファイルへのリンクのhttpをhttpsに変更する
15.デバイスのSafariからmyserver-ssl.mobileconfigへのリンクを開いてデバイスに自己CA証明書をインストール
この時証明されていない旨の表示がされるがインストールはできる。
これでiOS7.1でも警告無くアプリがインストール出来るようになった。
しかしこの方法にはデメリットがあって問題の無かったiOS7.0.x以前でも自己証明書のインストールが必要になってしまった。javascriptでごにょごにょすれば回避できるのだろうが面倒くさいのそこまではしなかった。