Ruby-1.8.7_p160 openssl編

さて、続いてはopensslだ。まずは失敗したテスト結果を見てみよう。

  3) Failure:
test_client_auth(OpenSSL::TestSSL)
    [./openssl/test_ssl.rb:216:in `test_client_auth'
     ./openssl/test_ssl.rb:129:in `call'
     ./openssl/test_ssl.rb:129:in `start_server'
     ./openssl/test_ssl.rb:215:in `test_client_auth']:
<OpenSSL::SSL::SSLError> exception expected but was
Class: <Errno::ECONNRESET>
Message: <"\212\371\221\266\202\314\220\332\221\261\202\315\203\212\203\202\201[\203g \203z\203X\203g\202\311\213\255\220\247\22
3I\202\311\220\330\222f\202\263\202\352\202\334\202\265\202\275\201B - SSL_connect">
---Backtrace---
./openssl/test_ssl.rb:219:in `connect'
./openssl/test_ssl.rb:219:in `test_client_auth'
./openssl/test_ssl.rb:216:in `test_client_auth'
./openssl/test_ssl.rb:129:in `call'
./openssl/test_ssl.rb:129:in `start_server'
./openssl/test_ssl.rb:215:in `test_client_auth'
---------------

メッセージが化けていて全く読めないが、errno※に対応するクラスからして接続先からのリセット(接続の切断)だろう。

※WindowsのGetLastErrorと同じように直近で発生したエラーの情報に対応したクラス。これもUNIXでは当たり前だが、そのことが明記されていないことが多く(UNIXではerrnoは知ってて当たり前だから?)理解に苦しんだ部分だ。

取り敢えず最新のソースコードでビルドをし直してみよう。
OpenSSL for Windows

  • ActivePerlインストール

コンポーネントのConfigureとMakeにはperl実行モジュールが必要だ。いろいろあると思うがWindowsの場合はTcl同様にActiveStateのActivePerlをインストールしてしまうのが一番簡単だろう。
ActivePerl/ActiveState

インストールするとperlモジュールへのパスが通るので、perlスクリプトが実行可能になる。

  • configure

perlをインストールしたので早速Configureを実行する。オプションはREADMEを参考にして設定した。

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl Configure VC-WIN32 --prefix=e:\openssl -D_WIN32_WINNT=0x0600
Configuring for VC-WIN32
:
:
Configured for VC-WIN32.

Configureが終わればMakeFileを作成して実際にnmakeを実行するだけだ。

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>ms\do_ms

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl util\mkfiles.pl  1>MINFO

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl util\mk1mf.pl no-asm VC-WIN32  1>ms\nt.mak

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl util\mk1mf.pl dll no-asm VC-WIN32  1>ms\ntdll.mak
:
:
  • nmake実行

これもREADMEのまま。

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>nmake -f ms\ntdll.mak
:
:
        cl /Fotmp32dll\cversion.obj  -Iinc32 -Itmp32dll /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -D_WIN32_WINNT=0x0600 -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE -D_WINDLL  -DOPENSSL_BUILD_SHLIBCRYPTO -DMK1MF_BUILD -DMK1MF_PLATFORM_VC_WIN32 -c .\crypto\cversion.c
cversion.c
.\crypto\cversion.c(105) : error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
.\crypto\cversion.c(105) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。
NMAKE : fatal error U1077: '"D:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.

なんでコンパイルが通らないソースがあるんだ?? と憤りながらソースコードを見ると

  • cversion.c
const char *SSLeay_version(int t)
:
:
102   if (t == SSLEAY_DIR)
103     {
104 #ifdef OPENSSLDIR
105     return "OPENSSLDIR: \"" OPENSSLDIR "\"";
106 #else
107     return "OPENSSLDIR: N/A";
108 #endif
109     }

これか。Win32ではテストしていないのかな。取り敢えず以下のように修正して再コンパイル。

105     return "OPENSSLDIR: \" OPENSSLDIR \"";

それっ。

:
        cl /Fotmp32dll\x509_def.obj  -Iinc32 -Itmp32dll /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -D_WIN32_WINNT=0x0600 -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE -D_WINDLL  -DOPENSSL_BUILD_SHLIBCRYPTO -c .\crypto\x509\x509_def.c
x509_def.c
.\crypto\x509\x509_def.c(65) : error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
.\crypto\x509\x509_def.c(65) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。
.\crypto\x509\x509_def.c(68) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。
.\crypto\x509\x509_def.c(71) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。
.\crypto\x509\x509_def.c(74) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。
NMAKE : fatal error U1077: '"D:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.

またか。使用されているマクロを調べるとConfigureで作成したヘッダに問題があるようだ。

  • opensslconf.h
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
#define ENGINESDIR "e:\openssl/lib/engines"
#define OPENSSLDIR "e:\openssl/ssl"
#endif
#endif

よくあるWindowsとUNIXのファイルセパレータ問題か。Configure時の指定をし直して再実行。

E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl Configure VC-WIN32 --prefix=e:/openssl -D_WIN32_WINNT=0x0600
Configuring for VC-WIN32
:
Configured for VC-WIN32.

コンパイルが通ったのでインストールする。

nmake -f ms\ntdll.mak install

これでSxSでMSVCR80.DLLを参照するバイナリを含む成果物がe:\openssl下に出来た。

E:\OpenSSL
     |
     +---bin
     | libeay32.dll
     | openssl.exe
     | ssleay32.dll
     |
     +--include
     |   +-- openssl
     |   |ヘッダ群
     |   |
     | 
     +--lib
     | libeay32.lib
     | ssleay32.lib

さて、あとはいつも通り成果物をext\opensslディレクトリに置いてRubyの拡張ライブラリィをビルドしよう。
長くなったので、続きは次回。

Rubyを深く経験しようと思うほどRubyから離れていくのはなぜだろうな。