16.共通SSL設定

WebOTXではWebサーバとして、Webコンテナに内蔵されているWebサーバと、WebOTX Web Server、IIS、Apache 、Sun ONEなどの外部Webサーバが利用できます。ここでは、Webコンテナに内蔵されているWebサーバ、WebOTX Web ServerでTLS/SSL(以降SSLとします)をプライべートCAを立てずに利用する方法について説明します。

ご参考:SSLアクセラレータ
SSLの暗号化・復号化処理をハードウェアで行い、Webサーバの負荷を軽減する方法があります。これを実現するのが「SSLアクセラレータ」です。SSLアクセラレータは、サーバの拡張スロットに差し込むボード、外付けの専用機、ルータやロードバランサなどのネットワーク機器に内蔵されているものなど、様々なタイプの製品があります。

16.1.Webコンテナ内蔵Webサーバを使う場合

WebOTX Webコンテナに内蔵されているWebサーバでSSLを利用する手順について説明します。ここでは、図16.1のようなファイル構成を仮定して説明します。単方向/双方向認証と実際に使用するファイル名は、動作させる環境に応じて置き換えてください。

16.1

図16.1

単方向認証を行うためには、サーバのキーストアからサーバ証明書を取り出し、クライアント側のトラストストアへインポートします。 さらに双方向通信を行うためには、単方向通信の設定に加えて、クライアントのキーストアからクライアント証明書を取り出し、サーバ側のトラストストアへインポートします。

以上を設定するための手順として、J2SEのkeytoolコマンドとWebOTXの運用管理コマンド(otxadmin)を利用した場合について説明します。

