[Gmail API] JavaでGmailクライアントサイド暗号化(CSE)されたキーペアを生成・更新・削除する

Gmail API v1（Java）を使用して、
Gmailクライアントサイド暗号化(CSE)されたキーペアを生成・更新・削除する方法
についてご紹介します。

**Gmailクライアントサイド暗号化とは**
メールデータをGoogleクラウドベースストレージに転送または保存する前に
ブラウザ内で暗号化を行う仕組みです。
送信先の相手が受信するまで、メールデータは保護されます。
これにより機密データや規制対象データのコンテンツの機密性保持を強化できます。

このAPIは、ドメイン全体の権限を委任されたサービスアカウントを
使用しての発行のみ利用可能です。OAuth 2.0では利用できません。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Gmail API] JavaでGmail APIを使う](https://qiita.com/doran/items/a078e966bfd93c4b19c2)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[キーペアを生成](#1-キーペアを生成)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[キーペアを無効にする](#2-キーペアを無効にする)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[キーペアを有効にする](#3-キーペアを有効にする)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|
|4||[キーペアを削除](#4-キーペアを削除)|
||1|[スコープ](#41-スコープ)|
||2|[実行](#42-実行)|
||3|[レスポンスの内容](#43-レスポンスの内容)|

## 1. キーペアを生成
認証されたユーザーのクライアント側の暗号化キーのペアリストを生成します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();

	Gmail.Users.Settings.Cse.Keypairs keypairs = settings.cse().keypairs();
	CseKeyPair content = new CseKeyPair();
	Gmail.Users.Settings.Cse.Keypairs.Create create = keypairs.create("メールアドレス",content);

	CseKeyPair res = create.execute();
	System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/keypairs
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
CseKeyPairのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setPkcs7|String|公開キーとその証明書チェーン|
|setPrivateKeyMetadata|List\<[CsePrivateKeyMetadata](#cseprivatekeymetadataset)\>|キーペアの秘密キーのメタデータ|

#### CsePrivateKeyMetadata(Set)

|メソッド|引数|説明|
|---|---|---|
|setSetKaclsKeyMetadata|List\<[KaclsKeyMetadata](#kaclskeymetadataset)\>|外部キーアクセス制御リスト<br>setHardwareKeyMetadata()と一方のみ設定可能|
|setHardwareKeyMetadata|List\<[HardwareKeyMetadata](#hardwarekeymetadataset)\>|ハードウェアキーのメタデータリスト<br>setSetKaclsKeyMetadata()と一方のみ設定可能|

#### KaclsKeyMetadata(Set)

|メソッド|引数|説明|
|---|---|---|
|setKaclsUri|String|秘密キーを管理するキーURI|
|setKaclsData|String|キー アクセス制御リストのデータ<br>最大：8kb|

#### HardwareKeyMetadata(Set)

|メソッド|引数|説明|
|---|---|---|
|setDescription|String|ハードウェアキーについての説明|

### 1.3. レスポンスの内容

#### CseKeyPair

|メソッド|戻り値|説明|
|---|---|---|
|getNextPageToken|String|次のページを取得するたのページトークン|
|getCseKeyPairs|List\<[CseKeyPair](#csekeypair)\>|CSEキーペアのリスト|

#### CseKeyPair

|メソッド|戻り値|説明|
|---|---|---|
|getKeyPairId|String|キーペアID|
|getPem|String|PEM形式の公開キーとその証明書チェーン|
|getSubjectEmailAddresses|Lisr\<String\>|リーフ証明書に指定されているメールアドレスID|
|getEnablementState|[EnablementState(enum)](#enablementstate)|キーペアの現在の状態|
|getDisableTime|String|キーペアの状態がDisableに変化した時刻|
|getPrivateKeyMetadata|List\<CsePrivateKeyMetadata\>|キーペアの秘密キーのメタデータリスト|

#### CsePrivateKeyMetadata

|メソッド|戻り値|説明|
|---|---|---|
|getPrivateKeyMetadataId|String|秘密キーのメタデータID|
|getSetKaclsKeyMetadata|List\<[KaclsKeyMetadata](#kaclskeymetadata)\>|外部キーアクセス制御リスト<br>getHardwareKeyMetadata()と一方のみ設定可能|
|getHardwareKeyMetadata|List\<[HardwareKeyMetadata](#hardwarekeymetadata)\>|ハードウェアキーのメタデータリスト<br>getSetKaclsKeyMetadata()と一方のみ設定可能|

#### KaclsKeyMetadata

|メソッド|戻り値|説明|
|---|---|---|
|getKaclsUri|String|アクセス制御リストのサービスURI|
|getKaclsData|String|サービスによって生成および使用されるデータ(最大サイズ:8Kbyte)|

#### HardwareKeyMetadata

|メソッド|戻り値|説明|
|---|---|---|
|getDescription|String|ハードウェアキーについての説明|

#### EnablementState

|定義値|内容|
|---|---|
|stateUnspecified|未設定|
|enabled|キーペアがオン|
|disabled|キーペアがオフ|

## 2. キーペアを無効にする
既存のクライアント側の暗号化キーのペアを無効にします。

更新したいキーペアのIDを指定します。
[1. キーペアリストを生成(CseKeyPair)](#csekeypair)の
getKeyPairId()で取得した値を設定します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();

	Gmail.Users.Settings.Cse.Keypairs keypairs = settings.cse().keypairs();
	Gmail.Users.Settings.Cse.Keypairs.Disable disable = keypairs.disable("メールアドレス","キーペアID",null);

	CseKeyPair res = disable.execute();
	System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/keypairs/{キーペアID}:disable
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

### 2.3. レスポンスの内容

#### CseKeyPair

[1.3. レスポンスの内容(CseKeyPair)](#csekeypair)と同じです。

## 3. キーペアを有効にする
既存のクライアント側の暗号化キーのペアを有効にします。

更新したいキーペアのIDを指定します。
[1. キーペアリストを生成(CseKeyPair)](#csekeypair)の
getKeyPairId()で取得した値を設定します。

### 3.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 3.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();

	Gmail.Users.Settings.Cse.Keypairs keypairs = settings.cse().keypairs();
	Gmail.Users.Settings.Cse.Keypairs.Enable enable = keypairs.enable("メールアドレス","キーペアID",null);

	CseKeyPair res = enable.execute();
	System.out.println(res);
}
```
#### 3.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/keypairs/{キーペアID}:enable
が実行されます。

#### 3.2.2. クエリパラメータ
クエリパラメータはありません。

### 3.3. レスポンスの内容

#### CseKeyPair

[1.3. レスポンスの内容(CseKeyPair)](#csekeypair)と同じです。

## 4. キーペアを削除
既存のクライアント側の暗号化キーのペアを有効にします。

更新したいキーペアのIDを指定します。
[1. キーペアリストを生成(CseKeyPair)](#csekeypair)の
getKeyPairId()で取得した値を設定します。

### 4.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 4.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();

	Gmail.Users.Settings.Cse.Keypairs keypairs = settings.cse().keypairs();
	Gmail.Users.Settings.Cse.Keypairs.Obliterate obliterate = keypairs.obliterate("メールアドレス","キーペアID",null);

	obliterate.execute();
}
```
#### 4.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/cse/keypairs/{キーペアID}:obliterate
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

### 4.3. レスポンスの内容
レスポンスはありません。
削除に失敗した場合、例外が発生します。

<br>
<br>
おしまい。。