トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Java/Tomcat

INDEX

Apache Tomcat

Apacheソフトウェア財団による、Apache Software License の Javaサーブレット・JSP アプリケーションサーバ。

SSL暗号化通信

Tomcat でセキュア通信(SSLの暗号化通信)を行うためには、tomcat の設定ファイル server.xml を編集し、コネクターの設定でセキュア通信を有効にする。

 Tomcatの設定ファイル

インストールした状態では、以下のようにコメントアウトされ例が記述されている。

    <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
    <!--
    <Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

 鍵と証明書の作成

必要な鍵と証明書を収めたキーストアは、Java の keytool を使って作成する。キーストアの種類やアルゴリズムは、デフォルト("JKS"と"SunX509")でよい。

主な作成手順としては、鍵ペアを作成し、証明書署名要求(CSR)の作成。CSRを認証局に提出し、証明書を発行してもらう。発行された証明書をインポートする。

 サーバ証明書の指定

特に指定をしないとデフォルトの設定でキーストアが読まれる。個別に指定する場合は、Connector タグの属性 keystoreFile, keystorePass, keyAlias を指定する。

keystoreFile
キーストアファイルの場所。デフォルトは、実行ユーザのホームディレクトリの ".keystore" となる。絶対パスか、環境変数($CATALINA_BASE)からの相対パスで指定する。

Windows版でサービスとして起動している場合は、キーストアファイルは "%SystemDrive%/Documents and Settings/NetworkService/.keystore" を参照する。

keystorePass
キーストアのパスワード。デフォルトは、"changeit" となる。
keystoreType
キーストアの種類。デフォルトは、"JKS" となる。
keyAlias
読み込む鍵のalias名。指定がない場合は、最初の鍵が読み込まれる。※ 5.5以降から

 クライアント認証

Connector タグの属性 clientAuth を "true" にすることでクライアント認証が行われる。

clientAuth
クライアント認証するか(クライアントに証明書を提示させるか)。
truststoreFile
クライアント認証で使用するキーストアの場所。
truststorePass
キーストアのパスワード。
truststoreType
キーストアの種類。

 サンプル

   <Connector port="8443" maxHttpHeaderSize="8192"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" disableUploadTimeout="true"
              acceptCount="100" scheme="https" secure="true"
              clientAuth="false" sslProtocol="TLS"
              keystoreFile="C:/WORK/keystore"
              keystorePass="password"
              keyAlias="tomcat"
              truststoreFile="C:/WORK/keystore"
              truststorePass="password"
       />

catalina.out のローテート

サーブレット等が標準出力・エラーに出力した内容が保存される catalina.out だが、ローテートされず常に追記されているので、出力が多かったり稼働させている時間が長くなると次第に大きなファイルになっていく。

UNIX版の場合、catalina.out は $TOMCAT_HOME/bin/catalina.sh でリダイレクトされているだけなので、rotatelogs を使用してローテートするようにする。$TOMCAT_HOME/logs/catalina.2009-01-27.out の様に日付が付いたファイルが出力される。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
*** /usr/tomcat/bin/catalina.sh.org     2006-04-15 03:09:44.000000000 +0900
--- /usr/tomcat/bin/catalina.sh 2009-01-27 11:30:37.346765731 +0900
***************
*** 237,243 ****
  elif [ "$1" = "start" ] ; then

    shift
!   touch "$CATALINA_BASE"/logs/catalina.out
    if [ "$1" = "-security" ] ; then
      echo "Using Security Manager"
      shift
--- 237,243 ----
  elif [ "$1" = "start" ] ; then

    shift
!   #touch "$CATALINA_BASE"/logs/catalina.out
    if [ "$1" = "-security" ] ; then
      echo "Using Security Manager"
      shift
***************
*** 249,255 ****
        -Dcatalina.home="$CATALINA_HOME" \
        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
        org.apache.catalina.startup.Bootstrap "$@" start \
