Crypt-SSLeay-0.45 > Crypt::SSLeay

名前

  Crypt::SSLeay - LWP httpsサポートを提供するOpenSSLとのつなぎ部分

概要

  lwp-request https://www.nodeworks.com

  use LWP::UserAgent;
  my $ua = new LWP::UserAgent;
  my $req = new HTTP::Request('GET', 'https://www.nodeworks.com');
  my $res = $ua->request($req);
  print $res->code."\n";

  # PROXYのサポート
  $ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port';

  # PROXY_BASIC_AUTH
  $ENV{HTTPS_PROXY_USERNAME} = 'username';
  $ENV{HTTPS_PROXY_PASSWORD} = 'password';  

  # デフォルトのSSLバージョン
  $ENV{HTTPS_VERSION} = '3';

  # クライアント側の証明書サポート
  $ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
  $ENV{HTTPS_KEY_FILE}  = 'certs/notacakeynopass.pem';

  # 認証局証明書の相手側認証 (CA CERT PEER VERIFICATION)
  $ENV{HTTPS_CA_FILE}   = 'certs/ca-bundle.crt';
  $ENV{HTTPS_CA_DIR}    = 'certs/';

  # クライアントPKCS12形式証明書サポート
  $ENV{HTTPS_PKCS12_FILE}     = 'certs/pkcs12.pkcs12';
  $ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';

説明

このperlモジュールはLWPの下でhttpsプロトコルのサポートを提供します。 これによりLWP::UserAgentがhttps GETとHEADリクエストを行うことができます。 POSTリクエストについてのさらなる情報についてはperldoc LWPを ご覧ください。

Crypt::SSLeayパッケージにはNet::SSLが入っています。 これはhttpsリクエストへのLWP::Protocol::httpsにより自動的にロードされ、 以下の廃れてしまったモジュールを介して機能する代りに必要なSSLとの つなぎを提供します:

   Crypt::SSLeay::CTX
   Crypt::SSLeay::Conn
   Crypt::SSLeay::X509

Crypt::SSLeayでの機能はLWP-libwww perl ライブラリへのhttpsサポートを 提供することのみを続けます。perlからOpenSS LAPIにアクセスしたければ、 Sampo氏のNet::SSLeayをチェックしてください。

インストール

OpenSSL

このモジュールをコンパイルする前にOpenSSLまたはSSLeayをインストール しておく必要があります。最新のOpenSSLパッケージは以下から取得できます:

  http://www.openssl.org

opensslをインストールするとき、以下のようなconfigを確実に行ってください:

  > ./config --openssldir=/usr/local/openssl
 あるいは
  > ./config --openssldir=/usr/local/ssl

 そして
  > make
  > make test
  > make install

こうして、Crypt::SSLeayはインクルードとライブラリを自動的に取り出します。 もしインクルードが/usr/local/includeのように別のディレクトリにいって しまったら、/usr/local/includeへのシンボリック・リンク /usr/local/openssl/includeが 必要になります。

Crypt::SSLeay

最新のCrypt::SSLeay は近くのCPANまたは以下のサイトにあります:

  http://www.perl.com/CPAN-local/modules/by-module/Crypt/

一度ダウンロードしてしまえば、Crypt::SSLeay は以下のようなmakeやnmakeコマンドを 使うことによって簡単にインストールします:

  > perl Makefile.PL
  > make
  > make test
  > make install

  * use nmake for win32

  !!! Win32ユーザへの注意、ほとんどの人がそのプラットホームで
  W  Crypt::SSLeayをビルドできないようです。ActiveStateがあなたの
  I  代わりにコンパイルしてくれているので、build618と522でppm
  N  でインストールするために利用することができます。
  3  最新のビルドでもつかうことができるでしょう。
  2  キーワード: WinNT, Win95, Win98, 95, 98, NT, 2000
  !!!          http://www.activestate.com/ をご覧ください。

PROXYサポート

