[ C++で開発 ]

OpenSSLのインストール

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 が最新です。

Windows

バイナリを入手

有志がソースをビルドしてバイナリを公開しています。

Solaris

バイナリを入手

ビルド済みのバイナリパッケージが公開されています。

Windowsでビルド(32bit)

ビルドにはCコンパイラとアセンブラ、そしてPerlを使用します。アセンブラがない場合はCのコードが使われるので、必ずしもアセンブラは必要ではありませんが、処理速度が倍位遅くなります。対応しているコンパイラは次のとおりです。

Windows用アセンブラ

アセンブラには、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を使ったコンパイルは通ります。

NASMをインストール

から、Windows用バイナリを入手します。これを解凍して、nasmw.exeのあるディレクトリを環境変数PATHに追加します。

nasm v9の場合、nasmw.exeがなく、nasm.exeとなっています。このままではOpenSSLのビルドでnasmw.exeが見つからないためエラーとなるので、nasm.exeをnasmw.exeにコピーして対応します。

MASMをインストール

Windows DDK

Microsoft Assemblerは現在DDKに含まれています。前は無償でダウンロードできたのですが、今はダウンロードはできなくなり、CDを注文する必要があります。なおCDの費用は無償で送料のみかかります。アメリカからになるので日本で注文すると$25です。DDKをインストールすると、コマンドの中にml.exeというアセンブラが含まれています。

インストール後、DDKをインストールしたディレクトリの中にあるbin\x86ディレクトリを環境変数PATHに追加します。

masm32

から、masm32v9.zipを入手します。これを解凍すると、INSTALL.EXEが現れるので、これを実行してインストールします。インストール後、MASM32の中のBINディレクトリを環境変数PATHに追加します。

Perl

ActivePerl

ActivePerlがインストールされていなければ、まずActivePerlをインストールします。左上のDownloadのロゴをクリックすると登録ページになり、Register情報に何か入れて(入れなくても可)次へ進むとダウンロードページになります。2007年10月25日現在、Ver.5.8.8 build 822が最新です。

Cygwin Perl

Cygwin環境を導入すると、Perlが利用可能になります。

OpenSSLのビルド(VC++編)

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倍違うとのことです。

  1. MASM(Microsoft Assembler)があるなら、ms\do_masm を実行
  2. NASM(Free Netwide Assembler)があるなら、ms\do_nasmを実行
  3. アセンブラを使わないなら、ms\do_ms を実行

ここではアセンブラとして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>

OpenSSLのビルド(Borland C++編)

フリーのコマンドライン版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>

Windowsでビルド(64bit)

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版と同様、ヘッダーファイル、ライブラリファイル、実行ファイルをコピーするだけです。

Solarisでビルド

ビルドにはCコンパイラとアセンブラ、そしてPerlを使用します。アセンブラがない場合はCのコードが使われるので、必ずしもアセンブラは必要ではありませんが、処理速度が倍位遅くなります。対応しているコンパイラは次のとおりです。

GCCでビルドしたライブラリをSun CCで作成したプログラムとリンクさせる場合、シンボル未解決等のエラーがでることがあります。GCCとSun CCの混在は基本的にはお勧めしません。

Solaris 9 for x86とSun Studio 9でビルド

ソースを展開し、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$ 

ダイナミックリンク共有ライブラリファイルを生成する場合、オプションを指定します。