前回のエントリで最後に触れたとおりWindowsのThinでHTTPSアクセスを有効にする方法について説明します。
WindowsのEventMachineでSSLを有効にする方法
Thinの内部で利用されているEventMachineでSSLを有効にする方法については以下に詳しく記載されています。
これらの内容を基にいろいろ試してみた結果、現在のバージョンVer. 1.2.5
においては以下の様にすれば良いことが分かりました。
OpenSSLは最新版のVer.1.1.0系ではなく、Ver.1.0.2系を使う
- ネイティブコンパイルに必要なライブラリの構成が1.1.0系だと駄目だそうです。
ネイティブコンパイルのオプションに
--with-opt-lib
と--with-ssl-include
を付ける--with-ssl-dir
パラメーターではダメな様です。
プラットフォームの指定を
ruby
にする- デフォルトのプラットフォームは
x64-mingw32
ですがこれだと上手くいきませんでした...
- デフォルトのプラットフォームは
gem install
コマンドだと以下の様な指定になります。
gem install eventmachine --platform ruby -- --with-opt-lib=[OpenSSLのインストール先\bin] --with-ssl-include=[OpenSSLのインストール先\include]
このため、Redmine(Thin)のインストールにおいてHTTPSアクセスを有効にするにはbundle install
コマンドから上記と同等のインストールができれば良いのですが、私のRubyちからが低く、bundle config
などいろいろ試してみたのですが、結局どうすれば出来るのかわかりませんでした...
仕方ないので今回は一旦bundle exec install gem
コマンドからEventMachineだけを別にインストールし、Redmine(Thin)で使われているものと差し替えることでHTTPSアクセスを有効にすることとしました。
0. はじめに
前提条件
今回の作業を行う前提として、前回の手順でRedmineをインストールした直後の状態からスタートします。
Windowsサービスの設定
本エントリの作業ではWindowsサービスを設定しなおす必要があるので、一旦インストールしたサービスの登録を解除しておきます。
$REDMINE_SERVICE_NAME = "Redmine" # Windowsサービスの解除 Stop-Service $REDMINE_SERVICE_NAME thin_service remove -N $REDMINE_SERVICE_NAME
1. OpenSSLのインストール
OpenSSLのインストール
最初に触れた様にOpenSSLのVer.1.0.2系、現時点の最新版であるVer.1.0.2L
をインストールします。
ネイティブコンパイル用にインクルードファイルなども必要なので、LightではないWin64 OpenSSL v1.0.2Lをダウンロードしてインストールします。
前回同様サイレントインストールします。
インストール先はC:\OpenSSL-Win64
としています。
$OPENSSL_INSTALL_PATH = 'C:\OpenSSL-Win64' # ダウンロード Invoke-WebRequest -Uri "http://slproweb.com/download/Win64OpenSSL-1_0_2L.exe" -OutFile "$(Get-Location -PSProvider Filesystem)\Win64OpenSSL-1_0_2L.exe" # インストール Start-Process -FilePath ".\Win64OpenSSL-1_0_2L.exe" -ArgumentList @("/SILENT", "/DIR=""$OPENSSL_INSTALL_PATH""") -Wait -PassThru
サーバー証明書の作成
こちらは無くてもなんとかなるのですが一応サーバー証明書も作っておきます。
手順と証明書の内容はかなり適当です。
実環境では適宜まともな証明書を使用してください。
# 必要なPATHを追加 $env:OPENSSL_CONF = Join-Path $OPENSSL_INSTALL_PATH "bin\openssl.cfg" $env:PATH = "$(Join-Path $OPENSSL_INSTALL_PATH "bin");" + $env:PATH # 証明書の設定は適当(CNだけ設定)なので必要に応じて変更してください openssl genrsa -out server.key 4096 openssl req -new -x509 -days 3650 -key server.key -out server.crt -subj "/C=JP/ST=/L=/O=/OU=/CN=$(hostname)"
作成した証明書は任意のディレクトリに配置してください。*1
2. SSL対応したEventMachineのインストール
続けてSSL対応したEventMachineをインストールします。
2-1. SSL対応したEventMachineのインストール
bundle exec
コマンドを使用してRedmineで使用しているものとは別にEventMachineをインストールします。
Redmineをインストールしたディレクトリに移動して以下のコマンドを実行してください。
$REDMINE_VER = '3.4.2' $REDMINE_INSTALL_ROOT = 'C:\' $REDMINE_INSTALL_PATH = Join-Path $REDMINE_INSTALL_ROOT "redmine-$REDMINE_VER" # ディレクトリ移動 cd $REDMINE_INSTALL_PATH # bundle exec gem install で個別にeventmachineをインストール bundle exec gem install install eventmachine --platform ruby -- --with-opt-lib="$(Join-Path $OPENSSL_INSTALL_PATH "bin")" --with-ssl-include="$(Join-Path $OPENSSL_INSTALL_PATH "include")"
ここでエラー無くGemのインストールが完了すれば、BundlerのGemフォルダには以下の様に2つのEvenetMachineがインストールされているはずです。
それぞれ、
eventmachine-1.2.5
- 今回の手順でインストールされたEventMachine。SSL対応。
eventmachine-1.2.5-x64-mingw32
- 前回の
bundle install
でインストールされたEventMachine。SSL非対応。
- 前回の
となります。
2-2. Redmineで使用しているEventMachineと差し替える
続けて、この2つのGemの名称を差し替えて、Redmine(Thin)でSSLに対応したEventMachineを使う様にしてやります。
単純にフォルダ名をリネームして差し替えてやります。
# フォルダ名の差し替え $BUNDLE_GEM_ROOT = Join-Path $REDMINE_INSTALL_PATH "vendor\bundle\ruby\2.3.0\gems" Move-Item (Join-Path $BUNDLE_GEM_ROOT "eventmachine-1.2.5-x64-mingw32") (Join-Path $BUNDLE_GEM_ROOT "eventmachine-1.2.5-x64-mingw32.orig") Move-Item (Join-Path $BUNDLE_GEM_ROOT "eventmachine-1.2.5") (Join-Path $BUNDLE_GEM_ROOT "eventmachine-1.2.5-x64-mingw32")
上図の様になっていれば完了です。
2-3. 動作確認
前回同様に動作確認を必要に応じて行ってください。
今回はHTTPSアクセスを有効にするので、--ssl
、--ssl-key-file
、--ssl-cert-file
パラメーターを指定してやります。
サーバー証明書はRedmineをインストールしたディレクトリにおいてあるものとします。
# 動作確認のため、必要に応じて実行する # https://localhost:3000/ にアクセスして動作を確認する bundle exec thin start -e production -p 3000 -a 0.0.0.0 -c "$REDMINE_INSTALL_PATH" --ssl --ssl-key-file "$(Join-Path $REDMINE_INSTALL_PATH "server.key")" --ssl-cert-file "$(Join-Path $REDMINE_INSTALL_PATH "server.crt")"
3. Windowsサービスの設定
動作確認に問題がないことを確認したら、最後にthin_service
コマンドを使い、Redmine(Thin)をWindowsサービス化します。
--ssl
、--ssl-key-file
、--ssl-cert-file
パラメーターを指定する点以外は前回と同じです。
# サービス登録 $REDMINE_SERVICE_NAME = "Redmine" $REDMINE_INSTALL_PORT = 3000 thin_service install -N $REDMINE_SERVICE_NAME -c "$REDMINE_INSTALL_PATH" -p $REDMINE_INSTALL_PORT -e production --ssl --ssl-key-file "$(Join-Path $REDMINE_INSTALL_PATH "server.key")" --ssl-cert-file "$(Join-Path $REDMINE_INSTALL_PATH "server.crt")" # サービス起動 Start-Service Redmine
以上でインストールは完了です。
https://localhost:[$REDMINE_INSTALL_PORTのポート番号]/
にアクセスしてRedmineにHTTPSアクセスができることを確認してください。
最後に
とりあえずこんな感じです。
bundle install
で上手くやる方法がありましたらぜひ教えてください。
*1:今回の手順ではRedmineをインストールしたディレクトリに配置した例を挙げています