OpenSSLをWindowsでコンパイルしてみた

今ではだいたいのWebAPIを使うときにはSSLでの通信が必要になるのが痛いですね。

まあ、実際はWinHTTPなどWindowsが持っている機能を使えばいいだけのような気がしないではないですが、Linuxなどへの移植も考えてOpenSSLを使って組んでみよう、ということです。

OpenSSLのコンパイルそのものはとても簡単です。が、いろいろと注意するポイントがあるのでそのところだけ。

まずはソースコードをダウンロード

OpenSSLのページよりソースコードをダウンロードします。

バージョンは0.9.8系統、1.0.0系統、1.0.1系統と3つありますが、お好きなものを。

まあ、基本的には上位系統の方がいいと思います。ハッシュサポートの状態や楕円曲線暗号などのからみで上位の方が実装がよいことがありますので。

ダウンロードして展開すれば準備は完了・・・ではありません。

開発環境およびPerlが必要

特に後者の「Perlが必要」が痛いです。

純粋にWindowsでやるのであればActivePerlあたりをインストールする必要があるので環境に影響を与えてしまいます。

だからといってそのためだけにCygwinなどを入れるのも個人的にはどうかと思いますが・・・。

まあ、この辺は仕方がないので入れてください。ライセンスなどが大丈夫であれば仮想マシン上でやってもいいと思います。

開発環境は64bit版も作成するのであればVisualStudio2005以降が必要です。

あとは説明書き通りにコマンドを打てばよい・・・ですが

コンパイルの仕方については展開されたOpenSSLのルートディレクトリにINSTALL.W32およびINSTALL.W64というファイルがありますのでテキストエディタなどで開いて読めば簡単です。

Perlが実行できるプロンプトおよびコンパイル環境が動かせるプロンプト内で各種コマンドを実行することになります。

面倒なのはこのままコンパイルを行うと各種ランタイムライブラリがDLLを使用することになったりデバッグ用ファイルが生成されてしまうこと。

静的ライブラリ作成時はランタイム指定が省かれるのでまだましですが、DLL作成時にランタイム指定の問題が気になる人はここで変えてしまうといいです。

変更対象となるのは32bit版であればms\do_ms.batやms\do_nasm.bat、64bit版であればms\do_win64a.batを実行した後にできるms\nt.makおよびms\ntdll.makです。

対象のオプションはntdll.makであれば以下のような定義がされていると思います。

CFLAG= /MD /Ox /O2 /Ob2 -DOPENSSL_THREADS  -DDSO_WIN32 -W3 -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE
APP_CFLAG= /Zi /Fd$(TMP_D)/app
LIB_CFLAG= /Zi /Fd$(TMP_D)/lib -D_WINDLL
LFLAGS=/nologo /subsystem:console /opt:ref /debug

この場合、変更後は以下のようになります

CFLAG= /MT /Ox /O2 /Ob2 -DOPENSSL_THREADS  -DDSO_WIN32 -W3 -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE
APP_CFLAG= /Fd$(TMP_D)/app
LIB_CFLAG= /Fd$(TMP_D)/lib -D_WINDLL
LFLAGS=/nologo /subsystem:console /opt:ref

要点としては以下の通り。

  • /MD(ランタイムをDLLで連結)を/MT(ランタイムを静的ライブラリで連結)にする
  • /Zi(デバッグ情報をプログラムデータベースで作成)を各コンパイルオプションより削除
  • /debug(実行ファイルのデバッグ情報を作成)をリンクオプションより削除

なお、状態によってはランタイムをDLLで連結した方が有利なことがあるのでそちらは残してもいいかもしれません。

デバッグオプションがあるとライブラリを使用したプログラムのビルド時にpdbをコピーしないと「プログラムデータベースが見つからない」といういやなWarningが出ます。

個人的にはこれは抑制したいので切ってしまっています。

32bit版のコンパイルと64bit版のコンパイルは段階を分けて

といっても、VisualStudioのコンパイル環境をコマンドプロンプトで起動している場合はそもそもプロンプトを変えないとうまくいかないわけですが。

両方ともDLLの場合は[out32dll]および[tmp32dll]を使用するので作成先がかぶってしまいます。

32bit版および64bit版を作成するときは片方の作成が終わったら削除するかms\ntdll.makをさらにいじって変更するとよいかも。

ただ、生成されるファイルが両方ともntdll.makなのでそれは面倒だと思います。

作成が完了したらできたライブラリはコピーする

OpenSSLを組み込むときに使うのは

  • libeay32.lib、libeay32.dll
  • ssleay32.lib、ssleay32.dll

となります。out32(out32dll)から作成されたこれらのファイルをコピーします。

なお、そのほかのファイルはOpenSSLのプロンプトや各種テスト用実行ファイルとなりますので今回は必要はないと思います。

OpenSSLのプロンプトだけは使うことがあるかもしれませんので証明書などを作成する必要がありそうなときはコピーしておくといいかも。

ヘッダファイルも忘れずに

include内にあるすべてのファイルもコピーしてincludeできる場所にコピーします。

これがないとそもそも各種ライブラリを連結できなくなりますね。

これでやっとコンパイル完了

各種コンパイルオプションを設定するところがなければファイルの指示に従うだけですので簡単です。

Perlはこれが終われば削除してしまっても問題ありません。

がんばってOpenSSLを使いましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL