C++ Builder CE ネットワークプログラミング

3. httpsのgetだよ

前記事で単純なhttpのGetを扱いましたが、今回はhttpsなGetをやってみます。こちらの方が普通ですかね。VCLプログラムの新規作成を選んで、新規フォームの上に、コンポーネント(TIdHTTP)ボタン、結果を表示するためのTLabelを2個配置します。今回は、htmlをGetするのではなく、サーバーの証明書関係の情報を得ることにしましょう。証明書は、ブラウザから確認することもできます。

例えば”Google先生”https://www.google.comにアクセスしてみましょう。以下の例ではブラウザとして“Chrome”を使いました。もちろんEdgeでも同じことは可能です。下記でオレンジ色のマーカーで囲った部分をクリック。

ここの”この接続は保護されています”をクリック。

出てきた”証明書は有効です”

オレンジ色のマーカで囲ったところをクリックすると、

証明書に関する情報が表示されます。ここで重要なのは発行元有効期限です。期限が切れていると信頼されているサイトと見なされず、なりすましサイトの可能性もあります。独自にサーバーを建てている方は、自前のサーバーの証明書に注意しましょう。ブラウザから確認できますが、手動でここまでの操作をするのはかなり面倒なので、プログラムで一発で表示させるというのが今回のテーマです。

フォームには、下図のように部品を配置しますが、パレットに“ssl”と入れると出てくる下記の二つのうちTIdSSLIOHandlerSocketOpenSSlも置く必要があります。これはTIdHTTPSSLをサポートさせるために必要です。

最終的なフォームは、下記のようになります。Edit1の初期文字列はお好きなサイトのドメイン名を入れても良いです。

TIdHTTPの入出力をTIdSSLIOHandlerSocketOpenSSLに担わせるのは、プロパティーの設定を下図のようにしておきます。(必須です)

IdHTTP1つまりTIdHTTPのインスタンス(実体)のプロパティーIOHandlerというのがありますので、ここをクリックすると出てくる選択肢から

としておきます。Getボタンをダブルクリックして出てくる関数は、

void __fastcall TForm1::GetClick(TObject *Sender)
{
	IdHTTP1->ConnectTimeout = 5000;

	IdHTTP1->Request->Pragma = "no-cache";

	TMemoryStream* ms = new TMemoryStream();

	try {
		IdHTTP1->Get(Edit1->Text, ms);
	}
	catch(const Exception& e)
	{
			//ShowMessage(e.ClassName());
			Label1->Caption ="Dead";
			Label2->Caption ="NA";

	}

}

ここではtry catchでエラートラップしています。TMemoryStream msは使いません。えっつ?

その代わりに、IdSSLIOHanderlSocketOpenSSL1のイベントハンドラーのOnVerifyPeerをダブルクリックして出てくるハンドラを

bool __fastcall TForm1::IdSSLIOHandlerSocketOpenSSL1VerifyPeer(TIdX509 *Certificate,
		  bool AOk, int ADepth, int AError)
{
	TDateTime now = Now();
	TDateTime exp = Certificate->notAfter;

	Label1->Font->Size = 12;

	Label1->Caption = Certificate->notAfter;// exp date
	int idays = DaysBetween(now,exp);

	Label2->Font->Size = 12;

	if( idays < 30 )
		Label2->Font->Color = clRed;
	else
		Label2->Font->Color = clBlack;

	Label2->Caption =IntToStr(idays);
	return true;

}

こうします。またIdSSLIOHanderlSocketOpenSSL1のプロパティーのSSLOptionを以下のようにしておきます。コードで書いた方が筆者も読者も手間が減りますね。その件は動的割り付けの記事で触れました。

実行例は、

このような結果が得られます。左側のが証明書期限で、最初の方でお見せしたwww.google.comの証明書の有効期間・有効期間と当然一致しています。右側の”63”が今日からの日数です。日数計算のために

int idays = DaysBetween(now,exp);

とDaysBetween関数を使っていますので、そのために

#include <DateUtils.hpp>

が必要です。ちなみに残り日数が30を切ると、赤色の日数表示になります。無料の証明書発行機関Let’s Encrypt等では更新した証明書の期限は90日で、基本的に自動更新スクリプトなどの効果で30日を切らないことになっています。

最後に補足です。httpsに従わないと、プログラムがうまく動きません。上記サイトを参考にして、OpenSSL用のライブラリをダウンロードして、実行プログラムと同じ階層に置く必要があります。今回だと、

このようになっている必要があります。またlibeay32.dllとssleay32.dllは32bit版と64bit版があり、buildしたプログラムのbit数に合わせる必要がありますので注意してください。紛らわしいことに32bit版でも64bit版でもファイル名は同じです。

コメント