【実務・中級編】【明示的TLS 1.2/1.3通信】WinHttp.WinHttpRequest.5.1 の SecureProtocols 設定による安全なWeb API接続 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを現代の盾にする:WinHttpRequestでTLS 1.2/1.3を強制し、レガシーの呪縛を解く

現場でVBScript(WSH)を使っていると、必ず突き当たる壁がある。それは「HTTPS接続の拒絶」だ。
「昔は動いていたコードが、突然 `The connection with the server was terminated abnormally` を吐いて死ぬ」。原因は明白だ。サーバー側がレガシーなTLS 1.0/1.1を切り捨て、現代の標準であるTLS 1.2/1.3への完全移行を果たしたからである。

OSのレジストリをいじってシステム全体の設定を変えるのはリスクが高すぎる。我々アーキテクトがやるべきは、「スクリプトの実行コンテキスト内で、必要な通信プロトコルだけを明示的に制御する」ことだ。

今日は、`WinHttp.WinHttpRequest.5.1` を手懐け、現代のWeb APIと対話するための「極限の定石」を授ける。

1. なぜ「デフォルト」を信じてはいけないのか

VBScriptの `WinHttpRequest` オブジェクトは、デフォルトではOSが提供する「最も広範な互換性」を維持しようとする。これが罠だ。セキュリティ強度が低い暗号化方式を選択し、サーバーから門前払いされる。

我々が操作すべきは `Option` プロパティの `WinHttpRequestOption_SecureProtocols` (定数: 9) だ。ここにビットマスク値を渡すことで、特定のTLSバージョンを強制できる。

制御用ビットマスク定数

  • `&h00000800` : TLS 1.2
  • `&h00002000` : TLS 1.3 (OSの対応状況に依存)

これらを加算して指定することで、古いプロトコルを完全にシャットアウトし、安全なトンネルを構築する。

2. 実装の極意:堅牢なプロダクションコード

単に接続するだけでは素人だ。タイムアウト設定、エラーハンドリング、そしてリソース開放までを考慮した「プロダクション品質」のコードをここに提示する。

‘ WinHttpRequest.5.1 を利用した堅牢なHTTPS接続
Option Explicit

Function SecureWebRequest(url, payload)
Dim http: Set http = CreateObject(“WinHttp.WinHttpRequest.5.1”)

‘ 【重要】TLS 1.2 (0x800) + TLS 1.3 (0x2000) = 0x2800 を強制
‘ これにより、プロトコルネゴシエーションの失敗を未然に防ぐ
Const WinHttpRequestOption_SecureProtocols = 9
Const SecureProtocol_TLS1_2 = &h00000800
Const SecureProtocol_TLS1_3 = &h00002000

On Error Resume Next

‘ タイムアウトは必須:無限待ちによるプロセスハングを防ぐ
http.SetTimeouts 5000, 10000, 10000, 10000

http.Open “POST”, url, False
http.Option(WinHttpRequestOption_SecureProtocols) = SecureProtocol_TLS1_2 Or SecureProtocol_TLS1_3

http.SetRequestHeader “Content-Type”, “application/json”
http.Send payload

If Err.Number <> 0 Then
WScript.Echo “通信エラー: ” & Err.Description
Set http = Nothing
Exit Function
End If

‘ ステータスコードの確認は必須
If http.Status = 200 Then
SecureWebRequest = http.ResponseText
Else
WScript.Echo “APIエラー: ” & http.Status & ” – ” & http.StatusText
SecureWebRequest = “”
End If

Set http = Nothing
On Error GoTo 0
End Function

‘ 使用例
Dim result
result = SecureWebRequest(“https://api.example.com/v1/data”, “{“”key””:””value””}”)
If result <> “” Then WScript.Echo “成功: ” & result

3. アーキテクトからの忠告

ファイル・DB連携時の注意点

WSH環境でファイルI/OやDB接続を行う際、このWeb APIのレスポンスを直接書き込むのはやめろ。必ず「一旦メモリ上の変数でバリデーションし、JSONならパース(または簡易置換)してから」書き込むこと。
VBScriptには強力なJSONパーサーがないため、複雑な構造を扱う場合は `ScriptControl` を使って `JSON.parse` をエミュレートするか、あるいは正規表現でキーを抽出する設計に留めるのが、後の保守担当者のためだ。

リソースの死に際を意識せよ

`Set http = Nothing` を忘れるな。VBScriptのガベージコレクションは優秀とは言えない。特にループ処理の中でこの関数を呼ぶ場合、メモリリークは確実にシステムを停止させる。`Set = Nothing` は、エンジニアの「礼儀」である。

なぜ「今さら」VBScriptなのか

「PythonやPowerShellを使えばいい」という声が聞こえてくる。しかし、現場には「環境構築権限がない」「セキュリティポリシーで.NET実行が制限されている」という不可避な状況が往々にしてある。
そんな窮地で、標準搭載されているVBScriptを使いこなし、最新のTLS通信を通す。これこそが、限られたリソースで最大限の成果を出す「業務自動化エンジニア」の矜持だ。

このコードは、君の現場の「接続失敗」という名のブラックボックスを、光の当たる場所へ引きずり出すための鍵になる。使いこなせ。

タイトルとURLをコピーしました