caution
説明の中で例示しているコマンドが複数行になっていても、必ず1行で実行してください。
  1. サーバ鍵の作成
  2. J2SEのkeytoolコマンドを利用してサーバ用の鍵を作成します。下にコマンドの例を示します。<DOMAIN_ROOT>はサーバアプリケーションを配備するドメインのルートディレクトリです。ドメインにはじめから設定されているキーストア(keystore.jks)に鍵を追加します。keystore.jksのパスワードは「changeit」です。-dnameオプションのCN属性は必ずサーバのFQDNに一致させなければなりません。

    > keytool -genkey -alias server -dname "CN=server_name, O=X, L=Y, C=XX, OU=YY, S=XY" -keyalg RSA -keypass changeit -storepass changeit -keystore <DOMAIN_ROOT>/config/keystore.jks

  3. サーバ証明書をエクスポート
  4. サーバの証明書をエクスポートします。

    > keytool -export -alias server -storepass changeit -file server.cer -keystore <DOMAIN_ROOT>/config/keystore.jks

  5. クライアント用キーストア、鍵の作成
  6. クライアント用のキーストア、鍵を作成します。

    > keytool -genkey -alias client -dname "CN=client_name, O=X, L=Y, C=XX, OU=YY, S=XY" -keyalg RSA -keypass changeit -storepass changeit -keystore client.jks

    双方向SSL(クライアント認証をするとき)には同様に別途キーストアをもう一つ作成します。例ではclientKey.jksとしています。

    > keytool -genkey -alias client -dname "CN=client_name, O=X, L=Y, C=XX, OU=YY, S=XY" -keyalg RSA -keypass changeit -storepass changeit -keystore clientKey.jks

  7. クライアントの証明書のエクスポート
  8. クライアントの証明書をエクスポートします。これは双方向認証(クライアント認証)をするときのみ必要な作業です。

    > keytool -export -alias client -storepass changeit -file client.cer -keystore clientKey.jks

  9. サーバの証明書をインポート(クライアント)
  10. クライアントのキーストアにサーバの証明書をインポートします。

    > keytool -import -trustcacerts -alias server -file server.cer -keystore client.jks -keypass changeit -storepass changeit

  11. クライアントの証明書をインポート(サーバ)
  12. サーバのキーストアにクライアントの証明書をインポートします。これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。

    > keytool -import -trustcacerts -alias client -file client.cer -keystore <DOMAIN_ROOT>/config/keystore.jks -keypass changeit -storepass changeit

  13. SSL設定コマンドの実行
  14. 運用管理コマンドを起動し、サーバアプリケーションを配備するドメインにログインします。続いて、create-sslを実行し、HTTPリスナにSSLの設定を追加します。certnameオプションではSSLの認証に使うエイリアスを指定します。

    ドメインへのログインコマンド

    otxadmin> login --user admin --password adminadmin --port 6212

    create-sslコマンドはSSL構成により、以下のどちらかを実行してください。

    (単方向SSLのとき)

    otxadmin> create-ssl --type http-listener --certname server --clientauthenabled=false http-listener-2

    (双方向SSLのとき)

    otxadmin> create-ssl --type http-listener --certname server --clientauthenabled=true http-listener-2

  15. ドメインの再起動
  16. ドメインを再起動します。

  17. クライアントのキーストアを配置
  18. クライアント環境にクライアントのキーストアを配置します。

  19. クライアントアプリケーションへのコード追加
  20. クライアントアプリケーションがJavaアプリケーションの場合、次のコードを追加します。このコードはコンストラクタなどのインスタンス生成直後に実行される場所に追加し、必ずサーバアプリケーション呼び出し処理の前に実行されるようにします。javax.net.ssl.trustStoreキーの値はトラストストアのパスです。クライアントアプリケーションを実行するJava VMのユーザホームディレクトリからの相対パス、または絶対パスで指定します。ただし、クライアントアプリケーションをWebOTX上で動作させる場合は、javax.net.ssl.trustStoreキーを設定しないでください。javax.net.ssl.trustStoreキーとjavax.net.ssl.keyStoreキーの値は、クライアントのキーストアのパスになることに注意し、適宜変更してください。

    なお、System.setPropertyで設定している値は、Java VM 実行時引数に与えることでソースコードの変更を省略できます。また、セキュリティプロバイダ「com.sun.net.ssl.internal.ssl.Provider」はJ2SEの初期値で追加されているため、J2SEのjava.securityファイルの内容を変更していない場合、「java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());」を省略できます。

    (単方向SSLのとき)

    System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
    System.setProperty("javax.net.ssl.trustStore", "keystore/client.jks");
    java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

    (双方向SSLのとき)

    System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
    System.setProperty("javax.net.ssl.trustStore", "keystore/client.jks");
    System.setProperty("javax.net.ssl.keyStore", "keystore/clientKey.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", " changeit");
    java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

  21. nec-ejb-jar.xmlの設定追加
  22. サーバアプリケーションがWebサービスで、EJBサービスエンドポイントの場合、nec-ejb-jar.xmlのwebservice-endpoint要素にtransport-guarantee要素を追加します。値はINTEGRALかCONFIDENTIALにします。

    <webservice-endpoint>

    <transport-guarantee>INTEGRAL or CONFIDENTIAL</transport-guarantee>
    </webservice-endpoint>

  23. アクセスURL情報確認
  24. クライアントアプリケーション実行時に指定するURLを次のことに注意して変更します。

 

16.2 WebOTX Webサーバを使う場合

WebOTX WebサーハでSSLを利用する手順を説明します。

16.2

図16.2

16.2.1 単方向認証の場合の手順

(1) WebOTX WebサーバのSSL機能を有効にします。詳細については、WebOTX共通マニュアル - 運用編 - 運用と操作 - WebOTX Webサーバ運用ガイドを参照してください。ここでは、otxadminコマンドを使った設定例を示します。

[コマンド例]
>otxadmin

otxadmin>login --user admin --password adminadmin --port 6212

otxadmin>set server.WebServer.security-enabled=true

caution
loginコマンドの--portオプションはSSLを有効にしたいWebサーバと連動しているドメインに割り当てられたポート番号を指定します。


(2) 任意のマシンにOpen SSLをインストールします。

caution
Open SSLについては「http://www.openssl.org/」を参照してください。


(3) opensslコマンドを使ってサーバ側の秘密鍵を作成します。秘密鍵は一つのバーチャルサーバにつき一つ作成します。

[コマンド例]
>openssl genrsa -rand 1.gif:2.jpg:3.gif 1024 >vs1.key


(4) 秘密鍵から自己証明書を作成します。コマンド実行後、いくつか聞かれる質問のうち「Common Name (eg, YOUR name) []:」には、必ずバーチャルサーバのFQDNまたはIPアドレスを指定します。

[コマンド例]
>openssl req -new -x509 -days 365 -key vs1.key >vs1.crt


