OpenmeetingsをSSLで動作させる設定(3.3.0以降)

ChromeはHTTPSでないとマイクやカメラを列挙しないように仕様が変わったらしく(サービス提供者にプレッシャーを掛け続けているという話だったが、元ネタ場所は失念)、HTTPのままでは使えない。

実際、HTTPのままのOpenmeetingsにログインして会議室に入ってみると、カメラやマイクはあっても文字が列挙されず選択肢は真っ白だ。




このページは4部作の2つ目。
OpenmeetingsインストールからProxy設定(3.0.5~3.2.1近辺)
OpenmeetingsをSSLで動作させる設定(3.3.0以降)
OpenmeetingsをそれでもProxyで動作させる(危険)
Openmeetingsのアップグレード & ChromiumとFlash

バージョン3.3.0でCSRF(Cross-Site Request Forgery)の脆弱性を修正したので、3.3.0以降の場合には、前回記事の単純なHTTPSのProxy設定をしてもCSRFのエラーで動かない。具体的には「ソースはhttps:om.hogeserver.hogeddns.jpなのに、http:om.hogeserver.hogeddns.jpにアタックされたー!」と表示されて動かない。

※Apacheの設定に明るい方ならProxy設定だけで動かせるかもしれない。ぜひ教えてください。いくら探しても見つからないのです…

そのため、Chromeで使えるようにするためには、Openmeetings自体をHTTPSで動作させる若干大掛かりな感じの設定変更が必要。

やり方は「Using OpenMeetings with RTMPS and HTTPS」に書いてあるが、なんか難しい…

実際にやるのは以下。

  • サーバー証明書(署名済み)、サーバー秘密鍵、ルート証明書をpacks12形式にまとめる。*
  • おまとめ証明書をベースにキーストアを作成。*
  • ルート証明書をベースにトラストストアを作成。
  • Openmeetingsの設定をSSLに変更。
  • Apacheをの設定をSSLに合わせる。
  • ユーザーのPCにあるJavaのキーストアにルートCAと中間CAの証明書をインポート。

…と、サーバー管理者だけでなく、利用者に対するハードルもかなり上がってしまう。

*新たに証明書を作る場合には順序が逆に。先にキーストアを作り、そのキーストアをベースに証明書署名要求を作って署名をしてもらい…となる。今回この方式を記事にしたのは、keytoolのパラメータが「import」となっていて「作る」ように見えずモヤモヤ悩んだため。

※設定の過程でカット&トライしたのだが、どうにも動作が変わらないことがあった。Chromeの閲覧履歴を消したら設定変更が反映されたりするので、動作確認にも注意が必要。

キーストアとトラストストアについては、こちらで一言で説明されている。
引用「インフラSEの運用・構築メモ キーストアとトラストストアについて

  • キーストア
    自らが作成したサーバー証明書を保存する。
  • トラストストア
    CAが発行したルート証明書・中間証明書など自らが信頼する証明書を保存する。

今回で言えば、キーストアには新たに作成するopenmeetingsサーバーのサーバー証明書を入れておき、トラストストアにはCA証明書を入れることになる。

現在、過去に記載した記事で構築したオレオレなルート認証局を運用しており、利用しているPCにはルート証明機関としてインストール済みだ。この仕組を流用する。

なお、元々あるキーストアは無視して良さそう。

$red5/conf/keystore.jmx
$red5/conf/truststore.jmx

実際に作り出すキーストア・トラストストアの拡張子は jks のため。


■サーバー証明書(署名済み)、サーバー秘密鍵、ルート証明書をpacks12形式にまとめる

今回、om.hogeserver.hogeddns.jp というドメイン名でサービスを提供しようとしているので、このドメイン名を持つサーバー秘密鍵・証明書署名要求を作成した。証明書署名要求にはオレオレ認証局で署名をする。

できあがった署名済みのサーバ証明書とサーバー秘密鍵を以下の名前で配置。

red5.crt
red5.key

これをpkcs12形式でまとめる。ルートCAや中間CAの証明書も一緒に入れておくようにと書かれている。

$ openssl pkcs12 -export -in red5.crt -inkey red5.key -out red5.p12 -name red5 -certfile ca.crt
Enter Export Password:
Verifying - Enter Export Password:
unable to write 'random state'

※中間CA証明書もあわせて入れる場合には、パラメータに -certfile Intermediate.crt …と追加していけば良い模様。


■おまとめ証明書をベースにキーストアを作成

できあがったpkcs12形式にまとめた証明書をベースにキーストアを作成する。-importkeystoreとパラメータを付けるが、なければキーストアが作られる。

$ keytool -importkeystore -srckeystore red5.p12 -srcstoretype PKCS12 -destkeystore ./keystore.jks -deststoretype pkcs12 -alias red5
キーストアred5.p12を./keystore.jmxにインポートしています...
出力先キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
ソース・キーストアのパスワードを入力してください:

pkcs12形式のエクスポートパスワードとキーストアのパスワードが違うとキーストアができない。そのときには、-destkeypass パラメータでキーストアのパスワードを決めてあげれば良いみたい。

この操作で新規にキーストアが作られ、ベースとなったpkcs12からサーバー証明書・秘密鍵、ルート証明書が格納できた。

なお、サーバー証明書は以前の記事で書いた方法で作成、署名したものを利用しているが、サーバー証明書を新規に作る場合には Using OpenMeetings with RTMPS and HTTPS にかかれている手順でできた。

