3. httpsのgetだよ
前記事で単純なhttpのGetを扱いましたが、今回はhttpsなGetをやってみます。こちらの方が普通ですかね。VCLプログラムの新規作成を選んで、新規フォームの上に、コンポーネント(TIdHTTP)とボタン、結果を表示するためのTLabelを2個配置します。今回は、htmlをGetするのではなく、サーバーの証明書関係の情報を得ることにしましょう。証明書は、ブラウザから確認することもできます。
例えば”Google先生”https://www.google.comにアクセスしてみましょう。以下の例ではブラウザとして“Chrome”を使いました。もちろんEdgeでも同じことは可能です。下記でオレンジ色のマーカーで囲った部分をクリック。
ここの”この接続は保護されています”をクリック。
出てきた”証明書は有効です”の
のオレンジ色のマーカで囲ったところをクリックすると、
証明書に関する情報が表示されます。ここで重要なのは発行元と有効期限です。期限が切れていると信頼されているサイトと見なされず、なりすましサイトの可能性もあります。独自にサーバーを建てている方は、自前のサーバーの証明書に注意しましょう。ブラウザから確認できますが、手動でここまでの操作をするのはかなり面倒なので、プログラムで一発で表示させるというのが今回のテーマです。
フォームには、下図のように部品を配置しますが、パレットに“ssl”と入れると出てくる下記の二つのうちTIdSSLIOHandlerSocketOpenSSlも置く必要があります。これはTIdHTTPにSSLをサポートさせるために必要です。
最終的なフォームは、下記のようになります。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版でもファイル名は同じです。
コメント