クライアント証明書発行プロトコルの比較

# クライアント証明書発行プロトコルの比較

[CA局](https://www.digicert.com/jp/blog/what-is-a-certificate-authority)機能は広範囲に渡りますが、クライアント証明書発行ツールとして機能を絞った場合にどのプロトコルを採用するのがベストか？という観点としてまとめました。

## 要約
|プロトコル|概要|
|---|---|
|CMP | ・証明書管理に関する機能を普く提供する。<br>・様々な証明書フォーマットに対応する。　<br>・比較的重たい|
|SCEP | ・軽量な実装で広く使われている。<br>・証明書管理全てを提供しているわけではない。<br>・RSAのみをサポート|
|ETS|・SCEPの後継として開発された。<br>・楕円曲線暗号を扱うことができる。|

## 目次
- クライアント証明書とは
- CMP
- SCEP
- ELS
- まとめ

## クライアント証明書とは？
クライアント証明書は、サーバーとクライアント（ウェブブラウザなど）の間の通信を安全にするために使用されるデジタル証明書です。

### クライアント証明書の役割
クライアント証明書は、以下の役割を持っています。

- クライアント証明書は個人や組織を認証しクライアントの身分を保証する。
- サーバーとクライアントの間の通信を暗号化し、中間者攻撃から保護する。

### クライアント証明書の期限
クライアント証明書には期限があります。一般的には、1年や2年などの期間が設定されています。期限が切れた場合は、新しい証明書を取得する必要があります。


### クライアント証明書の取得方法
クライアント証明書は、認証局（CA）から取得することができます。一般的には、証明書の申請手続きを行い、申請者の正当性を確認した上で、証明書を発行してもらいます。本記事では、この発行プロトコルの比較を行います。


## CMP
The Certificate Management Protocol (CMP) はEJBCAにサポートされた最も古いプロトコルです。CMPは1999年にRFC 2510 で、CMPv2が2005年に RFC 4210 でまとめられました。

### CMPの特徴

- SCEPやETSと比べて重たく包括的な機能を提供
- RSAやDSA、ECDSAを含む様々な証明書フォーマットに対応
- 3GPP LTE framework　に対応している
- CA、RA,クライアントの間で使われる


### CMPのフロー
1. Initialization Request (IR)
    - 新しいデバイスをPKIに追加するために使用
    - 成功したリクエストは証明書の発行に結びつき、その証明書を使用して後続のCMPメッセージに署名
2. Certification Request (CR)
    - 既にPKIの一部となっているデバイスの追加証明書を取得するために使用
3. Key Update Request (KUR)
    - 証明書の更新または再発行をリクエストするために使用
4. CA間の相互認証
5.証明書失効管理
6. 証明書とCRLの検出 

## SCEP
CMPと同じく長い歴史を持つプロトコルです。2020年にRFC 8894 を最終公開しました。軽量でシンプルな実装を目指しており、CMPより機能が限定的です。Cisco社によって開発されました。


### SCEPの特徴
- HTTPベースのリクエスト/レスポンスモデルを採用
- RSAベースの暗号化のみをサポート
- 証明書リクエスト形式にはPKCS#10を、暗号化された/署名されたメッセージを伝達するためにはPKCS#7を使用
- サーバーによる非同期承認をサポートし、リクエスターによる定期的なポーリングを行う
- CRLの取得に関しては、CRL配布ポイント（CDP）クエリを使用することが推奨されており、オンライン証明書失効をサポートしていない
- Certificate Signing Request（CSR）内にチャレンジパスワードフィールドを使用する必要があり、このパスワードはサーバーとリクエスターの間でのみ共有されるようにする必要がある

### SCEPのフロー
1. 証明書発行元（CA）証明書のコピーを取得し、検証する。
2. CSRを生成し、CAに安全に送信する。
3. 証明書が署名されたかどうかを確認するために、SCEPサーバーに定期的にポーリングする。
4. 現在の証明書の有効期限が切れる前に、必要に応じて再登録して新しい証明書を取得する。
5. 必要に応じてCRLを取得する。

### SCEPの批評
+ 現在も広く使用され、サポートされています。


- ドラフトとは対照的に、RFCの採用がまだ限定的であるため、将来的に互換性の問題が発生する可能性があります

- 証明書管理に関する機能の全てを含んでいるわけではありません

- RSAベースのみの暗号化のみをサポートし、量子コンピュータの登場により危殆化が懸念されます

- シスコ自身が推奨する新しいアプリケーションのためのESTが存在します


## ETS
SCEPの後継として開発されました。 RFC 7030 にまとめられています。

### ETS の特徴
- TLSに依存することで、ペイロードを暗号化されたチャネルで伝送することが可能
- SCEPとは異なり、楕円曲線ベースの鍵を扱うことができる
- ESTはクライアント認証に共有秘密（パスワード）を使用することができますが、信頼できる第三者が発行したクライアント証明書を使用することも可能
- ESTはHTTPSスタックに依存することで、シンプルなクエリと軽量なクライアント実装が可能
- ESTを使用すると、鍵をサーバー側で生成することができます。

### ETSの批評
- ESTはIoTやその他の軽量PKIユースケースに最適な選択肢となります。
- 軽量プロトコルとしてSCEPとほぼ同じ役割を果たすが、より洗練された設計となっています。

+ セキュリティのためにHTTPSスタックに依存することで、将来性を考慮した最新の暗号機能を実現し、楕円曲線に対応できます。


# まとめ
今回はクライアント証明書発行プロトコルの比較を行いました。多機能を提供するCMP、軽く広く使われているSCEP、SCEPの後継でTLSに基づいたETSなど様々なプロトコルが存在します。みなさんの用途に応じて取捨選択して頂けたらと思います。

## 参考ソース
https://www.primekey.com/resources/enlightened-enrollment-the-book-of-five-protocols/

https://www.rfc-editor.org/rfc/

https://cve.mitre.org/cve/

https://youtu.be/W9bR014L2SQ

https://www.cisco.com/c/en/us/support/docs/security-vpn/public-key-infrastructure-pki/116167-technote-scep-00.html

https://radek-rekas.medium.com/an-introduction-to-cmpv2-1c85a8e3b4c8

https://www.soumu.go.jp/main_content/000655118.pdf