LWP::UserAgentとCrypt::SSLeayはそれぞれ独自にプロキシーを サポートしています。あなたに合ったセクションを読んでください。

LWP::UserAgentのサポート

LWP::UserAgentはあなたのために機能するかもしれないプロキシーを 行う、独自のメソッドを持っています。そしてCrypt::SSLeayの プロキシー・サポートとは互換性があまりありません。 LWP::UserAgentのプロキシー・サポートを使うためには、以下のように 試してみてください:

  my $ua = new LWP::UserAgent;
  $ua->proxy([qw( https http )], "$proxy_ip:$proxy_port");

これを書いている辞典では、libwww v5.6はApache mod_proxyサーバーで うまくhttpsリクエストをプロキシーしているようです。それは 以下のような行をプロキシーサーバーに送信します:

  GET https://www.nodeworks.com HTTP/1.1

これはいくつかのプロキシーが予測しているCONNECTリクエストでは ありません。そのためmod_proxy以外の別のproxyサーバーでは 動かないかもしれません。CONNECTメソッドはCrypt::SSLeayの内部の proxyサポートにより使われます。

Crypt::SSLeayのProxyサポート

httpsリクエストのネイティブなCrypt::SSLeay proxのProxyサポートの ために、環境変数HTTPS_PROXYを、あなたのproxyサーバーとポートに 設定する必要があります。以下のようにしてください:

  # PROXY SUPPORT
  $ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port';
  $ENV{HTTPS_PROXY} = '127.0.0.1:8080';

このようにしてHTTPS_PROXY環境変数を使うことは、 LWP::UserAgent->env_proxy()の利用方法に似ています。しかし そのメソッドを呼び出すことは、Crypt::SSLeayのサポートを オーバーライドしたり、壊したりしかねません。両方を 一緒にしないでください。

PROXYサーバーへの基本認証の信用情報(=credential)は以下のようにして 提供されます:

  # PROXY_BASIC_AUTH
  $ENV{HTTPS_PROXY_USERNAME} = 'username';
  $ENV{HTTPS_PROXY_PASSWORD} = 'password';  

Crypt::SSLeayのネイティブなPROXYサポートが入ったLWPのスクリプトの 例については、Crypt::SSLeayディストリビューションの中の./lwp-ssl-test スクリプトのソースをご覧ください。

クライアント証明書のサポート

Tobias Mantheyからのパッチによって、証明書のサポート新しく提供されています。 .25ではALPHAですが、.29では非常に安定しているようです。

PEM形式の証明書と秘密鍵ファイルは以下のように使うことができます:

  $ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
  $ENV{HTTPS_KEY_FILE}  = 'certs/notacakeynopass.pem';

以下のようなコマンドによって./net_ssl_testプログラムで あなたのファイルをテストすることができます:

  ./net_ssl_test -cert=certs/notacacert.pem -key=certs/notacakeynopass.pem -d GET $HOST_NAME

さらに、クライアントにどこにCAファイルがあるかを教えたければ、 これらを設定することができます。これらの*CA*の設定は バージョン0.29ではALPHAです。

  $ENV{HTTPS_CA_FILE} = "some_file";
  $ENV{HTTPS_CA_DIR}  = "some_dir";

現時点ではテストのための、CA証明書ファイルについては何も サンプルはありません。しかし-CAファイル オプションで、あなたの CA証明書を使うように./net_ssl_testを設定することができます。

テスト証明書の作成

opensslで簡単なテスト照明を作成するためには、以下のようにすることができます:

     /usr/local/openssl/bin/openssl req -config /usr/local/openssl/openssl.cnf -new -days 365 -newkey rsa:1024 -x509 -keyout notacakey.pem -out notacacert.pem 

鍵ファイルからパスフレーズを削除するためには、以下のように実行してください: /usr/local/openssl/bin/openssl rsa -in notacakey.pem -out notacakeynopass.pem

PKCS12

