# サービス証明書

```{attention}
本章のサービス証明書は、[中間者証明書のインストール](./install-mitm-cert.md) 章で説明される中間者キャプチャ用証明書とは用途が異なりますので、混同しないように注意してください。後者は Android システムの信頼領域にインストールされ、アプリケーションがプロキシを信頼してトラフィックを傍受できるようにするためのものです。サービス証明書は PEM 形式のファイルで、FIRERPA サーバー側が読み込み、クライアント側が保持し、FIRERPA 通信リンクの暗号化と訪問者の身元確認に使用されます。
```

本章では、FIRERPA サービス証明書の生成とデプロイについて紹介します。FIRERPA サーバーはデフォルトでは身元認証が無効化されており、同一ネットワーク内でデバイスの IP とポートを知っている任意の訪問者が、リモートデスクトップへの接続、API の呼び出し、SSH の使用を行えます。信頼できないネットワーク環境での利用や、通信に TLS 暗号化が必要な場合は、サービス証明書によってアクセス制御を有効にする必要があります。

```{note}
アプリ経由でサーバーをインストールする場合、アプリの**設定**で認証を有効にすると、アプリが自動的に証明書を生成・設定するため、以下の生成手順を実行する必要はありません。Magisk モジュールや手動デプロイの場合は、本章の手順に従って証明書を生成し、手動でデプロイする必要があります。
```

証明書を生成する前に、PC 上で [ツールの準備](./tools-prepare.md) を完了し、`lamda` リポジトリをクローンして `tools` ディレクトリで Python 依存関係をインストールします。`tools` ディレクトリで `cert.py` を実行し、パラメータをデバイスへのアクセス時に使用するホスト名に置き換えます。

```bash
python3 cert.py mydevice.local
```

実行が成功すると、カレントディレクトリに `mydevice.local.pem`、`root.crt`、`root.key` が生成されます。`.pem` ファイルはサーバー側が TLS を有効にし、クライアントが身元を確認するために使用されます。`root.crt` と `root.key` はルート証明書の鍵ペアであり、通常の日常的な接続では使用されませんが、後日の更新やトラブルシューティングのために安全に保管してください。

生成された PEM ファイルの最初の行はメタデータコメントで、その中の `PASSWD` フィールドの値はデフォルトのリモートデスクトップログイン資格情報です。PEM ファイル内の秘密鍵や証明書の内容を手動で編集しないでください。編集するとサーバー起動に失敗したり、クライアントでの検証に異常が生じる可能性があります。証明書ファイルの形式は次の通りで、各ブロックは `key`、`cert`、`CA` の順序で、この順序を厳守する必要があります。

```text
LAMDA SSL CERTIFICATE (CN=mydevice.local,PASSWD=e908d358...)
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA33YUKkfUkLeWtsCe7A1yzIZsqOTd1a8XWr9+Vh0ombOdtnqK...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIC1DCCAbygAwIBAgIQBKjY0w1FbPJooD5mJ1CWwDANBgkqhkiG9w0BAQsFADAz...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDAzCCAeugAwIBAgIQR9OCJbQGGQT5Pgp7PmLrDTANBgkqhkiG9w0BAQsFADAz...
-----END CERTIFICATE-----
```

証明書の生成後、FIRERPA サーバーが起動時にこの証明書を読み込むように設定する必要があります。これでアクセス制御が有効になります。Magisk デプロイでは、PEM を `lamda.pem` にリネームし、[サーバーのインストール](./install-server.md) の Magisk セクションの説明に従ってモジュールパッケージに配置します。設定が有効になりサービスを再起動すると、リモートデスクトップ、API、および関連ツールは HTTPS と証明書の要件に従って動作します。

手動インストールの場合は、`launch.sh` の後ろにコマンドライン引数 `--certificate=/path/to/lamda.pem` を追加して証明書を渡すか、[サービス設定](./properties.md) で `cert` 設定項目を設定することで使用できます。

```{note}
サービス証明書を有効にすると、[リモートデスクトップ](./remote-desktop.md) は https:// プロトコルでアクセスする必要があり、WebUI で上記のパスワードを入力する必要があります。また、[サービス設定](./properties.md) の ssl-web-credential 項目で代替ログインパスワードを設定することもできます。Python クライアント接続時は、Device コンストラクタで PEM のパスを指定します（[API 準備](./api-prepare.md) を参照）。tools ディレクトリのコマンドラインツールでは、CERTIFICATE 環境変数でパスを指定します（[ツール準備](./tools-prepare.md) を参照）。
```