!       >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

        if [ ! -z "$CATALINA_PID" ]; then
          echo $! > $CATALINA_PID
--- 249,256 ----
        -Dcatalina.home="$CATALINA_HOME" \
        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
        org.apache.catalina.startup.Bootstrap "$@" start \
!       2>&1 | /usr/sbin/rotatelogs "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out 86400 &
!       #>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

        if [ ! -z "$CATALINA_PID" ]; then
          echo $! > $CATALINA_PID
***************
*** 261,267 ****
        -Dcatalina.home="$CATALINA_HOME" \
        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
        org.apache.catalina.startup.Bootstrap "$@" start \
!       >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

        if [ ! -z "$CATALINA_PID" ]; then
          echo $! > $CATALINA_PID
--- 262,269 ----
        -Dcatalina.home="$CATALINA_HOME" \
        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
        org.apache.catalina.startup.Bootstrap "$@" start \
!       2>&1 | /usr/sbin/rotatelogs "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out 86400 &
!       #>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

        if [ ! -z "$CATALINA_PID" ]; then
          echo $! > $CATALINA_PID

※Windows版は、catalina.bat でリダイレクトしてる訳じゃないけど、どうしてるんだろう…

TomcatでCGIを使う

デフォルトでは無効になっているが、Tomcat でもCGIの実行自体はサポートされている。ので、設定を行えばTomcat上でCGIを走らせることが出来る。

 TomcatでCGIを有効にする

先ずは、CGIを実行する為のライブラリの配置。$TOMCAT_HOME/server/lib 下にある servlet-cgi.renametojar と言うファイルを servlet-cgi.jar へ名前を変更する。

続いて、CGIを利用するWebアプリケーションの web.xml にCGIサーブレットの定義を追加する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
  version="2.4">

  <servlet>
    <servlet-name>CGIServlet</servlet-name>
    <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
    <init-param>
      <param-name>cgiPathPrefix</param-name>
      <param-value>WEB-INF/cgi</param-value>
    </init-param>
    <init-param>
      <param-name>clientInputTimeout</param-name>
      <param-value>100</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>executable</param-name>
      <param-value>/usr/bin/perl</param-value>
    </init-param>
    <load-on-startup>5</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>CGIServlet</servlet-name>
    <url-pattern>/cgi-bin/*</url-pattern>
  </servlet-mapping>

</web-app>

CGIServlet の設定可能なパラメータは以下の通り。デフォルト値で問題なければ特に記述も不要。
パラメータ名 説明 デフォルト値
cgiPathPrefix CGIプログラムの置かれる場所。先頭の'/'を除いたアプリケーションのルートからの絶対パス。 「WEB-INF/cgi」
clientInputTimeout ブラウザからの入力がないと判定するまでの時間(単位はミリ秒)。 100ミリ秒
debug ログへ出力させるデバッグ情報の表示レベル。 0
executable スクリプトの実行コマンド。パスが通っていない場合は「/usr/bin/perl」の様に絶対パスで指定する。 「perl」
parameterEncoding
passShellEnvironment false

このCGI利用の記述は、$TOMCAT_HOME/conf/web.xml にもコメントアウトされた形で記述されている。しかし、ここで有効にするとすべてのWebアプリケーションでCGIが有効になってしまうため、個別に web.xml でCGIの設定を行う方が無難かな。

 CGIプログラムの動作確認

実際にTomcat上でCGIプログラムが動作するかを確認する。

Webアプリケーションの /WEB-INF/cgi 下に test.cgi を以下の内容で配置する。

1
2
3
4
5
6
#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "<html><body>";
print "test.cgi with Perl $]";
print "</body></html>"

http://localhost:8080/sample/cgi-bin/test.cgi でアクセスし表示されればOK。

最終更新時間:2010年09月06日 16時59分07秒 指摘や意見などあればSandBoxのBBSへ。