(5) クライアントアプリケーションがJavaアプリケーションの場合、J2SE付属のkeytoolコマンドを使ってクライアント用のトラストストアを作成します。ただし、クライアントアプリケーションをWebOTX上で動作させる場合、およびクライアントアプリケーションをWebブラウザで動作させる場合、この作業は必要ありません。

[コマンド例]
>keytool -genkey -alias client -dname "CN=client_fqdn, O=NEC, L=TOKYO, C=JP, OU=X, S=XY" -keyalg RSA -keypass changeit -storepass changeit -keystore ClientTrustStore.jks

caution
-dnameオプションのCNにはクライアントのFQDNまたはIPアドレスを指定します。
caution
-keyalg、-keypass、-storepassで指定する値は適宜変更してください。
caution
-keystoreで指定している値は、図16.2に沿ったものです。


(6) サーバの証明書をクライアントにインポートします。トラストストアにインポートする場合は、J2SE付属のkeytoolコマンドを使用します。コマンド実行後、「この証明書を信頼しますか?」という質問には「Y」と答えます。ただし、クライアントアプリケーションをWebOTX上で動作させる場合は、WebOTXのトラストストア(cacerts.jks)にインポートします。また、Webブラウザにインポートする場合は、Webブラウザの証明書インポート機能を使います。

[コマンド例:自作のトラストストアにインポートする場合]
>keytool -import -trustcacerts -alias server -file vs1.crt -keystore ClientTrustStore.jks -keypass changeit -storepass changeit

[コマンド例:WebOTXのトラストストアにインポートする場合]
>keytool -import -trustcacerts -alias server -file vs1.crt -keystore <Domain_ROOT>/config/cacerts.jks -keypass changeit -storepass changeit

caution
-keypass、-storepassで指定する値は適宜変更してください。
caution
自作のトラストストアにインポートする場合に-keystoreで指定している値は、図16.2に沿ったものです。
caution
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。


(7) <Domain_ROOT>/config/WebServer/ssl.confをテキストエディタで開き、ServerNameパラメータの値にバーチャルサーバのFQDNまたはIPアドレスとポート番号を、SSLCertificateKeyFileパラメータの値にサーバの秘密鍵ファイルの絶対パスを、SSLCertificateFileパラメータの値にサーバの証明書の絶対パスを指定します。

[パラメータ設定例]
ServerName vs1.nec.com:443
SSLCertificateKeyFile "C:/key/vs1.key"
SSLCertificateFile "C:/crt/vs1.crt"

caution
これらのパラメータは、バーチャルサーバ一つにつき一つのみ設定できます。
一つのバーチャルサーバに対して複数設定しないように注意してください。
caution
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。


(8) クライアントアプリケーションがJavaアプリケーションの場合、次のコードを追加します。このコードはコンストラクタなどのインスタンス生成直後に実行される場所に追加し、必ずサーバアプリケーション呼び出し処理の前に実行されるようにします。javax.net.ssl.trustStoreキーの値はトラストストアのパスてす。クライアントアプリケーションを実行するJava VMのユーザホームディレクトリからの相対パス、または絶対パスで指定します。ただし、クライアントアプリケーションをWebOTX上で動作させる場合は、javax.net.ssl.trustStoreキーを設定しないでください。
なお、System.setPropertyで設定している値は、Java VM 実行時引数に与えることでソースコードの変更を省略できます。また、セキュリティプロバイダ「com.sun.net.ssl.internal.ssl.Provider」はJ2SEの初期値で追加されているため、J2SEのjava.securityファイルの内容を変更していない場合、「java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());」を省略できます。

[コード例]
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
System.setProperty("javax.net.ssl.trustStore", "C:/keystore/ClientTrustStore.jks");

[コード例:WebOTX上で動作させる場合]
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol")


(9) クライアントアプリケーション実行時に指定するURLを次のことに注意して変更します。
(10) (1)でSSLを有効にしたWebサーバと連動しているドメインを再起動します。

 

16.2.2 双方向認証の場合の手順

(1) 単方向認証の場合の手順(1)〜(9)を行います。

(2) クライアントの自己証明書を作成します。ここではJ2SEのkeytoolコマンドを使用します。クライアントの秘密鍵を含んだキーストアを作成し、キーストアから自己証明書をエクスポートします。ただし、クライアントアプリケーションをWebOTX上で動作させる場合は、WebOTXのキーストア(keystore.jks)にキーペアを追加します。また、クライアントアプリケーションをWebブラウザで動作させる場合、ここで作成したキーストアをWebブラウザにインポートします。