バージョン0.45では新たにPKCS12証明書をサポートしています。 Daisuke Kurodaに感謝します。これらの証明書を使えるようにするための 命令は以下の通りです:

  $ENV{HTTPS_PKCS12_FILE}     = 'certs/pkcs12.pkcs12';
  $ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';

このタイプの証明書を使うためことは、説明した前の証明書設定よりも 優先されます。

SSLのバージョン

Crypt::SSLeayは、バグが多い、古い、あるいは単に標準に合っていない サーバーも面倒見ることにより、全てのSSL Webサーバーに接続しようと 努力しています。その結果、このモジュールはSSLの接続を以下の順番で 試みます:

  SSL v23  - 一番よいタイプを選ぶためv2とv3のサーバーを許可するはずです
  SSL v3   - 一番よい接続タイプ
  SSL v2   - 古い接続タイプ

残念ながら、SSL v23で試してみて接続が失敗するとSSL v3での再接続を 扱わないものもあるようです。そこで最初にSSL v3接続が試されるよう LWPやNet::SSLを使う前に以下のように設定することができます:

  $ENV{HTTPS_VERSION} = 3;

この時点では、試す順序は、この設定によって変更されないので、 この後はSSL v2接続だけが試されます。

互換性

このモジュールは以下のプラットフォームでコンパイルされています:

 PLATFORM   CPU     SSL     PERL     VER    DATE        WHO
 --------   ---     ---     ----     ---    ----        ---
 WinNT SP6  x86 OpenSSL 0.9.6a  5.00601  .45    2002-08-01  Joshua Chamas
 Linux 2.4.7    x86 OpenSSL 0.9.6d  5.00800  .45    2002-08-01  Joshua Chamas
 Linux 2.4.7    x86 OpenSSL 0.9.6   5.00601  .39    2002-06-23  Joshua Chamas
 Solaris 2.8    Sparc   ?       5.00503  .37    2002-05-31  Christopher Biow
 OpenBSD 2.8    Sparc   ?       5.00600  .25    2001-04-11  Tim Ayers
 Linux 2.2.14   x86 OpenSSL 0.9.6   5.00503  .25    2001-04-10  Joshua Chamas
 WinNT SP6  x86 OpenSSL 0.9.4   5.00404  .25    2001-04-10  Joshua Chamas
 Solaris 2.7    Sparc   OpenSSL 0.9.6   5.00503  .22    2001-03-01      Dave Paris
 AIX 4.3.2  RS/6000 OpenSSL 0.9.6   5.6.0    .19    2001-01-08  Peter Heimann
 Solaris 2.6    x86 OpenSSL 0.9.5a  5.00501  .17    2000-09-04  Joshua Chamas
 Linux 2.2.12   x86     OpenSSL 0.9.5a  5.00503  .16    2000-07-13      David Harris
 FreeBSD 3.2    ?x86    OpenSSL 0.9.2b  5.00503  ?      1999-09-29  Rip Toren
 Solaris 2.6    ?Sparc  OpenSSL 0.9.4   5.00404  ?      1999-08-24  Patrick Killelea
 FreeBSD 2.2.5  x86 OpenSSL 0.9.3   5.00404  ?      1999-08-19  Andy Lee
 Solaris 2.5.1  USparc  OpenSSL 0.9.4   5.00503  ?      1999-08-18  Marek Rouchal
 Solaris 2.6    x86 SSLeay 0.8.0    5.00501  ?      1999-08-12  Joshua Chamas
 Linux 2.2.10   x86     OpenSSL 0.9.4   5.00503  ?      1999-08-11  John Barrett
 WinNT SP4  x86 SSLeay 0.9.2    5.00404  ?      1999-08-10  Joshua Chamas

ビルド時の注意

Win32, WinNT, Win2000, ビルドできない

Windowsマシンでビルドすることができなければ、 ActiveState perlを試してみてください。少なくとも Build522と618は利用できるCrypt::SSLeayのppmインストールを 持っています。さらに詳細な情報については、 http://www.activestate.com をご覧ください。

