AdHoc版iOSアプリをMacをサーバにしてインストールする

## 概要

とある案件でWi-Fi経由でipaをインストールしたい状況が発生したのでそれについて調べました。
Web上に置かれたAdHoc版iOSアプリのインストールにはSSLに対応したサーバが必要とのこと。

そこで、オレオレ証明書を作り、iPhone/iPadでインストールできるまでの手順をまとめたいと思います。

なお、今回の記事は以下の記事を参考にさせていただきました。

- [iOSアプリのAdhoc配信用Webサイトの作成手順（自己署名SSL証明書＆Mac）](https://qiita.com/HIkaruSato/items/851ba853892916fabe26)
- [iOSアプリOTAインストール用サーバ構築トラブルシュート](https://qiita.com/noby111/items/bb654d2fd889b0e73b06)


## オレオレ証明書の作成

### フロー

今回の例は、自分のMacbookをサーバにしてそこからインストールする方法です。

- 自身のIPアドレスを確認しておく（`ifconfig`など）
- 以下のファイルを生成する（作業用に適当なフォルダを作成してその中で作業するといいです）
- サーバ秘密鍵用の乱数ファイルを作成する

```cosole
$ openssl dgst -md5 /var/log/system.log > rand.dat
```
- サーバ秘密鍵を作成。 **passwordはあとで削除するので適当でOK**

```console
$ openssl genrsa -des3 -rand rand.dat 1024 > server_key.pem
```

- サーバ秘密鍵のパスワードを削除。 **Apache再起動のたびにpasswordが求められるため**

```console
$ openssl rsa -in server_key.pem -out server_key.pem
```

- 証明書署名要求(CSR)ファイルを作成

```console
$ openssl req -new -key server_key.pem -out server_csr.pem
```

```console:【入力例】
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:TOKYO
Locality Name (eg, city) []:TOKYO
Organization Name (eg, company) [Internet Widgits Pty Ltd]:adhocapp
Organizational Unit Name (eg, section) []:system
Common Name (e.g. server FQDN or YOUR name) []:[自分のPCのIPアドレス]
Email Address []:[自分のPCのIPアドレス] 
A challenge password []:(入力なしでリターン)
An optional company name []:(入力なしでリターン)
```

- 自己署名証明書を作成

```console
$ openssl req -days 3650 -in server_csr.pem -key server_key.pem -x509 -out crt.pem
```

- Apacheのフォルダにコピー

```console
$ sudo cp server_key.pem /private/etc/apache2/server.key
$ sudo cp crt.pem /private/etc/apache2/server.crt
```

- `/private/etc/apache2/httpd.conf`の編集。ApacheでSSL通信を使えるようにする


※ `/private/etc/apache2/httpd.conf`を別のフォルダにコピーして編集。編集後、元の場所にペースト。（セキュリティシステムが効いてて直接編集はできないため）

```httpd.confの変更箇所
#LoadModule ssl_module libexec/apache2/mod_ssl.so
↓
LoadModule ssl_module /usr/libexec/apache2/mod_ssl.so

#LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
↓
LoadModule socache_shmcb_module /usr/libexec/apache2/mod_socache_shmcb.so
#El Capitanだとlibexec/apache2/xxxx.so は無くて(libexecフォルダがない)、すべて/usr/libexec/apache2フォルダ以下にある。
#libexec/apache2→/usr/libexec/apache2に全て置換でも良さそう。

# Secure (SSL/TLS) connections
#Include /private/etc/apache2/extra/httpd-ssl.conf
↓
Include /private/etc/apache2/extra/httpd-ssl.conf
```

- `/private/etc/apache2/extra/httpd-ssl.conf`を編集（`httpd.conf`と同じように別フォルダで編集してもとの場所にペースト）。SSLサーバー証明書/秘密鍵の場所を指定。

```httpd-ssl.confの変更箇所
#SSLCertificateFile "/private/etc/apache2/server.crt"
↓
SSLCertificateFile "/private/etc/apache2/server.crt"

#SSLCertificateKeyFile "/private/etc/apache2/server.key"
↓
SSLCertificateKeyFile "/private/etc/apache2/server.key"

ServerName [自分のPCのIPアドレス]:443
ServerAdmin hoge@[自分のPCのIPアドレス]
```

- MIME設定を更新する

デフォルトのままだと`ipa`と`plist`のMIMEタイプがないのでそれを追記します。

`/private/etc/apache2/mime.types`ファイルに以下を追記します。

|拡張子|MIMEの種類|
|-----|---------|
|.ipa|application/octet-stream|
|.plist|text/xml|


- Apacheを再起動

```console
$ sudo apachectl restart
```

- ブラウザで、https://[自分のPCのIPアドレス]にアクセスして以下のような画面になったらOK

![https.png](https://qiita-image-store.s3.amazonaws.com/0/5616/f2cc55bd-be5d-32ec-e9c8-4fdd9d952f66.png)
→「このWebサイトを閲覧」をクリックすると「It's Work!」が（デフォルトのままだと）表示されます。


## 自己署名SSL証明書をインストールする

[最初に参考にさせていただいた記事](https://qiita.com/HIkaruSato/items/851ba853892916fabe26)では自己署名SSL証明書を、プロビジョニングプロファイルにしてインストールする手順が書かれていました。
が、**iPhone構成ユーティリティ**アプリが現状使えないようなので別の方法でインストールする必要があります。

それには[もうひとつの記事](https://qiita.com/noby111/items/bb654d2fd889b0e73b06)を参考に解決しました。

前段で作成したサーバに配置した証明書（`crt.pem`）を、いったんキーチェーンにインストールします。（ファイルダブルクリックするだけでOK）
すると、作成の際に指定したIPアドレスの名前でキーチェーンのリストに表示されます。

それを右クリックなどから「書き出す」を選択します。
![書き出す](https://qiita-image-store.s3.amazonaws.com/0/5616/55eaf17a-d993-37fc-e701-10624a9675fd.png)

続くメニューで**PEM形式**を選択し書き出します。デフォルトでは`[設定したIPアドレス].pem`という名前で書き出されます。
![PEM形式書き出し](https://qiita-image-store.s3.amazonaws.com/0/5616/45ed03ce-48dd-e975-0044-e5ee0b63e18d.png)


このファイルを、次で説明するHTMLにリンクを記述し、ダウンロードできる位置に配置します。


## AdHoc配信用Webサイトを用意する

1. インストールに必要なファイルへのリンクを記述したHTMLファイルを作成する（※ 後述）
2. 作成したファイルを`Document////////////`フォルダに置く
    3. HTMLファイル
    4. ipaファイル
    5. ipaのメタ情報を記述した`plist`ファイル
    6. オレオレサーバ証明書
    7. アプリアイコン（512x512のpng画像）
    8. ローディング中の画像（57x57のpng画像）
    9. 自己署名SSL証明書（前述した、書き出した`pem`ファイル）

### HTMLを用意する

以下のように、各種ファイルへのリンクを記述したHTMLファイルを用意しドキュメントルートへ配置します。

```html:index.html例
<html>
<html lang="ja">
<meta charset="utf-8"/>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>For Adhoc App</title>
  </head>
  <body>

    <div>
      <h1>アプリ</h1>
      <p><a href="itms-services://?action=download-manifest&url=https://[自分のIPアドレス]]/manifest.plist">インストール</a></p>
    </div>

    <div>
      <h1>証明書</h1>
      <p><a href="./[自分のIPアドレス].pem">証明書インストール</a></p>
    </div>
  </body>
</html>

```

### インストール処理に必要な`plist`ファイルを用意する

なお、ここで作成する`plist`ファイルに誤りがあると、「xxx.xxx.xxx.xxxに接続できません」のようなエラーが出てインストール自体ができないので注意が必要です。

```xml:plist例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>items</key>
  <array>
      <dict>
          <key>assets</key>
          <array>
              <dict>
                  <key>kind</key>
                  <string>software-package</string>
                  <key>url</key>
                  <string>https://(自分のPCのIPアドレス)/(Adhocのipaファイル).ipa</string>
              </dict>
              <dict>
                   <key>kind</key>
                   <string>display-image</string>
                   <!-- optional.  ローディング中の画像。57×57-pixel PNG icon -->
                   <key>needs-shine</key>
                   <true/>
                   <key>url</key>
                   <string>https://(自分のPCのIPアドレス)/(ローディング中の画像57×57).png</string>
               </dict>
               <!-- full-size-image: 512x512 のpng画像。 -->
               <dict>
                   <key>kind</key>
                   <string>full-size-image</string>
                   <key>needs-shine</key>
                   <true/>
                   <key>url</key>
                   <string>https://(自分のPCのIPアドレス)/( 512x512 の画像).png</string>
               </dict>
          </array>
          <key>metadata</key>
          <dict>
              <key>bundle-identifier</key>
              <!-- adhocアプリのバンドルID -->
              <string>xxx.xxx.xxx</string>
              <key>bundle-version</key>
              <!-- adhocアプリのバージョン -->
              <string>0.0.1</string>
              <key>kind</key>
              <string>software</string>
              <key>title</key>
              <!-- adhocアプリ名。イントールするときに表示される。-->
              <string>Adhocアプリ</string>
          </dict>
      </dict>
  </array>
</dict>
</plist>
```

※ 最初に参考にした記事では、`plist`ファイルの最後の閉じタグ（`</plist>`）がなく、エラーになっていたので加筆しています。


3. `/private/etc/apache2/extra/httpd-ssl.conf`をもう一度編集（httpd.confと同じように別フォルダで編集してもとの場所にペースト）。WEBページ用のフォルダをDocumentRootにセット。

```httpd-ssl.confの変更箇所
##DocumentRoot "/Library/WebServer/Documents"
↓
DocumentRoot "(WEBページ用のフォルダパス)"
```

- Apacheを再起動。なにか間違ってなければこれで準備完了

```console
$ sudo apachectl restart
```


## iPhone/iPadからAdhoc配信用Webサイト経由でアプリのインストール

- 上記でセットアップしたPCと同じネットワークのWi-FiにiPhone/iPadで接続し、証明書をインストールする  
「証明書インストール」のリンクをタップすると以下のような画面が表示されるので「許可」を押します。  
![証明書のインストール](https://qiita-image-store.s3.amazonaws.com/0/5616/925e0485-3259-102d-28cb-154e327258a8.png)  
インストールを進めると証明書がインストールされますが、まだ「信頼」のチェックがオフのままなので、「**証明書の信頼設定**」からチェックをオンにします。
なお、信頼設定は設定アプリの「`一般 > 情報 > 証明書信頼設定`」の中にあります。

- Safariで再び `https://[自分のPCのIPアドレス]` にアクセスし、次はアプリのインストールのリンクをタップする

以上の手順でインストールすることができるようになります。
回線の帯域などによっては若干時間がかかる場合があるようです。