しばたテックブログ

気分で書いている技術ブログです。

Windows Serverに最小構成でRedmineをインストールする - その2

blog.shibata.tech

前回のエントリで最後に触れたとおりWindowsのThinでHTTPSアクセスを有効にする方法について説明します。

WindowsのEventMachineでSSLを有効にする方法

Thinの内部で利用されているEventMachineでSSLを有効にする方法については以下に詳しく記載されています。

github.com

github.com

これらの内容を基にいろいろ試してみた結果、現在のバージョンVer. 1.2.5においては以下の様にすれば良いことが分かりました。

  1. OpenSSLは最新版のVer.1.1.0系ではなく、Ver.1.0.2系を使う

    • ネイティブコンパイルに必要なライブラリの構成が1.1.0系だと駄目だそうです。
  2. ネイティブコンパイルのオプションに--with-opt-lib--with-ssl-includeを付ける

    • --with-ssl-dirパラメーターではダメな様です。
  3. プラットフォームの指定を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がインストールされているはずです。

f:id:stknohg:20170813000646p:plain

それぞれ、

  • 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")

f:id:stknohg:20170813000700p:plain

上図の様になっていれば完了です。

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アクセスができることを確認してください。

f:id:stknohg:20170813000716p:plain

f:id:stknohg:20170813000726p:plain

最後に

とりあえずこんな感じです。
bundle installで上手くやる方法がありましたらぜひ教えてください。

*1:今回の手順ではRedmineをインストールしたディレクトリに配置した例を挙げています