AIX 4.3.2 - Symbol Error: __umoddi3 : referenced symbol not found

gccでコンパイルときには、__umoddi3 問題が、ここでも当てはまります。

代わりの解決法: Makefile.PLの中で、-L/usr/local/<path to your gcc lib>/<version>を $LIBSの値に入れてください。82行目の後に以下の行を追加してください:

 $LIBS = '-L' . dirname(`gcc -print-libgcc-file-name`) . ' ' . $LIBS;

Solaris x86 - Symbol Error: __umoddi3 : referenced symbol not found

 問題:

Solaris x86では、デフォルトのPERL構成設定と、perferrredはgccではなくOSに ついてくるldリンカを使います。残念なことにOpenSSLのビルド処理の中で、 gccはbn_word.cからlibcrypto.aに未定義のシンボル_umoddi3を生成します。 これはgccによりlibgcc.aから後から解決されるように考えられています。

システムldリンカはデフォルトではlibgcc.aについて知りません。 そのためCrypt::SSLeayを構築すると、_umoddi3についてのリンカーエラーが 起こります。

 解決法:

この解決法はシステム・リンカー ldがCrypt::SSLeayをビルドするときに 見つけられるように、/usr/local/libのような標準ディレクトリへlibgcc.aを シンボリック・リンクすることです。

FreeBSD 2.x.x / Solaris - ... des.h:96 #error _ is defined ...

"...des.h:96: #error _ is defined, but some strange definition the DES library cannot handle that...,"というエラーに出会ったら、des.hファイルを 編集し、"#error"行をコメント・アウトする必要があります。

他のオペレーティング・システムにも共通であるかのように見えます。 そしてそれはOpenSSL 0.9.3で発生します。0.9.4にアップグレードすると、 この問題は修正されるようです。

SunOS 4.1.4, Perl 5.004_04 - ld.so: Undefined symbol: _CRYPT_mem_ctrl

問題: (最初のビルドは問題ないけれども、Perlスクリプトの実行に問題があります) "ld.so: Undefined symbol: _CRYPT_mem_ctrl"というメッセージが出ます。

解決方法:Makefileで、"-fpic"が入っている業をコメントアウト してください("-fPIC"に変更してもみてください。これも 動きます。どちらがいいのかよくわかりません)。

メモ(NOTES)

このモジュールを最初に、そしてperlのためのlibwwwも含めて たくさんのものを書いたことをGisle Aasに感謝します。 Webは今までと同じではなくなるでしょう :)

Ben Laurieは素晴らしいエラー処理、SSL情報の検査、 そして乱数の種についての、彼の素晴らしいパッチに よって賞賛されるに値します。

James Woodyattは、多くのCrypt::SSLeayユーザを苦しめてきた 馬鹿げたメモリー・リークを見つけるチャンピオンです。

pryxyサポートを追加するパッチについて、Bryan Hartに感謝します。 そして別のアプローチを提供してくれたTobias Mantheyに感謝します。

Alpha linux ccc パッチについてAlex Rhombergに感謝します。

クライアント証明書サポートのパッチについてTobias Mantheyに 感謝します。

CA証明書サポートとエラー・メッセージのへの洞察について Gamid Isayevに感謝します。

CA証明書 SSLClientVerify問題について働いてくれたJeff Longに 感謝します。

perl 5.8.0でのビルドのためのパッチに対してChip Turnerに感謝します。

サポート

OpenSSLとCrypt::SSLeayのサポートはopensslユーザ・メーリングリストに メールしてください:[email protected]

そのリストへ少なくとも件名の行にCrypt::SSLeayが入っている メールは、私自身によってより早く応答されるでしょう。 件名は以下のように情報が多くしてください:

  Subject: [Crypt::SSLeay] compile problems on Solaris

このモジュールは始めGisle Aasによって書かれました。 そして今は私が管理しています。

著作権(COPYRIGHT)

 Copyright (c) 1999-2002 Joshua Chamas.
 Copyright (c) 1998 Gisle Aas.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.