iOS構成プロファイルの暗号化

[リファレンス](https://developer.apple.com/library/content/featuredarticles/iPhoneConfigurationProfileRef/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010206-CH1-SW52)
#下準備
- 平文、未署名の構成プロファイルを作成する。（サンプルはパスコード必須化プロファイル）
- 「PayloadContent」キー内のトップレベルarrayを切り取る。
    - 別ファイルに貼り付け、例として「content.plist」として保存

```xml:sample.mobileconfig
<?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>PayloadContent</key>
<!-- ここから -->
	<array>
		<dict>
			<key>PayloadDescription</key>
			<string>パスコード設定を構成します</string>
			<key>PayloadDisplayName</key>
			<string>パスコード</string>
			<key>PayloadIdentifier</key>
			<string>com.apple.mobiledevice.passwordpolicy.075922A0-F3E8-4021-9299-05DCE5737A69</string>
			<key>PayloadType</key>
			<string>com.apple.mobiledevice.passwordpolicy</string>
			<key>PayloadUUID</key>
			<string>075922A0-F3E8-4021-9299-05DCE5737A69</string>
			<key>PayloadVersion</key>
			<integer>1</integer>
			<key>allowSimple</key>
			<true/>
			<key>forcePIN</key>
			<true/>
			<key>requireAlphanumeric</key>
			<false/>
		</dict>
	</array>
<!-- ここまで --->
	<key>PayloadDisplayName</key>
	<string>構成プロファイル</string>
	<key>PayloadIdentifier</key>
	<string>com.example.sampleprofile</string>
	<key>PayloadRemovalDisallowed</key>
	<false/>
	<key>PayloadType</key>
	<string>Configuration</string>
	<key>PayloadUUID</key>
	<string>04DE3942-1870-4C98-B901-5A233EA772BF</string>
	<key>PayloadVersion</key>
	<integer>1</integer>
</dict>
</plist>
```
- 「PayloadContent」キーを「EncryptedPayloadContent」に変更する。

```xml:encrypted.mobileconfig
<?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>EncryptedPayloadContent</key>
<!-- ここから -->

<!-- ここまで --->
	<key>PayloadDisplayName</key>
	<string>構成プロファイル</string>
	<key>PayloadIdentifier</key>
	<string>com.example.sampleprofile</string>
	<key>PayloadRemovalDisallowed</key>
	<false/>
	<key>PayloadType</key>
	<string>Configuration</string>
	<key>PayloadUUID</key>
	<string>04DE3942-1870-4C98-B901-5A233EA772BF</string>
	<key>PayloadVersion</key>
	<integer>1</integer>
</dict>
</plist>
```

#ペイロードコンテンツの暗号化
macOS Sierra, OpenSSL 0.9.8zh 14 Jan 2016

```bash
$ openssl smime -encrypt -aes256 \
-in content.plist \
-outform pem \
[証明書].cer

-----BEGIN PKCS7-----
44G744GS44G044KICg==（もっと長い）
-----END PKCS7-----
```

「-----BEGIN PKCS7-----」から「-----END PKCS7-----」までの間のBase64符号化されたデータをコピーする。

#暗号化プロファイルとして結合
プロファイルの「EncryptedPayloadContent」下にDataとして貼り付ける。

```xml:encrypted.mobileconfig
<?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>EncryptedPayloadContent</key>
<!-- ここから -->
	<data>
	44G744GS44G044KICg==
	</data>
<!-- ここまで --->
	<key>PayloadDisplayName</key>
	<string>構成プロファイル</string>
	<key>PayloadIdentifier</key>
	<string>com.example.sampleprofile</string>
	<key>PayloadRemovalDisallowed</key>
	<false/>
	<key>PayloadType</key>
	<string>Configuration</string>
	<key>PayloadUUID</key>
	<string>04DE3942-1870-4C98-B901-5A233EA772BF</string>
	<key>PayloadVersion</key>
	<integer>1</integer>
</dict>
</plist>
```

#使い方と個人的まとめ
- iOS9までは、復号できない場合はその旨を表示していたがiOS10の場合は、ただのxmlとして扱われる模様
    - プロファイルインストール画面に遷移せず、OpenInが働く

- 復号させる場合は、iOS側に秘密鍵を入れておく必要がある。
    - p12ファイルをメールで送る、p12を含むプロファイルをインストールしておく

- 署名をする場合は、暗号化プロファイル作成後に署名する。

- 暗号化することで、パスワード類を含めて平文で見えることはなくなるが、公開鍵暗号の仕様上、復号できなくもないため、内容を秘匿したい場合は秘密鍵の配布方法を考慮する必要がある。
    - p12をメールで送ると、そこから秘密鍵を取り出して復号できなくもない。
    - p12を含めたプロファイルにはp12のパスワードが平文で入る。

- 秘密鍵を持っていないとプロファイルのインストールができないので、不特定多数への配布には不向き

- 業務利用する場合は、秘密鍵を事前にConfiguratorで入れておけばいいかもしれない。
    - もっとも、その場合は大人しくMDMを利用する方が楽

結論：使い途が思いつかない。

おまけ
暗号化プロファイルがインストールされた場合、iTunesとかでのバックアップ時に暗号化が必須とされる。はまった。