--- title: Gauche で HTTPS 接続を行う author: kazu634 date: 2010-12-23 url: /2010/12/23/_1643/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:5399;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche ---

背景

Gauche 0.9.1 (2010.12.11リリース)から HTTPS 接続が行えるようになりました。今回、 HTTPS 接続を行う必要性に迫られたので、 Gauche で HTTPS 接続を試みてみました。

なお、unix限定とありますが、Mac (Snow Leopard) でも動作したことを付け加えておきます。

Gauche の HTTPS 接続の前提条件

リリース時の説明には次のように記載されています:

rfc.httpモジュールがhttpsコネクションをサポートします (今のところunix限定)。 コネクション自体は外部プログラム(stunnel) に依存します。

Gauche – A Scheme Implementation

Gauche の Info にはこんな説明が:

Currently Gauche relies on an external program `stunnel' (either
version 3 or 4) to handle secure connections.  So when you request a
secure connection, Gauche looks for `stunnel' program in `PATH'.  On
some systems a newer version of it is called `stunnel4', and Gauche
looks for it, too.  If you want to add certificates, for example, you
have to adjust `stunnel' settings.
A plan is to provide the means of secure connections as long as
`stunnel', including native SSL support, and the higher-level library
automatically choose whatever is available and best.
Use the following procedure to check if you can use secure
connections:
-- Function: http-secure-connection-available?
Returns `#t' if running Gauche can use secure connection, `#f'
otherwise.

手っ取り早く言えば、

  1. stunnel を使って HTTPS 接続を実現しているから、 PATH が通っているところに stunnel を設置する
  2. HTTPS 接続を行えるかどうかは、(http-secure-connection-available?) の戻り値で判定できる

stunnelとは?

不勉強で、stunnelを知らなかったので、調べてみました:

Stunnel は、フリーなマルチプラットフォーム対応のプログラムであり、汎用TLS/SSLトンネリングサービスを提供する。

Stunnel は、TLSやSSLにネイティブで対応していないクライアントサーバシステムに安全な暗号化されたコネクションを提供するのに利用できる。各種オペレーティングシステム上で動作し、ほとんどのUnix系OSとWindowsでも動作する。TLSまたはSSLプロトコルの実装にはOpenSSLやSSLeayなどのライブラリが別途必要である。

Stunnel はSSLコネクションにX.509公開鍵証明書を使った公開鍵暗号を使っている。クライアントもオプションとして証明書で認証できる。

Stunnel – Wikipedia

HTTPS 接続を行うためのコネクションを提供するプログラムのようです。知らなかった。

stunnel のインストール

Macでパッケージ管理に Homebrew を用いているので、Homebrew で stunnel を導入してみました。 MacPorts を使っている人は MacPorts に読み替えてください。

kazu634@kazu634% brew search stunnel                                                                              ~/working/tmp_lisp/foursquare [448]
stunnel
kazu634@kazu634% brew install stunnel                                                                             ~/working/tmp_lisp/foursquare [449]
==> Downloading http://www.stunnel.org/download/stunnel/src/stunnel-4.33.tar.gz
######################################################################## 100.0%
==> Downloading patches
==> Patching
patching file tools/stunnel.cnf
==> ./configure --disable-dependency-tracking --disable-libwrap --prefix=/usr/local/Cellar/stunnel/4.33 --sysconfdir=/usr/local/etc
==> make install
==> Caveats
A bogus SSL server certificate has been installed to:
/usr/local/etc/stunnel/stunnel.pem
This certificate will be used by default unless a config file says
otherwise!
In your stunnel configuration, specify a SSL certificate with
the "cert =" option for each service.
==> Summary
/usr/local/Cellar/stunnel/4.33: 33 files, 492K, built in 16 seconds
kazu634@kazu634% which stunnel                                                                                    ~/working/tmp_lisp/foursquare [450]
/usr/local/bin/stunnel

使ってみる

この時点で使えるか、試してみました:

gosh> (http-secure-connection-available?)
#t

なんか使える雰囲気です。そこで、 Foursquare の API にアクセスしてみることにしました。基本的には、 http-get に secureキーワードを指定し、 #t にします。こんな感じ:

gosh> (receive (status header body)
(http-get "api.foursquare.com"
(string-append
"/v2/users/self/checkins?oauth_token="
"私の oauth_token ")
:secure #t)
;;;                 ~~~~~~~~~~~
(print status))
200
#<undef>

ステータスコード 200 はアクセス成功という意味なので、アクセスできています!やった!