WebOTXではWebサーバとして、Webコンテナに内蔵されているJavaベースのWebサーバと、WebOTX Webサーバ、IIS、Apache などの外部Webサーバが利用できます。ここでは、Webコンテナに内蔵されているJavaベースのWebサーバ、WebOTX WebサーバでTLS/SSL(以降SSLとします)をプライベートCAを立てずに利用する方法について説明します。
ご参考:SSLアクセラレータ |
SSLの暗号化・復号化処理をハードウェアで行い、Webサーバの負荷を軽減する方法があります。これを実現するのが「SSLアクセラレータ」です。SSLアクセラレータは、サーバの拡張スロットに差し込むボード、外付けの専用機、ルータやロードバランサなどのネットワーク機器に内蔵されているものなど、様々なタイプの製品があります。 |
WebOTX Webコンテナに内蔵されているWebサーバでSSLを利用する手順について説明します。ここでは、図1.15.1-1のようなファイル構成を仮定して説明します。単方向/双方向認証と実際に使用するファイル名は、動作させる環境に応じて置き換えてください。
図1.15.1-1
単方向認証を行うためには、サーバのキーストアからサーバ証明書を取り出し、クライアント側のトラストストアへインポートします。 さらに双方向通信を行うためには、単方向通信の設定に加えて、クライアントのキーストアからクライアント証明書を取り出し、サーバ側のトラストストアへインポートします。
以上を設定するための手順として、J2SEのkeytoolコマンドとWebOTXの運用管理コマンド(otxadmin)を利用した場合について説明します。
説明の中で例示しているコマンドが複数行になっていても、必ず1行で実行してください。 |
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
サーバの証明書をエクスポートします。
> keytool -export -alias server -storepass
changeit -file server.cer -keystore
<DOMAIN_ROOT>/config/keystore.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
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
クライアントの証明書をエクスポートします。これは双方向認証(クライアント認証)をするときのみ必要な作業です。
> keytool -export -alias client -storepass
changeit -file client.cer -keystore
clientKey.jks
クライアントのキーストアにサーバの証明書をインポートします。
> keytool -import -trustcacerts -alias server
-file server.cer -keystore client.jks -keypass changeit -storepass
changeit
サーバのキーストアにクライアントの証明書をインポートします。これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。
> keytool -import -trustcacerts -alias client
-file client.cer -keystore <DOMAIN_ROOT>/config/keystore.jks
-keypass changeit -storepass changeit
運用管理コマンドを起動し、サーバアプリケーションを配備するドメインにログインします。続いて、HTTPSリスナのSSLのcertnameを変更します。certnameはSSLの認証に使うエイリアスを指定します。
ドメインへのログインコマンド
otxadmin> login --user admin --password
adminadmin --port 6212
create-sslコマンドはSSL構成により、以下のどちらかを実行してください。
(単方向SSLのとき)
otxadmin> set server.network-config.protocols.protocol.https-listener.ssl.cert-nickname=server
(双方向SSLのとき)
otxadmin> set server.network-config.protocols.protocol.https-listener.ssl.cert-nickname=server
otxadmin> set server.network-config.protocols.protocol.https-listener.ssl.client-auth-enabled=true
ドメインを再起動します。
クライアント環境にクライアントのキーストアを配置します。
クライアントアプリケーションが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()); |
サーバアプリケーションがWebサービスで、EJBサービスエンドポイントの場合、nec-ejb-jar.xmlのwebservice-endpoint要素にtransport-guarantee要素を追加します。値はINTEGRALかCONFIDENTIALにします。
<webservice-endpoint> 〜 <transport-guarantee>INTEGRAL or CONFIDENTIAL</transport-guarantee> </webservice-endpoint> |
クライアントアプリケーション実行時に指定するURLを次のことに注意して変更します。
WebOTX Webコンテナに内蔵されているWebサーバでCA(認証局)を使用してSSLを利用する手順について説明します。ここでは、図1.15.1-2のようなファイル構成を仮定して説明します。単方向/双方向認証と実際に使用するファイル名は、動作させる環境に応じて置き換えてください。
図1.15.1-2
単方向認証を行うためには、CA証明書をサーバ側のキーストアとクライアント側のトラストストアへインポートします。 さらに双方向通信を行うためには、単方向通信の設定に加えて、CA証明書をクライアント側のキーストアとサーバ側のトラストストアへインポートします。
以上を設定するための手順として、OpenSSLのca.plコマンドとJ2SEのkeytoolコマンドとWebOTXの運用管理コマンド(otxadmin)を利用した場合について説明します。
CA(認証局)を利用しない場合の手順1.「サーバ鍵の作成」を実行します。
CAに送るためのサーバ証明書署名要求(CSR)を作成します。
> keytool -certreq -alias server -keystore <DOMAIN_ROOT>/config/keystore.jks -file server_certreq.csr -storepass changeit
テスト用の証明書を作成する場合などで独自にCAを利用する場合に行います。 ここではOpenSSLに含まれるca.plを利用します。 任意のCAの情報を入力する必要があります。
> ca.pl -newca
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
A challenge password []:
An optional company name []:
先に作成したプライベートCAを使ってテスト用の証明書を発行します。
> openssl ca -policy policy_anything -keyfile demoCA\private\cakey.pem -cert demoCA\cacert.pem -in server_certreq.csr -out server_cert.csr
プライベートCAを作成した際の(demoCA\cacert.pem)または正式なCAから入手したCA証明書をキーストアにインポートします。
> keytool -import -noprompt -trustcacerts -alias cacert -file demoCA\cacert.pem -keystore <DOMAIN_ROOT>/config/keystore.jks -storepass changeit
cacert.pemの内容が"-----BEGIN CERTIFICATE-----"から始まっていない場合は、先頭から"-----BEGIN CERTIFICATE-----"までの余計な文字列を削除します。
↓↓↓削除↓↓↓ Certificate: … ↑↑↑削除↑↑↑ -----BEGIN CERTIFICATE----- … -----END CERTIFICATE----- |
プライベートCAで発行したサーバ証明書または正式なCAから発行されたサーバ証明書をキーストアにインポートします。 alias名はインポートするキーストアで鍵を生成した際のalias名に合わせます。
> keytool -import -v -trustcacerts -alias server -file server_cert.csr -keystore <DOMAIN_ROOT>/config/keystore.jks -storepass changeit
server_cert.csrの内容が"-----BEGIN CERTIFICATE-----"から始まっていない場合は、先頭から"-----BEGIN CERTIFICATE-----"までの余計な文字列を削除します。
プライベートCAを作成した際の(demoCA\cacert.pem)または正式なCAから入手したCA証明書をクライアントのトラストストアにインポートします。
> keytool -import -noprompt -trustcacerts -alias cacert -file demoCA\cacert.pem -keystore client.jks -storepass changeit
※これは双方向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
※これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。
CAに送るためのクライアント証明書署名要求(CSR)を作成します。
> keytool -certreq -alias client -keystore clientKey.jks -file client_certreq.csr -storepass changeit
※これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。
先に作成したプライベートCAを使ってテスト用のクライアント証明書を発行します。
> openssl ca -policy policy_anything -keyfile demoCA\private\cakey.pem -cert demoCA\cacert.pem -in client_certreq.csr -out client_cert.csr
※これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。
プライベートCAを作成した際の(demoCA\cacert.pem)または正式なCAから入手したCA証明書をクライアントのキーストアにインポートします。
> keytool -import -noprompt -trustcacerts -alias cacert -file demoCA\cacert.pem -keystore clientKey.jks -storepass changeit
※これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。
プライベートCAで発行したクライアント証明書または正式なCAから発行されたクライアント証明書をクライアントキーストアにインポートします。 alias名は、インポートするキーストアでクライアント鍵を生成した際のalias名に合わせます。
> keytool -import -v -trustcacerts -alias client -file client_cert.csr -keystore clientKey.jks -storepass changeit
client_cert.csrの内容が"-----BEGIN CERTIFICATE-----"から始まっていない場合は、先頭から"-----BEGIN CERTIFICATE-----"までの余計な文字列を削除します。
※これは双方向SSL(クライアント認証をするとき)のみ必要な作業です。
プライベートCAを作成した際の(demoCA\cacert.pem)または正式なCAから入手したCA証明書をサーバトラストストアにインポートします。
> keytool -import -noprompt -trustcacerts -alias cacert -file demoCA\cacert.pem -keystore <DOMAIN_ROOT>/config/cacerts.jks -storepass changeit
CA(認証局)を利用しない場合の手順7〜12を実行します。
WebOTX WebサーハでSSLを利用する手順を説明します。
図1.15.2-1
[コマンド例] |
>otxadmin otxadmin>login --user admin --password adminadmin --port 6212 otxadmin>set server.WebServer.security-enabled=true |
loginコマンドの--portオプションはSSLを有効にしたいWebサーバと連動しているドメインに割り当てられたポート番号を指定します。 |
[コマンド例] |
>openssl genrsa -des3 2048 >vs1.key |
[コマンド例] |
>openssl req -new -x509 -days 365 -key vs1.key >vs1.crt |
コマンド実行後、いくつか聞かれる質問のうち「Common Name (eg, YOUR name)[]:」には、必ずバーチャルサーバのFQDNまたはIPアドレスを指定します。 |
[コマンド例] |
>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 |
-dnameオプションのCNにはクライアントのFQDNまたはIPアドレスを指定します。 |
-keyalg、-keypass、-storepassで指定する値は適宜変更してください。 |
-keystoreで指定している値は、図1.15.2-1に沿ったものです。 |
[コマンド例:自作のトラストストアにインポートする場合] |
>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 |
-keypass、-storepassで指定する値は適宜変更してください。 |
自作のトラストストアにインポートする場合に-keystoreで指定している値は、図1.15.2-1に沿ったものです。 |
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。 |
[パラメータ設定例] |
ServerName vs1.nec.com:443 SSLCertificateKeyFile "C:/key/vs1.key" SSLCertificateFile "C:/crt/vs1.crt" |
これらのパラメータは、バーチャルサーバ一つにつき一つのみ設定できます。 一つのバーチャルサーバに対して複数設定しないように注意してください。 |
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。 |
[コード例] |
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") |
[コマンド例] |
>otxadmin otxadmin>login --user admin --password adminadmin --port 6212 otxadmin>set server.WebServer.security-enabled=true |
loginコマンドの--portオプションはSSLを有効にしたいWebサーバと連動しているドメインに割り当てられたポート番号を指定します。 |
[コマンド例] |
>openssl genrsa -des3 2048 >vs1.key |
[コマンド例] |
>openssl req -new -key vs1.key > vs1.csr |
いくつか聞かれる質問のうち「Common Name (eg, YOUR name) []:」には、必ずバーチャルサーバのFQDNまたはIPアドレスを指定します。 |
-----BEGIN CERTIFICATE REQUEST----- から -----END CERTIFICATE REQUEST----- まで |
-----BEGIN CERTIFICATE REQUEST----- から -----END CERTIFICATE REQUEST----- まで |
[コマンド例] |
>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 |
-dnameオプションのCNにはクライアントのFQDNまたはIPアドレスを指定します。 |
-keyalg、-keypass、-storepassで指定する値は適宜変更してください。 |
キーストアを作成する場合、-keystoreで指定している値は、図1.15.2-1に沿ったものです。 |
クライアントアプリケーションがJavaアプリケーションの場合、ここで作成したキーストアを使いますので、削除しないでください。 |
WebOTXのキーストアは「<Domain_ROOT>/config/keystore.jks」です。 |
keystore.jksのキーストアパスワードの初期値は「changeit」です。 |
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。 |
クライアントアプリケーションをWebブラウザで動作させる場合、キーストアをpkcs#12形式にしないとインポートできないことが多いことに注意してください。キーストア作成の際に「-storetype」オプションを追加して「pkcs12」を指定すると、キーストアはpkcs#12形式になります。 |
[コード例] |
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"); |
WebOTXのキーストア「<Domain_ROOT>/config/keystore.jks」のキーストアパスワードの初期値は「changeit」です。 |
<Domain_ROOT>は(1)でSSLを有効にしたWebサーバと連動しているドメインがインストールされたルートフォルダ(ルートディレクトリ)です。 |
[パラメータ設定例:クライアントの証明書が一つのとき] |
SSLCACertificateFile "C:/crt/client1.crt" SSLVerifyClient require SSLOptions +StdEnvVars +ExportCertData |
[パラメータ設定例:クライアントの証明書が複数のとき] |
SSLCACertificatePath "C:/crts" SSLVerifyClient require SSLOptions +StdEnvVars +ExportCertData |
SSLCACertificateFileパラメータとSSLCACertificatePathパラメータは、バーチャルサーバ一つにつきどちらか一つのみ設定できます。両方同時に設定しないように注意してください。 |
これらのパラメータは、バーチャルサーバ一つにつき一つのみ設定できます。一つのバーチャルサーバに対して複数設定しないように注意してください。 |