[コマンド例]
>keytool -genkey -alias client1 -dname "CN=client_fqdn, O=NEC, L=TOKYO, C=JP, OU=X, S=XY" -keyalg RSA -keypass changeit -storepass changeit -keystore clientKeyStore.jks

> keytool -export -rfc -alias client1 -storepass changeit -file client1.crt -keystore clientKeystore.jks

[コマンド例:WebOTX上で動作させる場合]
>keytool -genkey -alias client1 -dname "CN=client_fqdn, O=NEC, L=TOKYO, C=JP, OU=X, S=XY" -keyalg RSA -keypass changeit -storepass changeit -keystore <Domain_ROOT>/config/keystore.jks

>keytool -export -rfc -alias client1 -storepass changeit -file client1.crt -keystore <DOMAIN_ROOT>/config/keystore.jks

caution
-dnameオプションのCNにはクライアントのFQDNまたはIPアドレスを指定します。
caution
-keyalg、-keypass、-storepassで指定する値は適宜変更してください。
caution
キーストアを作成する場合、-keystoreで指定している値は、図16.2に沿ったものです。
caution
クライアントアプリケーションがJavaアプリケーションの場合、ここで作成したキーストアを使いますので、削除しないでください。
caution
WebOTXのキーストアは「<Domain_ROOT>/config/keystore.jks」です。
caution
keystore.jksのキーストアパスワードの初期値は「changeit」です。
caution
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。
caution
クライアントアプリケーションをWebブラウザで動作させる場合、キーストアをpkcs#12形式にしないとインポートできないことが多いことに注意してください。キーストア作成の際に「-storetype」オプションを追加して「pkcs12」を指定すると、キーストアはpkcs#12形式になります。


(3) クライアントアプリケーションがJavaアプリケーションの場合、次のコードを追加します。このコードはコンストラクタなどのインスタンス生成直後に実行される場所に追加し、必ずサーバアプリケーション呼び出し処理の前に実行されるようにします。javax.net.ssl.keyStoreキーの値はキーストアのパスてす。クライアントアプリケーションを実行するJava VMのユーザホームディレクトリからの相対パス、または絶対パスで指定します。ただし、クライアントアプリケーションをWebOTX上で動作させる場合は、javax.net.ssl.keyStoreキーを設定しないでください。また、javax.net.ssl.keyStorePasswordキーの値はキーストアのパスワードに合わせて下さい。
なお、System.setPropertyで設定している値は、Java VM 実行時引数に与えることでソースコードの変更を省略できます。

[コード例]
System.setProperty("javax.net.ssl.keyStore", "C:/keystore/clientKeystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");

[コード例:WebOTX上で動作させる場合]
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");

caution
WebOTXのキーストア「<Domain_ROOT>/config/keystore.jks」のキーストアパスワードの初期値は「changeit」です。
caution
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。


(4) <Domain_ROOT>/config/WebServer/ssl.confをテキストエディタで開き、SSLCACertificateFileパラメータかSSLCACertificatePathパラメータのどちらか一つを変更してWebサーバにクライアントの証明書を認識させます。クライアントの証明書が一つのときはSSLCACertificateFileパラメータで証明書ファイルの絶対パスを指定します。クライアントの証明書が複数のときはSSLCACertificatePathパラメータで証明書を配置したフォルダ(ディレクトリ)を絶対パスで指定します。また、SSLVerifyClientパラメータの値を「require」に変更します。

[パラメータ設定例:クライアントの証明書が一つのとき]
SSLCACertificateFile "C:/crt/client1.crt"
SSLVerifyClient require

[パラメータ設定例:クライアントの証明書が複数のとき]
SSLCACertificatePath "C:/crts"
SSLVerifyClient require

caution
SSLCACertificateFileパラメータとSSLCACertificatePathパラメータは、バーチャルサーバ一つにつきどちらか一つのみ設定できます。両方同時に設定しないように注意してください。
caution
これらのパラメータは、バーチャルサーバ一つにつき一つのみ設定できます。一つのバーチャルサーバに対して複数設定しないように注意してください。


(5) (1)でSSLを有効にしたWebサーバと連動しているドメインを再起動します。