Skip to main content.

Friday, December 15, 2006

WinInet APIの利用(その3) HTTPS

WinInet APIでHTTPSの通信をする場合のプログラムについてです。私の場合ですが、MFCのクラスを利用していて、HTTPの場合は、WinInet APIの利用(その2)のような処理をしています。HTTPSの場合もHTTPと同じような処理ですが、以下のような処理をしています。

1.コネクション確立まで
・HTTPの場合

//URLの解析
AfxParseURL(sURL, dwServiceType, sServerName, sObject, nPort);

//※2006/12/15 間違いがありましたので、修正しました。dwAccessTypeは3番目です
//セッションの生成
// CInternetSession session("Test Agent Ver0.01",dwAccessType);
/*
CInternetSessionのコンストラクタの定義は(※VC++ Ver6.0の場合)AfxInet.hには以下のようにあります。

CInternetSession(LPCTSTR pstrAgent = NULL,
DWORD dwContext = 1,
DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS,
LPCTSTR pstrProxyName = NULL,
LPCTSTR pstrProxyBypass = NULL,
DWORD dwFlags = 0);
*/
// dwAccessTypeまでを指定するのであれば、以下の様になります。
DWORD dwContext = 1;
CInternetSession session("Test Agent Ver0.01",dwContext,dwAccessType);
// 2006/12/15修正ここまで

//コネクションの確立
CHttpConnection* pServerConn = session.GetHttpConnection(sServerName,nPort);

・HTTPSの場合
//URLの解析
AfxParseURL(sURL, dwServiceType, sServerName, sObject, nPort);

//※2006/12/15 間違いがありましたので、修正しました。dwAccessTypeは3番目です
//セッションの生成
// CInternetSession session("Test Agent Ver0.01",dwAccessType);
// dwAccessTypeまでを指定するのであれば、以下の様になります。
DWORD dwContext = 1;
CInternetSession session("Test Agent Ver0.01",dwContext,dwAccessType);
// 2006/12/15修正ここまで

//コネクションの確立
pServerConn = session.GetHttpConnection(sServerName,INTERNET_FLAG_SECURE,nPort,"username","password");

HTTPとHTTPSでは、CInternetSessionクラスのGetHttpConnection()の引数の数が違います。まず、HTTPSのフラグ"INTERNET_FLAG_SECURE"を指定します。
それから、"username"と"password"は認証が必要な場合のユーザ名とパスワードです。必要なければ、NULLを指定します。

HTTPSでは、AfxParseURL()にURLを指定する際に、"https://independence-sys.com/login.html"のようにhttpsを指定します。そうすると、上の変数名ですと、nPortに443が返ってきます。ポート番号を直接指定したい場合は、"https://independence-sys.com:3333/login.html"のように指定すると、そのポート番号が設定されます。

2.リクエストの送信時(CHttpConnectionクラスのOpenRequest()のフラグの設定)
・HTTPの場合

DWORD dwInetFlags = INTERNET_FLAG_EXISTING_CONNECT;(※他に必要な場合は、その必要なパラメータも指定します。)

CHttpFile* pFile = pServerConn->OpenRequest(nverb, sObject,NULL,1,NULL,NULL,dwInetFlags);

・HTTPSの場合
DWORD dwInetFlags =
INTERNET_FLAG_EXISTING_CONNECT |
 INTERNET_FLAG_SECURE |
 INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
 INTERNET_FLAG_IGNORE_CERT_CN_INVALID;

CHttpFile* pFile = pServerConn->OpenRequest(nverb,sObject,NULL,1,NULL,NULL,dwInetFlags);

dwInetFlagsという変数にHTTPSで必要なパラメータを設定しています。
"INTERNET_FLAG_IGNORE_CERT_DATE_INVALID"と、
"INTERNET_FLAG_IGNORE_CERT_CN_INVALID"の2つは、証明書に関する警告を無視するフラグです。テスト環境等で必要な場合は指定します。

あとのリクエスト送信の処理は、HTTPとHTTPSで同じです。レスポンスを受け取る処理も同じです。

私の場合ですが、以上のような処理をしています。参考になればと思います。

参考サイト
MSDN WinInetの基礎
MSDN Win32 インターネット拡張機能 (WinInet)
MSDN CInternetSessionクラス(MFC)
MSDN CHttpConnectionクラス(MFC)
MSDN CHttpFileクラス(MFC)