[ C++で開発 ]
OpenSSLは、Secure Socket Layer(略称:SSL)のv2/v3とTransport Layer Security(略称:TLS)のv1の実装です。Apacheライセンスで提供されています。
このページはです。これ以後の新しい情報はOpenSSL本家のページをご覧下さい。
OpenSSLはソース公開のソフトウェアなので、ソースコードを入手してビルドするのが基本となります。2009年4月30日現在Ver.0.9.8系列はリビジョンk、Ver.0.9.7系列はリビジョンm が最新です。
有志がソースをビルドしてバイナリを公開しています。
ビルド済みのバイナリパッケージが公開されています。
ビルドにはCコンパイラとアセンブラ、そしてPerlを使用します。アセンブラがない場合はCのコードが使われるので、必ずしもアセンブラは必要ではありませんが、処理速度が倍位遅くなります。対応しているコンパイラは次のとおりです。
アセンブラには、Microsoft Assembler(MASM)と、フリーのNetwide
Assembler(NASM)が使用できます。
MASMは、Visual Studioには同梱されています。それ以外のコンパイラを使用する場合は別途入手する必要があります。MASMは、WindowsのDDKに含まれているようです。masm32というフリーのものも入手できるようです。NASMはSourceForgeにホストされています。
0.9.8gは、Visual Studio .NET 2003搭載のMASM、MASM32を使ったコンパイルでエラーが発生します。SSE命令が認識されない模様です。なお、Visual
Studio 2008(ベータ2版)のMASMではビルドが通ります。また、NASMを使ったコンパイルは通ります。
から、Windows用バイナリを入手します。これを解凍して、nasmw.exeのあるディレクトリを環境変数PATHに追加します。
nasm v9の場合、nasmw.exeがなく、nasm.exeとなっています。このままではOpenSSLのビルドでnasmw.exeが見つからないためエラーとなるので、nasm.exeをnasmw.exeにコピーして対応します。
Microsoft Assemblerは現在DDKに含まれています。前は無償でダウンロードできたのですが、今はダウンロードはできなくなり、CDを注文する必要があります。なおCDの費用は無償で送料のみかかります。アメリカからになるので日本で注文すると$25です。DDKをインストールすると、コマンドの中にml.exeというアセンブラが含まれています。
インストール後、DDKをインストールしたディレクトリの中にあるbin\x86ディレクトリを環境変数PATHに追加します。
から、masm32v9.zipを入手します。これを解凍すると、INSTALL.EXEが現れるので、これを実行してインストールします。インストール後、MASM32の中のBINディレクトリを環境変数PATHに追加します。
ActivePerlがインストールされていなければ、まずActivePerlをインストールします。左上のDownloadのロゴをクリックすると登録ページになり、Register情報に何か入れて(入れなくても可)次へ進むとダウンロードページになります。2007年10月25日現在、Ver.5.8.8 build 822が最新です。
Cygwin環境を導入すると、Perlが利用可能になります。
OpenSSLソースを作業ディレクトリに展開後、Perlスクリプトを実行します。
F:\work\openssl-0.9.8g>perl Configure VC-WIN32 Configuring for VC-WIN32 : [中略] Configured for VC-WIN32. F:\work\openssl-0.9.8g>
アセンブラを使うか使わないかで実行するコマンドが変わります。アセンブラを使うと処理速度が速くなります。例えばRSAだと2倍違うとのことです。
ここではアセンブラとしてMASMを使っていきます。そこで、ms\do_masmを実行します。カレントディレクトリをmsに移動しない点に注意。
F:\work\openssl-0.9.8g>ms\do_masm : [中略] F:\work\openssl-0.9.8g>
VC++のnmakeによってビルドを実行するので、VC++コマンドライン環境の設定をしておきます。VC++に含まれている%ProgramFiles%\Microsoft
Visual Studio\VC98\Bin\VCVARS32.BATを実行すればコマンドライン環境が設定されます。
Windows DDKのパスがVC++のパスより前に設定されていると、cl.exeがVC++のものでなくDDKが呼ばれてしまうので、先にVC++のパスを置くようにする点に注意。
F:\work\openssl-0.9.8g>"%ProgramFiles%\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT" Setting environment for using Microsoft Visual C++ tools. F:\work\openssl-0.9.8g>
nmakeを実行します。DLL版(ms\ntdll.mak)とスタティックリンクライブラリ版(ms\nt.mak)と2つのmakefileが用意されています。普通はDLL版を使うことが多いでしょう。
F:\work\openssl-0.9.8g>nmake -f ms\ntdll.mak : [中略] F:\work\openssl-0.9.8g>
生成物(ライブラリ)をテストするコマンドが用意されています。実行後、passed all testsと表示されればOKと思われます。
F:\work\openssl-0.9.8g>cd out32dll F:\work\openssl-0.9.8g\out32dll>..\ms\test : [中略] passed all tests F:\work\openssl-0.9.8g\out32dll>
インクルードファイル、ライブラリファイル、実行コマンドファイル等をインストールしたい場所にコピーします。気の利いたインストーラなぞはないので、自力でコピーします。ここでは、d:\lib\opensslの中にコピーしていきます。
F:\work\openssl-0.9.8g\out32dll>cd .. F:\work\openssl-0.9.8g>md d:\lib\openssl F:\work\openssl-0.9.8g>md d:\lib\openssl\bin F:\work\openssl-0.9.8g>md d:\lib\openssl\lib F:\work\openssl-0.9.8g>md d:\lib\openssl\include F:\work\openssl-0.9.8g>md d:\lib\openssl\include\openssl F:\work\openssl-0.9.8g>copy /b inc32\openssl\* d:\lib\openssl\include\openssl F:\work\openssl-0.9.8g>copy /b out32dll\ssleay32.lib d:\lib\openssl\lib F:\work\openssl-0.9.8g>copy /b out32dll\libeay32.lib d:\lib\openssl\lib F:\work\openssl-0.9.8g>copy /b out32dll\ssleay32.dll d:\lib\openssl\bin F:\work\openssl-0.9.8g>copy /b out32dll\libeay32.dll d:\lib\openssl\bin F:\work\openssl-0.9.8g>copy /b out32dll\openssl.exe d:\lib\openssl\bin F:\work\openssl-0.9.8g>copy README d:\lib\openssl F:\work\openssl-0.9.8g>copy LICENSE d:\lib\openssl F:\work\openssl-0.9.8g>
上記の手順で作成しコピーしたバイナリ一式はこれ(7z形式で圧縮)です。(以下のスタティック版は含まれていない)
もし、スタティックリンク版のライブラリが必要な場合には以下のようにビルドします。
F:\work\openssl-0.9.8g>nmake -f ms\nt.mak : [中略] F:\work\openssl-0.9.8g>
スタティック版の生成物(ライブラリ)をテストするコマンドが用意されています。実行後、passed all testsと表示されればOKと思われます。
F:\work\openssl-0.9.8g>cd out32 F:\work\openssl-0.9.8g\out32>..\ms\test : [中略] passed all tests F:\work\openssl-0.9.8g\out32>
DLL版と同じ実行ファイル名、.libファイル名が生成されるので、ファイルのコピー先は分けた方がよいでしょう。
F:\work\openssl-0.9.8g>md d:\lib\openssl\sbin F:\work\openssl-0.9.8g>md d:\lib\openssl\slib F:\work\openssl-0.9.8g>copy /b out32\ssleay32.lib d:\lib\openssl\slib F:\work\openssl-0.9.8g>copy /b out32\libeay32.lib d:\lib\openssl\slib F:\work\openssl-0.9.8g>copy /b out32\openssl.exe d:\lib\openssl\sbin F:\work\openssl-0.9.8g>
フリーのコマンドライン版Borland C++ 5.5.1を使用したところ、ビルドでエラーが発生しました。一応途中経過を書いておきます。
OpenSSLソースを作業ディレクトリに展開後、Perlスクリプトを実行します。
F:\work\openssl-0.9.7>perl Configure BC-32 Configuring for BC-32 : [中略] Configured for BC-32. F:\work\openssl-0.9.7>
ここではアセンブラとしてNASMを使っていきます。そこで、ms\do_nasmを実行します。
F:\work\openssl-0.9.7>ms\do_nasm : [中略] F:\work\openssl-0.9.7>
makeを実行します。途中でエラー終了してしまいました。
F:\work\openssl-0.9.7>make -f ms\bcb.mak : [中略] bcc32 -otmp32\x_all.obj -Iinc32 -Itmp32 -DWIN32_LEAN_AND_MEAN -q -w-aus -w-par -w-inl -c -tWC -tWM -DOPENSSL_SYSNAME_WIN32 -DL_ENDIAN -DDSO_WIN32 -D_str icmp=stricmp -O2 -ff -fp -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_NO _KRB5 -c .\crypto\x509\x_all.c .\crypto\x509\x_all.c: エラー E2450 .\crypto\x509\x_all.c 72: 未定義の構造体 'ASN1_ITEM_st'(関数 X509_v erify ) エラー E2450 .\crypto\x509\x_all.c 72: 未定義の構造体 'ASN1_ITEM_st'(関数 X509_v erify ) *** 2 errors in Compile *** ** error 1 ** deleting tmp32\x_all.obj F:\work\openssl-0.9.7>
Visual C++の64bit版ビルドは、Visual Studio 2005から可能です。しかし、Visual Studio 2003以前でも「Platform SDK for Windows Server 2003」には64bit版のC/C++コンパイラとアセンブラ(MASM)が含まれています。
なお、Vista用の最新Platform SDKではml64.exeやnmake.exeが含まれていません。Windows Server 2003用を使用します。
また、Perlについては、ActivePerlは64bit版がリリースされているので、これを利用します。
今回は、PowerShellを使ってみます。
PS D:\Users\torutk\work\openssl-0.9.8e> $env:PATH += ";D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\win64\x86\AMD64" PS D:\Users\torutk\work\openssl-0.9.8e> $env:PATH += ";D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin" PS D:\Users\torutk\work\openssl-0.9.8e> $env:INCLUDE = "D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include" PS D:\Users\torutk\work\openssl-0.9.8e> $env:INCLUDE += ";D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\crt" PS D:\Users\torutk\work\openssl-0.9.8e> $env:LIB = "D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib\AMD64" PS D:\Users\torutk\work\openssl-0.9.8e>
PS D:\Users\torutk\work\openssl-0.9.8e> perl Configure VC-WIN64A :[中略] PS D:\Users\torutk\work\openssl-0.9.8e> ms\do_win64a :[中略] PS D:\Users\torutk\work\openssl-0.9.8e> nmake -f ms\ntdll.mak :[中略] PS D:\Users\torutk\work\openssl-0.9.8e>
ビルド結果の確認
PS D:\Users\torutk\work\openssl-0.9.8e> cd out32dll PS D:\Users\torutk\work\openssl-0.9.8e\out32dll> ..\ms\test :[中略] passed all tests PS D:\Users\torutk\work\openssl-0.9.8e>
インストール方法は32bit版と同様、ヘッダーファイル、ライブラリファイル、実行ファイルをコピーするだけです。
ビルドにはCコンパイラとアセンブラ、そしてPerlを使用します。アセンブラがない場合はCのコードが使われるので、必ずしもアセンブラは必要ではありませんが、処理速度が倍位遅くなります。対応しているコンパイラは次のとおりです。
GCCでビルドしたライブラリをSun CCで作成したプログラムとリンクさせる場合、シンボル未解決等のエラーがでることがあります。GCCとSun CCの混在は基本的にはお勧めしません。
ソースを展開し、Configureスクリプトを実行します。
work$ tar xvzf openssl-0.9.7d.tar.gz : [中略] work$ cd openssl-0.9.7d openssl-0.9.7d$ ./Configure solaris-x86-cc : [中略] openssl-0.9.7d$ make : [中略] openssl-0.9.7d$
ダイナミックリンク共有ライブラリファイルを生成する場合、オプションを指定します。