pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


2018/10/12以降にDelphi/C++Builder/RAD StudioのIDE利用時に表示されるエラーを出ないようにしたい

2018/10/14 08:00 補足 エラーの発生は解決しているようなので、この記事の作業は必要ありません。 この記事は、発生したエラーの原因や、その対処方法に関する資料としてのみ、お読みいただけます。


すでに twitter に書いた件だけど、ざっくりまとめておく。

何が問題なのか?

Delphi/C++Builder/RAD Studio の IDE では、エンバカデロのいくつかのサーバと通信して、起動後のウェルカムページや GetIt パッケージマネージャで利用可能なパッケージを取得したりしているようです。

しかしどうやら、それらの通信先の一部のSSL/TLS証明書の有効期限が2018/10/12の早朝(日本時間)のままで未更新のサーバがあるようです。このために2018/10/12にIDEを操作すると、それらの期限切れの証明書が信頼できないものと判断されてしまいます。そして警告表示がモーダルダイヤログで表示されます。

警告ダイヤログが表示されること自体は、SSL/TLS証明書を正しく検証しているわけですし、これは良い動作です。証明書が検証されていないクライアントでは、偽サイトへの接続を検知できないわけで、基本的にはこのようになるべきです。

しかしながら、通信先のサーバのSSL/TLS証明書の有効期限が切れているのは、サーバ管理者側の不手際です。従ってDelphi/C++Builder/RAD StudioのIDEを利用すると警告がたびたび表示される、残念な状態になっています。

どうすれば解消できるのか?

少なくとも2つのアイデアがあります。

開発環境からのインターネット向け通信を遮断する

ネットワーク設定からデフォルトゲートウェイを落とすなどして、外向けの通信を切ってしまえばエラーは出なくなります。

SSL/TLS証明書が期限切れのサーバと通信しなければよいのですから、外部向けの通信が不要な環境では、これがもっとも簡単な解決策です。

仮想マシン上に開発環境を作っている場合は、ゲストOSのNICを無効化するという手もあります。

(開発現場によっては、外部向けの通信が最初から遮断されている場合もあります。このような環境では今回の問題は、当然発生していないはずです)

すべてのSSL/TLS通信において、mitmproxy を挟み、なおかつ mitmproxy の root CA 証明書を Windows の証明書ストアの「信頼されたルート証明書」に追加する

mitmproxy は HTTP や HTTPS 通信をモニタリングできる Proxy です。ブラウザの場合は開発者ツールで通信内容をチェックできますが、ネイティブアプリの場合はそういうわけにいかないので、かわりにこういうツールを使ってモニタリングできます。

今回の目的のための使い方はこれだけ。

  • インストールして起動する
  • OS やアプリのプロキシ設定を localhost:8080 にする
  • Internet Explorerhttp://mitm.it/ にアクセスして root CA 証明書をダウンロードし、OS の証明書ストアの「信頼されたルート証明書」ににインポートする

これでなぜ問題が回避できるかというと、

  • mitmproxy は HTTPS 通信に対して、自分自身がオリジナルのサーバであるように振る舞う
  • このときに mitmproxy は接続ごとにオレオレ証明書を生成してクライアント側に引き渡す
  • しかしオレオレ証明書なので、すべてのHTTPS通信は証明書エラーが発生してしまう
  • そこで、mitmproxy がオレオレ証明書の生成に用いている root CA の証明書をクライアント側にインストールすれば、すべての通信で証明書エラーが出なくなる

という流れです。

この方法はクライアント側での証明書検証が実質的に機能しなくなるので、手放しで勧めることはしませんが、インターネット接続を落とすことができない環境では、一時的なワークアラウンドとして使えるはずです。

企業内ネットワークで外部接続に proxy が標準で必要な構成の場合は、その proxy に対して mtimproxy から連携できるように Upstream proxy mode のオプションを設定すればOKと思います。

類似の方法として owasp-ZAP で環境を作ってもよいのですが、こちらは脆弱性検査ツールなので設定を間違うと大変よろしくない状況がおきます。ですので手順は割愛します(脆弱性検査ツールは設定項目が多いのですが、間違ってアクティブスキャンが有効にしてしまうと、アクセス先のサーバを攻撃してしまいますので……)。

または、mitmproxy の代わりに、下記記事で紹介しているような方法で、squid を用いた HTTPS intercept の環境を作ってもよいでしょう。ただしクライアントサイドでの作業ならば、mitmproxy を導入するほうが圧倒的にカンタンです。

pslabo.hatenablog.com

あきらめる

あきらめて、警告のモーダルダイヤログが出るたびに消すのもありといえばありです。ただしこの方法は悪い癖(警告を無視する)がついてしまうので、まったくおすすめできない方法です。

なにはともあれ、エンバカデロ のインフラ担当者は、さっさと証明書をアップデートしてほしいですね...