* プロトコル

[4] [[素のHTTP]]を[[転送]]する[[プロキシ][HTTPプロキシ]]は、
原理的に[[要求]]と[[応答]]を好きに傍聴、改竄でき、
かつ[[クライアント]]はそのことを判断する手段を有しませんから、
[[HTTPプロキシ]]はその存在自体が [[MITM]] です。
[SEE[ [[HTTPプロキシ]] ]]

[5] [[HTTPS]] の場合、[[クライアント]]は [CODE[CONNECT]]
[[要求]]を[[プロキシ]]に送信してきます。
[[要求対象]]と [CODE[Host:]] に[[サーバー]]の [[hostport]]
が指定されます。
通常[[プロキシ][HTTPプロキシ]]は指定された[[サーバー]]に [[TCP]]
で接続し、以後送受信データをそのまま中継することが期待されていますが、
[[MITM proxy]] は [CODE[CONNECT]] [[トンネル]]の送受信データを処理する[[サーバー]]として振る舞い、
自身が[[クライアント]]があるかのように別の[[接続]]で本来の[[サーバー]]に接続し、
両接続の送受信データを傍聴、改竄しながら中継します。

[6] 
一見 [[HTTPS]] の場合でも[[クライアント]]は傍聴や改竄を検出できなそうに思えますが、
[[プロキシ]]は[[サーバー]]の[[証明書]]に対応する[[秘密鍵]]を持っていませんから、
偽の[[証明書]]と[[秘密鍵]]を使って[[クライアント]]と通信することになります。
偽の[[証明書]]の[[ルート証明書]]は[[クライアント]]の[[証明書データベース]]に含まれないため、
[[クライアント]]は不正の可能性を検知できます。

[8] 
[[クライアント]]の[[利用者]]の同意の元正当な目的でやむを得ず使われる
[[MITM proxy]] の場合、[[利用者]]が[[ルート証明書]]を予め何らかの方法で[[クライアント]]の[[証明書データベース]]に追加しておく必要があります。

[9] 
[[MITM proxy]] は、[[HTTPS]] [[サーバー]]として[[クライアント]]に返す[[サーバー証明書]]を用意する必要があります。
対象となる[[サーバー]]が固定されていれば事前に用意することも出来ますが、
不特定多数の[[サーバー]]に擬態する可能性があるなら、
動的に生成する必要があります。
[[証明書]]の生成や選択には、
[[TLS]] の開始時に[[クライアント]]から送信されてくる[[SNI]]を使うこともできますが、
[CODE[CONNECT]] [[要求]]の[[要求対象]]や [CODE[Host:]]
を使うことも出来ます。
生成や選択にかかる時間を考慮すると、後者に基づき用意するのが良いかもしれません。

* MITM proxy 判定

[7] [[Chrome]] は、[[ネットワークエラー]]の画面において、
[[証明書]]が [[MITM proxy]] のものと判断されるとき、
専用のエラー画面を表示します。
[SEE[ [[証明書エラー]] ]]

* ヘッダー

[3] 
次の[[HTTPヘッダー]]は[[証明書]]に関する事項を扱うもので、
[[MITM proxy]] と干渉するため、
[[MITM proxy]] により削除される可能性があります。

[FIG(list middle)[
- [CODE[Public-Key-Pins]]
- [CODE[Public-Key-Pins-Report-Only]]
- [CODE[Expect-CT]]
]FIG]

* メモ

[FIG(quote)[
[FIGCAPTION[
[1] [CITE@ja[【Ver7.0以降】HTTPSの規制サイトで規制画面が正常に表示さ...]]
( ([TIME[2016-05-07 01:39:18 +09:00]]))
<https://alsifaq.dga.jp/faq_detail.html?category=&id=4474&PHPSESSID=b8760cacf95181ae33401a1e5d322079>
]FIGCAPTION]

> 【ステップ2:証明書の警告画面を非表示にする。】
>  ステップ1の実施後、ブラウザによっては証明書の警告画面が表示されるようになります。
>  ステップ2では、ご利用のブラウザにWebFilterの証明書をインストールすることにより、
>  証明書の警告画面を非表示にします。
>  ●Ver8.xの場合
>  「InterSafe WebFilter v8.0/v8.5 管理者マニュアル」
>  付録'''['''H. 証明書のインストール''']'''をご参照ください。
>  ※Chromeは、Internet Explorerの証明書を参照していますので、
>   InternetExplorerに証明書をインストールしてください。
>   
>  ●Ver7.0の場合
>  「InterSafe WebFilter v7.0 管理者マニュアル」
>  付録'''['''K. 証明書のインストール''']'''をご参照ください。

]FIG]


[FIG(quote)[
[FIGCAPTION[
[2] [CITE[Google検索でSSL接続エラーが出た場合の対処法 | パソコンで副業ドットコム]]
( ([TIME[2016-10-25 00:28:55 +09:00]]))
<http://pcsidejob.com/20131122/6020>
]FIGCAPTION]

> 数日前より急に、GoogleChromeのツールバーから
> 検索したり、Google系のサイトにアクセスしようとすると
> “SSL接続エラー”なる表示が出て、アクセスできなくなりました。
> 調べてみるとどうやら、セキュリティソフトが原因だったようです。
> 同様の症状で悩んでいる方のために回避方法を記載しておきます。
> ちなみに私が使用しているセキュリティソフトはカスペルスキーなので、
> その対処方法を記載しておきます。

]FIG]


[10] [CITE@ja[JVNTA#96603741: HTTPS 通信監視機器によるセキュリティ強度低下の問題]]
([TIME[2017-03-21 09:59:17 +09:00]])
<http://jvn.jp/ta/JVNTA96603741/>

[FIG(quote)[
[FIGCAPTION[
[11] [CITE[よくあるご質問(FAQ検索)| デジタルアーツ]]
([TIME[2017-04-23 19:47:35 +09:00]])
<http://www.pa-solution.net/daj/bs/faq/Detail.aspx?id=3572>
]FIGCAPTION]

> 「SSL Adapter」によるSSLデコード機能をご利用の環境にて、
> 「Chrome バージョン58」にアップデート後にSSLサイトにアクセスすると、
> ページが表示できない現象が発生する可能性があります。
> 近日中に「i-FILTER」のバージョンアップにて対応予定です。
> バージョンアップをお客様にて実施するまでは、下記のいずれかの
> 対応を検討してください。
> ---
> A.Chromeの利用を控え他のブラウザを使用する
> B.SSLデコード除外設定する
>  Chrome 58で使用するUserAgentを条件に、SSLデコード対象から外します。

]FIG]



[12] [CITE@en[1523701 - SEC_ERROR_UNKNOWN_ISSUER since updating to Firefox 65]]
([TIME[2019-02-02 14:47:00 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1523701>