WinHTTP 5.1 の新機能
このトピックでは、WinHTTP バージョン 5.1 とバージョン 5.0 の最も重要な違いについて説明します。 これらの違いの多くは、バージョン 5.0 からバージョン 5.1 に移行するアプリケーションのコード変更を必要とします。 バージョン 5.1 の一部の機能、特に悪意のある Web サーバーに対するクライアントのセキュリティ強化に関連する機能は、Windows Server 2003 および Windows XP Service Pack 2 (SP2) 以降でのみ使用できます。
重要
WinHTTP バージョン 5.1 のリリースに伴い、WinHTTP 5.0 のダウンロードは使用できなくなりました。 2004 年 10 月 1 日の時点で、Microsoft は WinHTTP 5.0 SDK のダウンロードを削除し、バージョン 5.0 の製品サポートを終了しています。
DLL 名の変更
新しい WinHTTP 5.1 DLL の名前は Winhttp.dll で、WinHTTP 5.0 DLL の名前は Winhttp5.dll になります。
WinHTTP 5.0 と 5.1 は同じシステム上で共存できます。WinHTTP 5.1 は WinHTTP 5.0 を置き換えたり、WinHTTP 5.0 の上にインストールされたりすることはありません。
再配布
WinHTTP 5.1 は、Windows Server 2003、Windows 2000 Professional Service Pack 3 (SP3)、Windows XP Service Pack 1 (SP1)、およびそれ以降のオペレーティング システムでのみ使用できます。 再配布可能なマージ モジュール (.msm) ファイルは WinHTTP 5.1 では使用できません。
WinHttpRequest ProgID
WinHttpRequest コンポーネントの ProgID が "WinHttp.WinHttpRequest.5" から "WinHttp.WinHttpRequest.5.1" に変更されました。 WinHttpRequest クラスの CLSID も変更されました。
非同期コールバック動作の変更
非同期モードで、WinHttpWriteData 関数、WinHttpQueryDataAvailable 関数、および WinHttpReadData 関数を呼び出す場合は、設定される lpdwNumberOfBytesWritten、lpdwNumberOfBytesAvailable、および lpdwNumberOfBytesRead というそれぞれの OUT パラメーターに依存しないでください。 関数の呼び出しが非同期に完了した場合、WinHTTP はアプリケーション コードによって提供されるこれらのポインターに書き込みを行いません。 代わりに、コールバック関数に対して lpvStatusInformation パラメーターと dwStatusInformationLength パラメーターを使用し、アプリケーションでこれらの値を取得する必要があります。
既定の設定への変更
既定の設定に対する変更は次のとおりです。
- WinHTTP 5.1 では、SSL サーバー証明書の検証が既定で有効になっています。 WinHTTP 5.0 は、サーバー証明書の検証時に発生した障害を致命的なエラーとして処理しません。これらの障害は、SECURE_FAILURE コールバック通知を使用してアプリケーションに報告されますが、要求が中止されることはありません。 一方、WinHTTP 5.1 では、サーバー証明書の検証の失敗を、要求を中止する致命的なエラーとして処理します。 アプリケーションは、WINHTTP_OPTION_SECURITY_FLAGS オプションを使用して、不明な CA、無効/期限切れの証明書の日付、無効な証明書のサブジェクト名など、証明書エラーの一部を無視するように WinHTTP に指示できます。
- WinHTTP 5.1 では、Passport 認証のサポートは既定で無効になっています。 Passport サポートは、WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH オプションを使用して有効にすることができます。 キーリングでの Passport 資格情報の自動検索も、既定では無効になっています。
- リダイレクト動作の変更: セキュリティで保護された https: URL から通常の http: URL への HTTP リダイレクトは、セキュリティ上の理由から、既定では自動的に実行されなくなりました。 WinHTTP 5.1 の既定のリダイレクト動作をオーバーライドする新しいオプション (WINHTTP_OPTION_REDIRECT_POLICY) があります。 WinHttpRequest COM コンポーネントでは、新しい WinHttpRequestOption_EnableHttpsToHttpRedirects オプションを使用して、https: URL から http: URL へのリダイレクトを有効にします。
- WinHTTP トレース ファイルが作成されると、ACL によってアクセスは制限され、管理者のみがファイルの読み取りまたは書き込みを行うことができるようになります。 トレースファイルが作成されたユーザー アカウントは、ACL を変更して他のユーザーにアクセス権を付与することもできます。 この保護は、セキュリティがサポートされているファイル システム (つまり、FAT 32 ではなく、NTFS) でのみ使用できます。
- Windows Server 2003 および WINDOWS XP SP2 以降、21 (FTP)、25 (SMTP)、70 (GOPHER)、110 (POP3)、119 (NNTP)、143 (IMAP) など、HTTP 以外の既知のポートに要求を送信することは、セキュリティ上の理由から制限されます。
- Windows Server 2003 および Windows XP SP2 以降、WinHTTP が 1 回の HTTP 応答で受け入れるヘッダー データの最大量は、既定で 64K です。 サーバー HTTP 応答に含まれるヘッダー データの合計が 64K を超えると、ERROR_WINHTTP_INVALID_SERVER_RESPONSE エラーにより、WinHTTP は要求に失敗します。 この 64K の制限は、新しい WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE オプションを使用してオーバーライドできます。
IPv6 サポート
WinHTTP 5.1 では、インターネット プロトコル バージョン 6 (IPv6) のサポートが追加されました。 WinHTTP は、DNS 名が IPv6 アドレスに解決されるサーバーに HTTP 要求を送信できます。また、Windows Server 2003 および Windows XP SP2 以降、WinHTTP では IPv6 リテラル アドレスもサポートされます。
WinHTTP 用 C/C++ API の新しいオプション
WinHTTP 5.1 には、次の新しいオプションが実装されています。
- "\#define WINHTTP\_OPTION\_PASSPORT\_SIGN\_OUT 86" "\#define WINHTTP\_OPTION\_PASSPORT\_RETURN\_URL 87" "\#define WINHTTP\_OPTION\_REDIRECT\_POLICY 88"
Windows Server 2003 および Windows XP SP2 以降、WinHTTP 5.1 では次の新しいオプションが実装されています。 ただし、Windows 2000 Professional SP3 または Windows XP SP1 では、次の オプション ID を使用した WinHttpSetOption または WinHttpQueryOption の呼び出しは失敗します。
- "\#define WINHTTP\_OPTION\_RECEIVE\_RESPONSE\_TIMEOUT 7" "\#define WINHTTP\_OPTION\_MAX\_HTTP\_AUTOMATIC\_REDIRECTS 89" "\#define WINHTTP\_OPTION\_MAX\_HTTP\_STATUS\_CONTINUE 90" "\#define WINHTTP\_OPTION\_MAX\_RESPONSE\_HEADER\_SIZE 91" "\#define WINHTTP\_OPTION\_MAX\_RESPONSE\_DRAIN\_SIZE 92"
WinHttpRequest 5.1 コンポーネントの新しいオプション
WinHttpRequest 5.1 コンポーネントには、次の新しいオプションが実装されています。
- "WinHttpRequestOption\_RevertImpersonationOverSsl" "WinHttpRequestOption\_EnableHttpsToHttpRedirects" "WinHttpRequestOption\_EnablePassportAuthentication"
Windows Server 2003 および Windows XP SP2 以降、次の新しい WinHttpRequest 5.1 オプションを使用できます。
- "WinHttpRequestOption\_MaxAutomaticRedirects" "WinHttpRequestOption\_MaxResponseHeaderSize" "WinHttpRequestOption\_MaxResponseDrainSize" "WinHttpRequestOptions\_EnableHttp1\_1"
自動ログオンのセキュリティが "高" に設定されている場合、プロキシは信頼できません
WinHTTP 5.0 では、プロキシ サーバーは自動ログオンに対して常に信頼されます。 WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH ポリシー オプションが設定されている場合、Windows Server 2003 および Windows XP SP2 で実行されている WinHTTP 5.1 では、これが有効ではなくなりました。
Web プロキシ自動検出 (AutoProxy) API
WinHTTP ベースのアプリケーションのプロキシ設定の構成を容易にするために、WinHTTP では Web プロキシ自動検出 (WPAD) プロトコル (autoproxy とも呼ばれる) が実装されるようになりました。 これは、エンドユーザーがプロキシ サーバーを手動で指定しなくてもプロキシ構成が自動的に検出されるように、Internet Explorer などの Web ブラウザーで実装されるプロトコルと同じです。 自動プロキシをサポートするために、WinHTTP 5.1 では、新しい C/C++ 関数の WinHttpGetProxyForUrl に加えて、2 つのサポート関数 (WinHttpDetectAutoProxyConfigUrl と WinHttpGetIEProxyConfigForCurrentUser) が実装されています。
既知の問題
Windows 2000 Professional SP3 および Windows XP SP1 の WinHTTP 5.1 には、次の既知の問題が存在しています。 これらの問題は、Windows Server 2003 および Windows XP SP2 以降の WinHTTP では解決されています。
- アプリケーションが WinHttpRequest コンポーネントで WinHttpSetTimeouts 関数または SetTimeouts メソッドを使用して、dwResolveTimeout パラメータなどの有限の DNS 解決タイムアウトを設定すると、WinHTTP が DNS 名を解決するたびにスレッド ハンドル リークが発生します。 大量の HTTP リクエストが発生すると、重大なメモリ リークが発生します。 回避策としては、デフォルトの無限解決タイムアウト設定を変更しないでおくことです (値 0 は無限のタイムアウトを指定します)。 WinHTTP での DNS 名前解決タイムアウトのサポートはパフォーマンスの観点からコストがかかるため、いずれの場合もこれを強くお勧めします。 Windows 2000 以降では、基になる DNS クライアント サービスが独自の解決タイムアウトを実装しているため、WinHTTP で DNS 解決タイムアウトを設定する必要はありません。
- 非同期要求を処理する場合、WinHTTP ではスレッドの偽装は適切に処理されません。 このため、WinHttpSetCredentials 関数または WinHttpSetOption 関数を使用して資格情報が明示的に指定されていない限り、NTLM/ネゴシエート認証を必要とする要求は失敗します。