pseudo-curl はあまりにも低機能かつ擬似的な curl コマンドです。
サーバの OpenSSL が古すぎて、curl が新しい TLS 対応をしていても libssl.so が古いために curl が新しい TLS をしゃべれない……という事態に遭遇して、そのサーバで使われる限定的な curl の使い方だけを満たすものをでっち上げるため、急場しのぎで初期バージョン v0.1 が作成されました。
curl コマンドでウェブサーバに HTTP アクセスするという外形監視を行っていた監視サーバがあったものの、昨今のセキュリティの流れでウェブサーバが対応する TLS を TLSv1.2 以上としたところ、監視ができなくなるという現象が私 (@xtetsuji) の周囲で起こりました。
察する通り、原因は監視サーバが古すぎて TLSv1.2 以上に対応していないということだったのですが、この解決のためには curl の問題だけでなく、その監視サーバの Linux OS にインストールされた OpenSSL つまり libssl.so の問題に向き合う必要もありました。パッケージシステムがある Linux ディストリビューションで OpenSSL を別に入れる面倒さ以前に、OS とディストリビューションのバージョンの何もかもが何世代も古く、OpenSSL のビルドを試みたとしても glibc のバージョンで躓く可能性すらありました。
ウェブサーバの変更は既に行ってしまい、監視対応を急ぐ必要があるということだったのですが、curl だけをシステム中の libssl.so に依存しない形で TLSv1.2 以上を解するものとしてたとえ限定的な機能であっても置き換えられれば問題が解決するのではと考え、 最新の TLS を処理可能なモノリシックな HTTPS クライアントの実行バイナリを作成することができるだろう Go で書いてみようというのが事の発端であり動機 です。
幸いなことに、監視サーバが要求する非常に限定的なコマンドライン呼び出しのみ対応することで、この作戦は上手くいきました。
良くないことであることは分かっていつつも、監視サーバは外部からアクセスされないからという理由で古い状態のままだったようですが、上記の策で急場をしのぎつつ近々新しいサーバに置き換わることでしょう。
後付けではありますが、Go 言語が提供する機能(今回は TLS 機能を含んだモノリシックな実行バイナリ生成)以外での解決が困難な問題に直面したことで、私 (@xtetsuji) 自身の Go 言語学習の動機付け にもなりました。
- このスクリプトは Go 言語への libcurl の binding や port の類ではありません
- たぶん andelf/go-curl: golang curl(libcurl) binding. あたりが求めるものでしょう
- 機能が限定された curl コマンドを Go および Go の net/http で書く試みは様々な場所で行われているようです
- 例えば Go言語の習作で「劣化curl」コマンドを作ってみた | Developers.IO あたりなどが検索してすぐに出てきます
- v0.1 は、上記の動機の節での監視サーバでの要望を満たす最小限のものを急いで書いたものです
- v0.2 以降では、Go 言語の学習の過程で機能が増えるかもしれません
- MIT
- OGATA Tetseuji @xtetsuji