ざっくりと書くと…

  • キーストアを作る
  • キーストアの情報をベースに署名要求を作る
  • 自前CAで署名
  • 署名した証明書をキーストアにインポート

という手順。


■ルート証明書をベースにトラストストアを作成

証明機関をまとめたトラストストアを作成。こちらもパラメータに -import をつければ、なければストアが作られる。

$ keytool -import -file ca.crt -alias hogeCA -keystore ./truststore.jks
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
所有者: EMAILADDRESS=webmaster@hogeserver.hogeddns.jp, CN=om.hogeserver.hogeddns.jp, O=hogehoge, ST=hogehoge, C=JA
発行者: EMAILADDRESS=webmaster@hogeserver.hogeddns.jp, CN=om.hogeserver.hogeddns.jp, O=hogehoge, ST=hogehoge, C=JA
・
・
・
この証明書を信頼しますか。 [いいえ]:  y
証明書がキーストアに追加されました

ここまででキーストアとトラストストアができあがった。


■Openmeetingsの設定をSSLに変更

3.3.2でHTTPS & RTMPSで動くように設定をしてみる。

$red5/conf/red5-core.xml
    <!-- RTMPS --> ←ここを有効化
    <bean id="rtmpsMinaIoHandler" class="org.red5.server.net.rtmps.RTMPSMinaIoHandler">
・
・
・
    <bean id="rtmpsTransport" class="org.red5.server.net.rtmp.RTMPMinaTransport" init-method="start" destroy-method="stop">
・
・
・
    </bean>

$red5/conf/red5.properties
rtmps.keystorepass=KeyStoreを作ったときに入力したパスワード
rtmps.keystorefile=conf/keystore.jks
rtmps.truststorepass=TrustStoreを作ったときに入力したパスワード
rtmps.truststorefile=conf/truststore.jks

$red5/webapps/openmeetings/public/config.xml
設定値を以下の通り変更。
<rtmpsslport>443</rtmpsslport>
<useSSL>yes</useSSL>
<red5httpport>443</red5httpport>
<protocol>https</protocol>

$red5/conf/jee-container.xml
<!-- Tomcat without SSL enabled -->
の範囲をコメント化し、
<!-- Tomcat with SSL enabled -->の範囲を有効化する。

Apacheの設定。どうしても、Proxyが上手く動作しなくて困った…
SSL setup with apache in front of tomcatに解決方法が示されていた!

#
# Apache Openmeetings
#

<VirtualHost *:443>
        ServerName om.hogeserver.hogeddns.jp
        ServerAdmin webmaster@hogeserver.hogeddns.jp

        ProxyPreserveHost on
        RewriteEngine on
        RewriteCond %{HTTP:Upgrade} =websocket [NC]
        RewriteRule /(.*)            wss://om.hogeserver.hogeddns.jp:5443/$1 [P,L]
        RewriteCond %{HTTP:Upgrade} !=websocket [NC]
        RewriteRule /(.*)           https://om.hogeserver.hogeddns.jp:5443/$1 [P,L]
        ProxyPassReverse / https://om.hogeserver.hogeddns.jp:5443/

        ErrorLog  ${APACHE_LOG_DIR}/openmeetings-error.log
        CustomLog ${APACHE_LOG_DIR}/openmeetings-access.log combined

        SSLEngine on
        SSLProxyEngine on
        SSLCertificateFile    /etc/ssl/private/om-hogeserver.crt
        SSLCertificateKeyFile /etc/ssl/private/om-hogeserver.key
</VirtualHost>

この SSLProxyEngine on 設定で上手くProxyができるようになった。


■ユーザーのPCにあるJavaのキーストアにルートCAと中間CAの証明書をインポート

よく使うんですよ、画面共有。

SSLでOpenmeetingを動かす場合、画面共有する人は、そのPCでルートCA(&多分中間CA)をJavaのキーストアにインポートしておく必要がある。

具体的には、
C:\Program Files (x86)\Java\jre1.n.n_nn\bin\keytool.exe
を使って、キーストアcacerts
C:\Program Files (x86)\Java\jre1.n.n_nn\lib\security\cacerts
にルートCAと中間CAの証明書をインポートする。

手順は

  • ルートCAと中間CAの証明書を準備。
  • コマンドプロンプトを「管理者」で開く。
  • Javaのbinディレクトリへ移動。
  • キーストアに準備した証明書をインポート

となる。

>cd "C:\Program Files (x86)\Java\jre1.n.n_nn\bin" ←TABキーを途中で押したりして探しながらディレクトリ移動
C:\Program Files (x86)\Java\jre1.n.n_nn\bin>keytool -import -alias root -keystore ..\lib\security\cacerts -file インポートする証明書.crt
キーストアのパスワードを入力してください: ← changeit で行ける

証明書をインポートしないと、ツールの実行まではできるが、画面共有を開始できない(ボタンを押しても何も反応しない)。


ここまでの手順で、SSLでサービスを提供できた。

SSLのインストール手順はUbuntu12時代に書かれたものだったため、久しぶりにUbuntu12をインストールして使ってみた。その際、Oracle Javaをインストールするのに以下を参考にさせていただいた。
Ubuntu 12.04 に Oracle Java 6, 7 (JRE, JDK) をインストール
Java6, Java7 は古すぎるのかインストールできなかったが、Java8はインストールできた。

めっちゃ助かりました。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

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