― Web Technology and Life ―

PerlクライアントからProxy経由でhttps通信を行う方法

2013-09-04
ひょんなことからプロクシを通したHTTPS通信を行うことになったのでそのTipsを書いておきます。

Apacheを使ったフォワードプロクシの設定

だいたいのケースはすでに謎のプロクシがあって、いろんな理由でそいつを経由しないといけないというケースが多いと思いますが、今回はプロクシをたてることから始めなきゃいけなかったので、その設定をば。

ubuntu10.04ベースで書きますので、レッドハット系のほとんどの人は雰囲気だけとなりますが。。。

sudo a2enmod mod_proxy
sudo a2enmod mod_proxy_http
sudo a2enmod mod_proxy_connect
sudo a2enmod mod_ssl
sudo a2dissite default-ssl
sudo vi /etc/apache2/mods-available/proxy.conf #以下のように編集
sudo service apache2 restart

proxy.confの設定

<IfModule mod_proxy.c>
        #turning ProxyRequests on and allowing proxying from all may allow
        #spammers to use your proxy to send email.

        ProxyRequests On #フォードプロクシ

        <Proxy *>
                AddDefaultCharset off
                Order deny,allow
                Deny from all
                #さまざまなスパムの踏み台にならないように
        #特定のホストからのみアクセスできるように設定
        Allow from .example.com 
        </Proxy>

        # Enable/disable the handling of HTTP/1.1 "Via:" headers.
        # ("Full" adds the server version; "Block" removes all outgoing Via: headers)
        # Set to one of: Off | On | Full | Block
    #OFFにするステルスモードになってしまうので、その必要があるときは・・・
        ProxyVia On 
</IfModule>

要は、必要なモジュールを有効化して、SSLの既存のバーチャルホスト設定をクリアにするということですね。HTTPSをプロクシ通して行うことをSSLトンネリングというらしいですが、一件SSL証明書とかが必要そうなのですが、全く必要ありません。むしろ、既存の443ポート(httpsを行うポート、任意で設定すれば、8080とかでも可能、AllowCONNECTディレクティブを利用して443,567以外をhttpsのフォワードプロクシで使いたいときは指定する)におけるバーチャルホストの設定があると逆に動きません。。。

Perlでのクライアント実装

基本的に以下の参考URLを見ればいいと思いますが、なんかうまくいったやつうまくいかなかったやつがあるので一応メモしておきます。

僕は次のコードしか動きませんでした。

事前準備

LWP::UserAgent使うんですが、なんかいろいろうざいことが起きるので、以下のモジュールを入れたり、はずしたりしました。

cpanm LWP::Protocol::connect
cpanm IO::Socket::IP
cpanm App::pmuninstall
pm-uninstall IO::Socket::INET6

コード

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use LWP::UserAgent;

my $proxy = "232.11.21.24";

my $ua = LWP::UserAgent->new();
$ua->proxy('https', "connect://$proxy:443/");

my $res = $ua->get('https://twitter.com/');

非常に簡単ですね。ただ、上記の参考URLにあるような一般的なhttpのプロクシ設定と異なる方法なので、共存させるのがめんどいです。

最後に

とりあえず、LWP::UserAgent周りのモジュールというかクラスは、ごちゃごちゃして、ソース読むのも大変だし、便利なのはいんだけど、はまるとつらいっす・・・

Perl update_at : 2013-09-04T20:05:27
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus