• 検索結果がありません。

Oracle JDBCシン・ドライバを使用したSSL

N/A
N/A
Protected

Academic year: 2021

シェア "Oracle JDBCシン・ドライバを使用したSSL"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

Oracle JDBC シン・ドライバを使用した

SSL

Oracle テクニカル・ホワイト・ペーパー

2007 年 11 月

(2)

はじめに ... 3

SSL の使用 ... 3

SSL 設定の概要 ... 4

サーバーにおける設定... 4

JDBC シン・ドライバにおける設定 ... 6

必要な jar ファイル... 6

SSL をアクティブ化する方法 ... 6

関連するプロパティ ... 6

Oracle ウォレットを Java で使用する方法... 7

使用できる暗号スイート ... 9

SSL を暗号化専用で使用する... 9

サーバーの設定... 10

JDBC シン・クライアントの設定 ... 10

SSL を暗号化しサーバー認証に使用する... 10

サーバーの設定... 10

JDBC シン・クライアントの設定 ... 11

トラストストア・フォーマットのタイプが JKS の場合 ... 11

トラストストアがウォレットの場合 ... 11

サーバーの識別名の確認... 12

SSL を暗号化し両方の層の認証に使用する... 12

サーバーの設定... 12

JDBC シン・クライアントの設定 ... 12

キーストア・フォーマットのタイプが JKS の場合... 13

キーストアがウォレットの場合 ... 13

データベースで SSL を認証サービスとして使用する ... 13

サーバーの設定... 14

JDBC シン・クライアントの設定 ... 14

結論 ... 14

付録 A トラブルシューティング... 15

付録 B トラストストアとキーストアの作成 ... 17

orapki の使用 ... 17

テスト CA 用のウォレットの作成... 17

Oracle サーバー用のウォレットの作成... 17

クライアントの場合(サーバーと同様) ... 19

信頼できる証明書だけを格納するウォレットの作成... 19

keytool の使用... 19

JKS キーストアの作成... 19

JKS トラストストアの作成... 21

(3)

Oracle JDBC シン・ドライバを使用した SSL

はじめに

Oracle Advanced Security は、Oracle Database Enterprise Edition の有償オ

プションです。

Oracle Advanced Security には、セキュリティ機能の包括的なスイートが含まれて います。これらの機能により、企業ネットワークは保護され、インターネットへ セキュアに拡張されます。Oracle Advanced Security は、ネットワーク暗号化、デー タ整合性、認証の複数のソリューション、シングル・サインオン・サービス、セ キュリティ・プロトコルを備えた統合のための単一ソースを提供します。 Oracle Databse には非常に機密性の高い情報(従業員レコード、財務レコード、顧 客注文、製品情報など)が含まれていることがあり、そのセキュリティに対する 脅威(データの傍受、データの改ざん、ユーザーID の偽造)のため、セキュリティ が課題となっています。Oracle Advanced Security は、データベースを保護するソ リューションを提供します。

データ暗号化とデータ整合性のためには、Oracle Net のネイティブ暗号化(たとえ ば、Oracle Net 層の AES と SHA1)または Secure Sockets Layer(SSL)のいずれか を設定できます。また、Oracle Advanced Security では、Kerberos、Radius、デジタ ル証明などの強力な認証方法を選択できます。 このホワイト・ペーパーでは、ネットワーク・クライアント層が Oracle JDBC シ ン・ドライバである場合に、SSL を使用する方法を説明します。SSL および JDBC シン・ドライバに詳しい読者を対象としています。Oracle JDBC シン・ドライバで 使用可能なほかのセキュリティ機能の詳細は、『JDBC開発者ガイドおよびリファ レンス』を参照してください。 このホワイト・ペーパーで取り上げるデータベースとドライバの製品バージョン は、10.2.0.3 と 11.1.0.6 です。また、JDK バージョンが JDK5.0 または JDK6.0 であ ることを前提とします。

データベース・サーバー上での Oracle Advanced Security のオプション設定の詳細 は、データベース・ドキュメントの『Advanced Security 管理者ガイド』を参照し てください。

SSL の使用

Secure Sockets Layer(SSL)は、ネットワーク接続を保護するための業界標準プロ トコルです。SSL は、対象鍵暗号化とあわせて RSA 公開鍵暗号化を使用して、認 証、暗号化、およびデータ整合性を提供します。

(4)

Oracle Advanced Security の SSL 機能を使用して、JDBC シン・クライアントとサー バー間の通信を保護することにより、以下のことが可能になります。 認証は、通信の双方の当事者が信頼する サード・パーティである認証局(CA)を 介しておこなわれます。 クライアントとサーバー間の接続を暗号化する • ネットワーク・クライアント層を認証する。データベース・サーバーは、

信頼できる機関が署名した証明をもつ Oracle Application Server などのクラ イアントからの接続のみを受け入れます。データベースが信頼しないクラ イアント層またはアプリケーションから試行される接続は、失敗します。 • データベース層を認証する。JDBC シン・ドライバは、データベースの証 明書を検証するように設定できます。信頼できる機関が署名していない場 合、接続は失敗します。そのため、アプリケーションの観点から、データ ベースの信頼性が証明されます。 • SSL をサーバー上で認証サービスとして使用する(JDBC シン・ドライバ 11.1.0.6 以降)。データベース・ユーザーは、ネットワーク・クライアン ト層とは対照的に、SSL によって認証されます。この場合、データベース の各ユーザーが証明書をもっています。

SSL 機能は、単独でも使用できますが、Oracle Advanced Security でサポートされ ているほかの認証方法とあわせても使用できます。たとえば、JDBC シン・ドライ バの場合、SSL が提供する暗号化と Kerberos が提供する認証を組み合わせて使用 できます(11.1.0.6 以降)。

SSL は、Oracle Database 10g Release 2 の JDBC シン・ドライバで初めてサポートさ れるようになりました。Oracle Database を使用した認証サービスとしての SSL は、 Oracle Database 11g Release 1 の JDBC シン・ドライバで初めてサポートされました。 JDBC シン・ドライバでは、Sun に定義された Java Secure Socket Extension(JSSE) が使用されます。また、SunJSSE と呼ばれる Sun の JSSE プロバイダをデフォルト で使用しますが、ほかのプロバイダ(PKI または SSL プロバイダ)も使用できま す。詳細は、『JSSE Reference Guide』を参照してください。

SSL 設定の概要

この項では、SSL 固有の設定を詳細に説明します。

サーバーにおける設定

リスナーがTCPSプロトコルを使用するように設定されている必要があります。 LISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcps)(HOST=servername)(PORT=2484)) ) サーバーの自動ログイン・ウォレットのロケーションは、sqlnet.oraとlistener.oraの 両方に含まれる必要があります。一般的には、両方のファイルに同一のウォレッ ト・ロケーションが含まれていますが、必ずしも同一である必要はありません。 リスナーが独自のウォレットを使用することもあります。便宜上、このホワイト・ ペーパーでは、sqlnet.oraとlistener.oraが同一のウォレット・ロケーションを使用し ていると仮定します。 ウォレットは、秘密鍵、証明書、および SSL に必要な信頼できる証明書も含めて、 認証と署名の資格証明の格納に使用され る コ ン テ ナ で す 。 Oracle Wallet Manager を使用してウォレットを作成 できます。

(5)

WALLET_LOCATION=(SOURCE=(METHOD=FILE) (METHOD_DATA=(DIRECTORY=/server/wallet/path/))) これで、クライアント認証を有効または無効に設定できます。デフォルトでは有 効になっています。 SSL_CLIENT_AUTHENTICATION=FALSE または SSL_CLIENT_AUTHENTICATION=TRUE この設定は、listener.ora と sqlnet.ora の両方に適用されます。SSL クライアント認 証が有効の場合、JDBC シン・クライアントは、クライアントのデジタル証明を送 信するように設定されている必要があります。デジタル証明は、サーバーに受け 入れられる必要があります。受け入れられない場合は、接続できません。 SSL 認証を使用しない場合にも、サーバー上でウォレットのロケーションを設定 する必要があります。ウォレットの作成方法の詳細は、データベース・ドキュメ ントの『Advanced Security 管理者ガイド』を参照してください。このホワイト・ ペーパーでは、orapki ユーティリティを使用してテスト用のウォレットと証明書 を作成する方法についても説明します(付録 B を参照)。 また、使用可能な暗号スイートのサブセットを使用する場合は、オプションとし て、サーバー上で sqlnet.ora 内に暗号スイートを設定できます。サーバーは、以下 の暗号スイートをサポートします。 暗号スイートに優先順位をつけることが できます。クライアントは、どの暗号ス イートを使用するかに関して、サーバー と交渉する際に設定された優先順位に従 います。 • SSL_RSA_WITH_3DES_EDE_CBC_SHA • SSL_RSA_WITH_RC4_128_SHA • SSL_RSA_WITH_RC4_128_MD5 • SSL_RSA_WITH_DES_CBC_SHA • SSL_DH_anon_WITH_3DES_EDE_CBC_SHA • SSL_DH_anon_WITH_RC4_128_MD5 • SSL_DH_anon_WITH_DES_CBC_SHA • SSL_RSA_EXPORT_WITH_RC4_40_MD5 • SSL_RSA_EXPORT_WITH_DES40_CBC_SHA • SSL_RSA_WITH_AES_128_CBC_SHA • SSL_RSA_WITH_AES_256_CBC_SHA 最後の 2 つの暗号は、TLS プロトコルを使用し、Java では、SSL_xxx ではなく、 TLS_xxx という名前がつけられます。これらの暗号の意味についての詳細は、 『Advanced Security管理者ガイド』を参照してください。 た と え ば 、 SSL_RSA_WITH_AES_128_CBC_SHA ま た は SSL_DH_anon_WITH_3DES_EDE_CBC_SHAのいずれかを使用する接続のみを受 け入れるようにサーバーを設定するには、sqlnet.oraに以下を追加します。 暗号化スイートを強力なものから弱いも のへ優先順位をつけ、可能な限り最高の セキュリティを確保します。 SSL_CIPHER_SUITES=(SSL_RSA_WITH_AES_128_CBC_SHA, SSL_DH_anon_WITH_3DES_EDE_CBC_SHA)

(6)

このような設定で、ネットワーク・クライアントがSSL認証を使用しない場合は、 SSL_DH_anon_WITH_3DES_EDE_CBC_SHAを使用する必要があります。そうし ないと、SSL_RSA_WITH_AES_128_CBC_SHAが使用されます。

JDBC シン・ドライバにおける設定

必要な jar ファイル

10.2 以降、ojdbc14.jar は、JDK1.4 を使 用 し て コ ン パ イ ル さ れ て い ま す が 、 JDK5.0 または JDK6.0 も使用できます。 10.2.0.3の場合 以下の JDBC jar が必要です($ORACLE_HOME/jdbc/lib)。 • ojdbc14.jar Oracle PKI プロバイダが必要な場合(クライアント上でウォレットを使用する場 合)、以下の jar も必要です($ORACLE_HOME/jlib)。 • oraclepki.jar • ojpse.jar 11.1.0.6の場合 JDK5.0 を 使 用 し て コ ン パ イ ル さ れ た JDBC jar が 必 要 で す ($ORACLE_HOME/jdbc/lib)。 • ojdbc5.jar 注:JDK6.0 を使用する場合は、JDK6.0 を使用してコンパイルした ojdbc6.jar も使 用できます。 Oracle PKI プロバイダが必要な場合(クライアント上でウォレットを使用する場 合)、以下の jar も必要です($ORACLE_HOME/jlib)。 • oraclepki.jar • osdt_cert.jar • osdt_core.jar

SSL をアクティブ化する方法

JDBC シン・ドライバで SSL をアクティブ化するには、すべての JDBC URL で“tcps” プロトコルが使用されている必要があります。 たとえば、次の URL は SSL をアクティブ化します。 jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps) (HOST=servername)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=servicename)))

関連するプロパティ

使用する SSL の機能に応じて、次のプロパティの設定が必要になる場合がありま す。これらのプロパティは、接続プロパティまたはシステム・プロパティを介し て設定できます。

(7)

Diffie-Hellman 匿名認証を使用しない暗号スイートを使用する場合は、“トラスト ストア”を提供する必要があります。トラストストアは、証明書が信頼できるサー バーによって発行されたことを証明します。“トラストストア”には、秘密鍵は含 まれていませんが、認証局(CA)の証明書など、信頼できる証明書のエントリが 含まれています。次の JSEE プロパティは、“トラストストア”の設定に使用できま す。 • javax.net.ssl.trustStore • javax.net.ssl.trustStoreType • javax.net.ssl.trustStorePassword サーバー上でクライアント認証が有効になっている場合は、“キーストア“を提供 する必要があります。“キーストア”には、クライアントの証明書が含まれていま す。次の JSEE プロパティは、“キーストア”の設定に使用できます。 • javax.net.ssl.keyStore • javax.net.ssl.keyStoreType • javax.net.ssl.keyStorePassword デフォルトで使用可能な暗号スイートのサブセットを有効にするには、次のプロ パティを使用します。 • oracle.net.ssl_cipher_suites 次のプロパティを使用して、識別名の一致検証をドライバに強制できます。 • oracle.net.ssl_server_dn_match SSL を認証サービスとしてデータベース内でアクティブ化するために、次のプロ パティが使用されます(11.1 で導入)。 • oracle.net.authentication_services これらのプロパティを使用する方法についての詳細は、次の項で説明します。 注:“oracle.net.wallet_location”プロパティについて。 11.1.0.6 と 10.2.0.3 には、このプロパティの使用に関連したバグと制限がい くつかあります。たとえば、MS Windows では、ウォレット・ロケーショ ンにドライブ文字を入力できません。このホワイト・ペーパーでは、この プロパティを使用しないことを前提とします。

Oracle ウォレットを Java で使用する方法

Oracle Wallet Manager または“orapki”(付録 B を参照)によって作成されたウォレッ トは、標準的な PKCS12 フォーマットを使用して、X.509 証明書および秘密鍵を 保存します。このウォレットは、“ewallet.p12”という名前のファイルに保存されま す。

(8)

Sun が提供する PKCS12 実装には、いくつかの非互換性があります。そのため、Java から Oracle ウォレットにアクセスするには、“OraclePKI”という名前の Oracle の PKI プロバイダを使用する必要があります。

ウォレットの自動ログインを有効にすると、ファイル“cwallet.sso”に、ウォレット の不明瞭化されたコピーが作成されます。このコピーは、パスワードを入力せず に使用できます。このような自動ログイン・ウォレットのフォーマットは、Oracle Single Sign-On インフラストラクチャで使用されるので、拡張子“sso”がつきます。 Java から自動ログイン・ウォレット(このホワイト・ペーパーでは SSO ウォレッ トとも呼びます)にアクセスするには、Oracle の PKI プロバイダも使用する必要 があります。 JSSE では、2 つの方法でプロバイダを有効にできます。1 つは動的な方法、もう 1 つは静的な方法です。 ウォレットを使用する場合は、Oracle の PKI プロバイダを有効にする必要があり ます。 OraclePKIプロバイダを静的に有効にする方法

SSO ウォレット(cwallet.sso)を使用する場合、Oracle の PKI プロバイダは、以下 に示すように、ファイル java.security(JRE インストールに含まれています)のプ ロバイダ・リストの最後に追加することによって、静的に有効化できます。 security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=com.sun.net.ssl.internal.ssl.Provider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=sun.security.jgss.SunProvider security.provider.6=com.sun.security.sasl.Provider security.provider.7=oracle.security.pki.OraclePKIProvider ほかのプロバイダがタイプ“SSO”をサポートする場合は、Oracle の PKI プロバイ ダのあとに追加します。 PKCS12 ウォレット(ewallet.p12)を使用する場合、Oracle の PKI プロバイダをポ ジション#3 または Sun のプロバイダよりも前に移動する必要があります。Sun の プロバイダも PKCS12 をサポートしますが、Oracle のウォレットとは互換性があ りません。したがって、java.security のプロバイダのリストは、以下のようになり ます。 security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=oracle.security.pki.OraclePKIProvider security.provider.4=com.sun.net.ssl.internal.ssl.Provider security.provider.5=com.sun.crypto.provider.SunJCE security.provider.6=sun.security.jgss.SunProvider security.provider.7=com.sun.security.sasl.Provider 新しい接続を作成する前に、OraclePKIProviderをインスタンス化して、クラスが ロードされ、初期化されるようにする必要もあります。 new oracle.security.pki.OraclePKIProvider(); OraclePKIプロバイダを動的に有効にする方法 JavaコードでSystem.addProviderまたはSystem.insertProviderAtを呼 び出すことによって、プロバイダを動的に有効化できます。 SSO ウォレットを使用する場合、順序は重要ではないので(SSO にほかのプロバ イダがないと仮定した場合)、Oracle の PKI プロバイダを“追加”するだけです。

(9)

Security.addProvider(new oracle.security.pki.OraclePKIProvider()); PKCS12 ウォレットを使用する場合、Oracle の PKI プロバイダをポジション#3 に 挿入する必要があります。 Security.insertProviderAt( new oracle.security.pki.OraclePKIProvider(),3); TLS_RSA_WITH_AES_256_CBC_SHA

は 、 JCE Unlimited Strength Jurisdiction Policy Files のインストー

ルを必要とします。J2SE 5 ダウンロー ド・ページを参照してください。

使用できる暗号スイート

SSL ハンドシェイクの間に、両方の層が使用する暗号スイートを決定します。JSSE は、多数の暗号スイートを定義しますが、使用できるのは、Oracle Database サー バーがサポートする暗号スイートに対応するものだけです。データベースがサ ポートするすべての暗号は、JSSE で定義され、Sun の SSL プロバイダにサポート されます。 以下のサブセットがサポートされます(Java の暗号名)。 − SSL_RSA_WITH_3DES_EDE_CBC_SHA − SSL_RSA_WITH_RC4_128_SHA − SSL_RSA_WITH_RC4_128_MD5 (default) − SSL_RSA_WITH_DES_CBC_SHA − SSL_DH_anon_WITH_3DES_EDE_CBC_SHA − SSL_DH_anon_WITH_RC4_128_MD5 − SSL_DH_anon_WITH_DES_CBC_SHA − SSL_RSA_EXPORT_WITH_RC4_40_MD5 − SSL_RSA_EXPORT_WITH_DES40_CBC_SHA − TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA

Transport Layer Security(TLS)は、

基本的には、SSL バージョン 3.0 の段階 的な改良です。 これらの暗号スイートの名前は、SSL_xxx が TLS_xxx に変わる最後の 2 つを除い て、データベース内の名前と同じです。 これらの暗号スイートの名前をoracle.net.ssl_cipher_suitesプロパティ で使用して、定義されたスイートだけをSSLハンドシェイクに使用できます。 暗号スイートがサーバーでもクライアントでも指定されない場合、暗号スイート のネゴシエーションの結果はSSL_RSA_WITH_RC4_128_MD5になります。 次の項では、SSL に JDBC シン・ドライバを設定する手順を説明します。暗号化 に SSL だけを使用し、サーバーもクライアントも認証しない、もっとも簡単なケー スから始めます。次に、SSL を使用してサーバーを認証します。その後、サーバー とクライアントの両方を認証し、最後に SSL をデータベース内の認証サービスと して使用します。

SSL を暗号化専用で使用する

二重の暗号化が禁止されているので、 SSL 暗号化を設定する場合は、SSL 以外 の暗号化を無効にする必要があります。 暗号化とデータ整合性だけを目的として SSL を使用するもっとも基本的なケース を検討します。このケースでは、Diffie-Hellman 匿名認証を使用します。それ以外 の場合は、接続に失敗します。 このケースには、次の暗号スイートを使用できます。 (SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DH_anon_WITH_DES_CBC_SHA)

(10)

Diffie-Hellman 匿名認証では、サーバーもクライアントも認証されません。

サーバーの設定

クライアント認証を無効にするようにリスナーを設定する必要があります。典型 的な設定では、listener.ora ファイルの内容は次のようになります。 LISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcps)(HOST=servername)(PORT=2484)) ) WALLET_LOCATION=(SOURCE=(METHOD=FILE) (METHOD_DATA=(DIRECTORY=/server/wallet/path))) SSL_CLIENT_AUTHENTICATION=FALSE 同様に、SSL クライアント認証を sqlnet.ora で無効にする必要があります。 WALLET_LOCATION=(SOURCE=(METHOD=FILE) (METHOD_DATA=(DIRECTORY=/server/wallet/path))) SSL_CLIENT_AUTHENTICATION=FALSE

JDBC シン・クライアントの設定

“トラストストア”も“キーストア”も設定する必要はありません。ただし、暗号ス イートに Diffie-Hellman 匿名認証の使用を強制する必要があります。

String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps) (HOST=servername)(PORT=2484))

(CONNECT_DATA=(SERVICE_NAME=servicename)))"); Properties props = new Properties();

props.setProperty("user", "scott"); props.setProperty("password", "tiger"); props.setProperty("oracle.net.ssl_cipher_suites", "(SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DH_anon_WITH_DES_CBC_SHA)"}; Connection conn=DriverManager.getConnection(url,props); プロパティoracle.net.ssl_server_dn_matchを"true"に設定すると、接続 は失敗し、“peer not authenticated”という例外メッセージが表示されます。 これは、JDBCシン・ドライバがサーバーを認証できないため、サーバーの識別名 がURLからの識別名と一致することを確認できないからです。 SSL は、11.1.0.6 以降の JDBC シン・ド ラ イ バ を 使 用 す る Kerberos ま た は Radius など、ほかの認証方法と組み合わ せることができます。

SSL を暗号化しサーバー認証に使用する

Diffie-Hellman 匿名認証を使用する暗号スイート以外なら、どのような暗号スイー トでも使用できます。

サーバーの設定

サーバーの設定は変更しません。

(11)

JDBC シン・クライアントの設定

“トラストストア”は、サーバーの証明書を確認するために使用されます。“トラス トストア”に格納されている信頼できる証明書が、サーバーの証明書の確認に使用 できない場合、接続は失敗し、“unable to find valid certification path to requested target”という例外メッセージが(Sun のデフォルトの SSL プロバイダとともに) 表示されます。 公開鍵インフラストラクチャ(PKI)は、 トラスト・アサーションに基づいて、組 織全体にセキュリティの基盤を提供する ネットワーク・コンポーネントの基礎を 構成します。 フォーマットのプロバイダを指定する限り、“トラストストア”の任意のフォー マットを使用できます。Sun のデフォルトの PKI プロバイダは、“トラストストア” の JKS フォーマットをサポートします。ウォレットは、Oracle の PKI プロバイダ でも使用できます。

トラストストア・フォーマットのタイプが JKS の場合

次のコードは、JKS トラストストアを設定する方法を示しています。例として、 パスは MS Windows スタイルで指定されています。

String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps) (HOST=servername)(PORT=2484))

(CONNECT_DATA=(SERVICE_NAME=servicename)))"); Properties props = new Properties();

props.setProperty("user", "scott"); props.setProperty("password", "tiger"); props.setProperty("javax.net.ssl.trustStore", "D:¥¥truststore¥¥truststore.jks"); props.setProperty("javax.net.ssl.trustStoreType","JKS"); props.setProperty("javax.net.ssl.trustStorePassword","welcome123"); Connection conn = DriverManager.getConnection(url, props);

トラストストアがウォレットの場合

ウォレットを使用して、信頼できる証明書を保存できます。ウォレットを使用す るには、Oracle の PKI プロバイダを有効にする必要があります。

次の Java コードは、PKCS12 ウォレットをトラストストアとして使用する方法を 示しています(パスは UNIX スタイルで指定されています)。

String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps) (HOST=servername)(PORT=2484))

(CONNECT_DATA=(SERVICE_NAME=servicename)))"); Properties props = new Properties();

props.setProperty("user", "scott"); props.setProperty("password", "tiger"); props.setProperty("javax.net.ssl.trustStore", "/truststore/ewallet.p12"); props.setProperty("javax.net.ssl.trustStoreType","PKCS12"); props.setProperty("javax.net.ssl.trustStorePassword","welcome123"); Connection conn = DriverManager.getConnection(url, props);

SSO ウォレットを使用する場合、つまり“トラストストア”ウォレットを作成した ときに、“自動ログイン”を有効にした場合

props.setProperty("javax.net.ssl.trustStore", "/truststore/cwallet.sso");

(12)

サーバーの識別名の確認

サーバーが正常に認証されると(証明書が信頼されると)、識別名の確認が可能 になります。 期待される識別名は、次の例のように、JDBC URL で指定されます。 jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps) (HOST=servername)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=servicename)) (SECURITY=(SSL_SERVER_CERT_DN=¥"CN=server_test,C=US¥"))) サーバーの識別名の確認を JDBC シン・ドライバに強制するには、次のプロパティ も使用する必要があります。 props.setProperty("oracle.net.ssl_server_dn_match", "true"); サーバーの証明書の識別名が、URL で指定された識別名と一致しない場合、接続 は失敗し、次の例外メッセージが表示されます。“Mismatch with the server cert DN”

SSL を暗号化し両方の層の認証に使用する

サーバーの設定

クライアント認証を有効にするようにリスナーを設定する必要があります。典型 的な設定では、listener.ora ファイルの内容は次のようになります。 LISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcps)(HOST=servername)(PORT=2484)) ) WALLET_LOCATION=(SOURCE=(METHOD=FILE) (METHOD_DATA=(DIRECTORY=/server/wallet/path))) SSL_CLIENT_AUTHENTICATION=TRUE 同様に、SSL クライアント認証を sqlnet.ora で有効にする必要があります。 WALLET_LOCATION=(SOURCE=(METHOD=FILE) (METHOD_DATA=(DIRECTORY=/server/wallet/path))) SSL_CLIENT_AUTHENTICATION=TRUE ウォレットのロケーションは、listener.ora と sqlnet.ora で同一である必要がありま す。

JDBC シン・クライアントの設定

前項のように、“トラストストア”を指定する必要があります。 サーバー上でクライアントを認証する必要があるので、“キーストア”も指定する 必要があります。“キーストア”には、認証に使用されるクライアント証明書だけ ではなく、暗号化に使用される秘密鍵/公開鍵のセットも含まれています。

(13)

フォーマットのプロバイダを指定する限り、“キーストア”の任意のフォーマット を使用できます。Sun のデフォルトの PKI プロバイダは、JKS と PKCS12 をサポー トします(詳細は、JSSE ドキュメントを参照してください)。 “キーストア”に PKCS12 ウォレットを使用する場合は、Oracle の PKI プロバイダ を使用する必要があります。JKS キーストアを使用する場合は、Sun の PKI プロ バイダが使用されます。PKCS12 または SSO ウォレットを使用する場合は、Oracle の PKI プロバイダを使用する必要があります。 キーストアを提供しない場合、サーバーはクライアント証明書を確認できず、SSL ハンドシェイクは実行されません。接続は失敗し、次の例外メッセージが表示さ れます。“Received fatal alert:bad_certificate”

キーストア・フォーマットのタイプが JKS の場合

次のコードでは、“props”が接続プロパティです。キーストアのロケーションは、 MS Windows スタイルで指定されています。 props.setProperty("javax.net.ssl.keyStore", "D:¥¥client_jks¥¥keystore.jks"); props.setProperty("javax.net.ssl.keyStoreType","JKS"); props.setProperty("javax.net.ssl.keyStorePassword","welcome123");

キーストアがウォレットの場合

この場合にも、Oracle の PKI プロバイダを有効にする必要があります。 PKCS12 ウォレットを使用する場合(パスは UNIX スタイルで指定されます) props.setProperty("javax.net.ssl.keyStore", "/client_wallet/ewallet.p12"); props.setProperty("javax.net.ssl.keyStoreType","PKCS12"); props.setProperty("javax.net.ssl.keyStorePassword","welcome123"); SSO ウォレットを使用する場合(パスワードは不要) props.setProperty("javax.net.ssl.keyStore", "/truststore/cwallet.sso"); props.setProperty("javax.net.ssl.keyStoreType","SSO"); SSL によるデータベース・ユーザーの認 証は、11.1.0.6 以降の JDBC シン・ドラ イバでサポートされます。

データベースで SSL を認証サービスとして使用する

識別名で確認されるデータベース・ユーザーは、SSL によって認証できます。こ のためには、SSL クライアント認証を有効にする必要があります。サーバーは、 SSL ハンドシェイク中にクライアントの資格証明を確認します。SSL 認証サービ スが有効になっている場合、データベース・ユーザーは、SSL 資格証明を通して、 データベースによって認証されます。 前項では、クライアントの証明書が、アプリケーション・サーバーで実行してい るアプリケーションなどのネットワーク・クライアントを識別することを確認し ました。この項では、クライアントの証明書がデータベース・ユーザーを識別し ます。

(14)

サーバーの設定

リスナーの設定は、前項と同じです。

前項の設定に加えて、ファイル sqlnet.ora の SSL 認証サービスを有効にする必要が あります。

SQLNET.AUTHENTICATION_SERVICES = (tcps, beq, none)

外部で識別名として識別されるユーザーを作成する必要があります。次に例を示 します。

SQL> create user sslclient identified externally as 'CN=client_test,C=US';

User created.

SQL> grant connect,create session to sslclient; Grant succeeded.

JDBC シン・クライアントの設定

JDBC側で、接続プロパティ“oracle.net.authentication_services”を使 用して、SSL認証をアクティブ化する必要があります。SSL認証を使用する場合、 ユーザー名とパスワードの入力は不要になりましたが、入力すると、指定したユー ザー名がデータベース認証中に使用されます。 次のコードでは、SSO ウォレットが使用されていますが、JKS または PKCS12 も 使用できます。

String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps) (HOST=servername)(PORT=2484))

(CONNECT_DATA=(SERVICE_NAME=servicename)))"); Properties props = new Properties();

props.setProperty("oracle.net.authentication_services","(TCPS)"); props.setProperty("javax.net.ssl.trustStore", "D:¥¥truststore¥¥cwallet.sso"); props.setProperty("javax.net.ssl.trustStoreType","SSO"); props.setProperty("javax.net.ssl.keyStore", "D:¥¥client_wallet¥¥cwallet.sso"); props.setProperty("javax.net.ssl.keyStoreType","SSO"); Connection conn = DriverManager.getConnection(url, props);

結論

SSL は、暗号化、データ整合性、両方のネットワーク層の認証を含む、高レベル のセキュリティを提供します。これらのすべての機能は、JDBC シン・ドライバを 使用する場合に使用可能で、簡単に設定できます。JDBC シン・ドライバで Java アプリケーションを保護する柔軟、強力かつ簡単な方法を探している場合、有効 な解決策として SSL の使用が考えられます、

(15)

付録 A トラブルシューティング

この項には、JDBC シン・ドライバを SSL 用に設定する際に発生する可能性のあ る例外のリストを記載します(このリストは限定的なものです)。 • “java.lang.NoClassDefFoundError:com/phaos/crypto/AuthenticationException” :10.2.0.4 を使用しているので、CLASSPATH に ojpse.jar を含める必要が あります。 • “java.lang.NoClassDefFoundError:oracle/security/crypto/core/AuthenticationEx ception”:11.1.0.x を使用しているので、CLASSPATH に osdt_core.jar を含 める必要があります。

• “java.lang.NoClassDefFoundError:oracle/security/crypto/cert/PKCS12”:11.1.0.x を使用しているので、CLASSPATH に osdt_cert.jar を含める必要がありま す。

• “java.sql.SQLException:Io exception:The Network Adapter could not establish the connection”:この例外は、非常に一般的で、多数の構成上の問題によ り発生します。10.2.0.3 および 11.1.0.6 では、原因が表示されませんが、以 下の可能性があります。

o “Unable to initialize the key store.java.io.FileNotFoundException: D:¥truststore (The system cannot find the path specified)”:トラスト ストアのプロパティで指定されたパスが不適切です(キーストア

でも同じことが発生する場合があります)。

o “java.security.KeyStoreException:SSO not found”:SSOトラストスト アのタイプは指定したが、OracleのPKIプロバイダ

(Security.addProvider(new

oracle.security.pki.OraclePKIProvider());)を有効 にしなかったことが原因です。

o “java.io.IOException:Invalid keystore format”:たとえば、トラスト ストアのタイプ javax.net.ssl.trustStoreType = SSOを 指 定 せ ず に 、 javax.net.ssl.trustStore = D:¥¥cwallet.ssoを設定した場合に発生します。

o “java.io.IOException:failed to decrypt safe contents entry:java.lang.ArithmeticException:/ by zero because this is needed”:PKCS12 ウォレットを使用する場合は、ポジション#3 以 上 ( Security.insertProviderAt(new oracle.security.pki.OraclePKIProvider(),3);)に設 定したOracle PKIプロバイダを使用する必要があります。

(16)

o “com.phaos.ASN1.ASN1FormatException:com.phaos.crypto.CipherE xception:Invalid padding string (or incorrect password)”:(PKCS12 ウォレットを使用している場合)パスワードが欠落していること が原因です。

• “java.sql.SQLException:Io exception:Remote host closed connection during handshake”:listener.log ファイルを調べます。“TNS-12560: TNS:protocol adapter error”または“TNS-00540: SSL protocol adapter failure”のいずれかが あるはずです。リスナーを停止し、listener.ora にウォレット・ロケーショ ンを追加して、再起動する必要があります。

• “java.sql.SQLException:Io

exception:sun.security.validator.ValidatorException:PKIX path building failed:sun.security.provider.certpath.SunCertPathBuilderException:unable to find valid certification path to requested target”:クライアントのトラストストアに、 (サーバーのウォレットに格納されている)サーバーの証明書を承認する

パスがありません。また、sqlnet.ora と listener.ora の両方が同じウォレッ ト ・ ロ ケ ー シ ョ ン を 指 し て い る こ と を 確 認 す る 必 要 が あ り ま す 。 “listener.ora”でウォレット・ロケーションを変更した場合は、リスナーを 再起動する必要があります。

• “java.sql.SQLException:Io exception:Received fatal alert:bad_certificate” : listener.ora ファイルおよび sqlnet.ora ファイルで SSL クライアント認証を 無効にするか(ssl_client_authentication=false)、有効なキーストアを提供 します。

• “java.sql.SQLException:Io

exception:sun.security.validator.ValidatorException:No trusted certificate found”:トラストストアを提供するか、匿名認証を使用する暗号スイート を使用する必要があります。

• “java.sql.SQLException:Io exception:Received fatal alert:handshake_failure”:た とえば、クライアントとサーバーが、使用する暗号スイートを決定できな い場合に発生します。

• “java.sql.SQLException:Io exception:java.lang.RuntimeException:Unexpected error:java.security.InvalidAlgorithmParameterException:the trustAnchors parameter must be non-empty”:PKCS12 ウォレットの使用時に、Oracle の PKI プロバイダが正しく有効化されていない場合に発生します。この例外 は、Oracle ウォレットと互換性のない Sun(Sun の PKI プロバイダ)の PKCS12 の実装に起因します。PKCS12 ウォレットを使用する場合、Oracle の PKI プロバイダを静的または動的に正しく有効化する必要があります。 • “java.sql.SQLException:Io exception:Broken pipe”:この例外は、クライアン

ト認証がサーバー上で有効であり、クライアントが送信した証明書をサー バーが確認できない場合に発生するので、SSL ハンドシェイクは失敗しま す。通常、これは、トラストストアが正確であり、キーストアが正確でな いことを意味します。

(17)

付録 B トラストストアとキーストアの作成

orapki の使用

テスト CA 用のウォレットの作成

テストの目的で、“root”と呼ばれる CA を使用します。この CA には自己署名証明 書があります。 ルート・ディレクトリに空のウォレットを作成します。 > orapki wallet create -wallet ./root

/root ディレクトリに ewallet.p12 ができます。 自己署名証明書をウォレットに追加します。

> orapki wallet add -wallet ./root -dn CN=root_test,C=US -keysize 2048 -self_signed -validity 3650

ウォレットを表示します。

> orapki wallet display -wallet ./root Requested Certificates: User Certificates: Subject: CN=root_test,C=US Trusted Certificates: Subject: CN=root_test,C=US (&) 証明書をエクスポートします。

> orapki wallet export -wallet ./root -dn CN=root_test,C=US -cert ./root/b64certificate.txt

Oracle サーバー用のウォレットの作成

自動ログインを有効にして、空のウォレットを作成します。 > orapki wallet create -wallet ./server -auto_login サーバー・ディレクトリに 2 つのファイルが作成されます。 server/cwallet.sso server/ewallet.p12

ウォレットにユーザーを追加します(公開鍵/秘密鍵の新しいペアが作成されま す)。

> orapki wallet add -wallet ./server -dn CN=server_test,C=US -keysize サーバーのウォレットを表示すると、要求された証明書が次のように表示されま す。

Requested Certificates:

(18)

証明書要求をファイルにエクスポートします。

> orapki wallet export -wallet ./server -dn CN=server_test,C=US -request ./server/creq.txt

テスト CA を使用して、証明書要求に署名します。

> orapki cert create -wallet ./root -request ./server/creq.txt -cert ./server/cert.txt -validity 3650

サーバー・ディレクトリには以下のファイルがあります。 server/cert.txt server/creq.txt server/cwallet.sso server/ewallet.p12

署名された証明書を表示します。

> orapki cert display -cert ./server/cert.txt -complete

{ fingerprint = cb384d05b627d2cb20f0499781f704f6, notBefore = Tue Nov 13 17:44:47 PST 2007, notAfter = Fri Nov 10 17:44:47 PST 2017, holder = CN=server_test,C=US, issuer = CN=root_test,C=US, serialNo = 0, sigAlgOID = 1.2.840.113549.1.1.4, key = { modulus =

1959367951374601576535596271107995277417664424536098395399265269124721 8377994361345161198275934214447477226820230208385849110018924496387704 4484639443652466378093963161320192391160905740289465375255115252978607 9834099013465953836979377789767891049188057304407921469766478339671147 3736713730827796216908755554377710566510839206341716045058853599226754 8460749873033793093373387298332477942247788814090235867746623126621826 9319505528877172776186889553531222971886597798361091355959715918186264 3061313984478003607762017842505744116997048267905434071794600231924974 969198032240336875590366035431182383935713771751264581303, exponent = 65537 } } テスト CA の信頼できる証明書をウォレットに追加します。 > orapki wallet add -wallet ./server -trusted_cert -cert ./root/b64certificate.txt

この段階でサーバーの証明書を表示する場合は、信頼できる証明書のリストの新 しいエントリを確認する必要があります。

Subject: CN=root_test,C=US

最後に、ユーザーの証明書をウォレットに追加します。

> orapki wallet add -wallet ./server -user_cert -cert ./server/cert.txt

サーバーの証明書は次のように表示されます。 Requested Certificates: User Certificates: Subject: CN=server_test,C=US Trusted Certificates: Subject: CN=root_test,C=US (...) 前のステップで信頼できる証明書を追加していない場合、次のエラーが発生しま す。

Could not install user cert at./client/cert.txt

(19)

クライアントの場合(サーバーと同様)

> orapki wallet create -wallet ./client_wallet -auto_login

> orapki wallet add -wallet ./client_wallet -dn CN=client_test,C=US -keysize 2048

> orapki wallet export -wallet ./client_wallet -dn CN=client_test,C=US -request ./client_wallet/creq.txt

> orapki cert create -wallet ./root -request ./client_wallet/creq.txt -cert ./client_wallet/cert.txt -validity 3650

> orapki wallet add -wallet ./client_wallet -trusted_cert -cert ./root/b64certificate.txt

> orapki wallet add -wallet ./client_wallet -user_cert -cert ./client_wallet/cert.txt

信頼できる証明書だけを格納するウォレットの作成

トラストストア専用で使用されるウォレットの場合は以下のようになります。 > orapki wallet create -wallet ./truststore -auto_login

> orapki wallet add -wallet ./truststore -trusted_cert -cert ./root/b64certificate.txt

> orapki wallet display -wallet ./truststore Requested Certificates: User Certificates: Trusted Certificates: (...) Subject: CN=root_test,C=US

keytool の使用

JKS キーストアの作成

‘CN=client_test, C=US’に秘密鍵/公開鍵の新しいペアを作成します。

> keytool -genkey -alias testclient -dname 'CN=client_test, C=US' -storepass 'welcome123' -storetype JKS

-keystore ./client_jks/client.jks -keyalg RSA

CSR(証明書署名要求)を生成します。

> keytool -certreq -alias testclient -file ./client_jks/csr.txt -keystore ./client_jks/client.jks -storepass 'welcome123'

テスト CA(root)を使用して、クライアント証明書に署名します。

> orapki cert create -wallet ./root -request ./client_jks/csr.txt -cert ./client_jks/cert.txt -validity 3650

(20)

> keytool -import -v -alias testclient -file ./client_jks/cert.txt -keystore ./client_jks/client.jks -storepass 'welcome123'

keytool error:java.lang.Exception:Failed to establish chain from reply

テスト CA の証明書もインポートする必要があります。

> keytool -import -v -alias testroot -file ./root/b64certificate.txt -keystore ./client_jks/client.jks -storepass 'welcome123'

再度、署名された証明書をインポートします。

> keytool -import -v -alias testclient -file ./client_jks/cert.txt -keystore ./client_jks/client.jks -storepass 'welcome123'

以下を呼び出すことによって、いつでもキーストアを表示できます。 > keytool -list -keystore ./client_jks/client.jks -storepass 'welcome123' -v

Keystore type:jks Keystore provider:SUN

Your keystore contains 2 entries Alias name:testroot Creation date:Nov 13, 2007 Entry type:trustedCertEntry Owner:CN=root_test, C=US Issuer:CN=root_test, C=US Serial number:0

Valid from:Tue Nov 13 17:33:19 PST 2007 until:Fri Nov 10 17:33:19 PST 2017 Certificate fingerprints: MD5:71:66:1B:34:F3:40:75:5C:A1:B1:5E:D5:98:E6:60:ED SHA1:13:C6:35:F8:EF:48:0F: 75:04:99:02:F2:B4:A4:DA:CE:BE:E0:65:9F ******************************************* ******************************************* Alias name:testclient Creation date:Nov 13, 2007 Entry type:keyEntry Certificate chain length:2 Certificate[1]:

Owner:CN=client_test, C=US Issuer:CN=root_test, C=US Serial number:0

Valid from:Tue Nov 13 18:44:49 PST 2007 until:Fri Nov 10 18:44:49 PST 2017 Certificate fingerprints: MD5:67:5A:17:E8:08:B6:49:3D:71:9F:C6:83:C8:5F:4D:3A SHA1:D3:DF:4E:6C:6E:4E:11:3B:83:7C:12:B8:1E: 8B:D7:F1:47:AE:DF:80 Certificate[2]: Owner:CN=root_test, C=US Issuer:CN=root_test, C=US

(21)

Serial number:0

Valid from:Tue Nov 13 17:33:19 PST 2007 until:Fri Nov 10 17:33:19 PST 2017 Certificate fingerprints: MD5:71:66:1B:34:F3:40:75:5C:A1:B1:5E:D5:98:E6:60:ED SHA1:13:C6:35:F8:EF:48:0F: 75:04:99:02:F2:B4:A4:DA:CE:BE:E0:65:9F ******************************************* *******************************************

JKS トラストストアの作成

テスト CA の証明書をインポートします。

> keytool -import -v -alias testroot -file ./root/b64certificate.txt - keystore ./truststore/truststore.jks -storetype JKS -storepass welcome123

トラストストアを表示して、テスト CA の証明書が存在することを確認します。 > keytool -list -keystore ./truststore/truststore.jks -storepass 'welcome123' -v

Keystore type:jks Keystore provider:SUN

Your keystore contains 1 entry Alias name:testroot Creation date:Nov 13, 2007 Entry type:trustedCertEntry Owner:CN=root_test, C=US Issuer:CN=root_test, C=US Serial number:0

Valid from:Tue Nov 13 17:33:19 PST 2007 until:Fri Nov 10 17:33:19 PST 2017 Certificate fingerprints: MD5:71:66:1B:34:F3:40:75:5C:A1:B1:5E:D5:98:E6:60:ED SHA1:13:C6:35:F8:EF:48:0F: 75:04:99:02:F2:B4:A4:DA:CE:BE:E0:65:9F ******************************************* *******************************************

(22)

Oracle JDBC シン・ドライバを使用した SSL 2007 年 11 月

著者:Jean de Lavarene

共著者:Benjamin Job、Kuassi Mensah Oracle Corporation World Headquarters 500 Oracle Parkway Redwood Shores, CA 94065 U.S.A. 海外からのお問い合わせ窓口: 電話:+1.650.506.7000 ファクシミリ:+1.650.506.7200 www.oracle.com

Copyright © 2007, Oracle. All rights reserved.

本文書は情報提供のみを目的として提供されており、ここに記載される内容 は予告なく変更されることがあります。本文書は一切間違いがないことを保 証するものではなく、さらに、口述による明示または法律による黙示を問わ ず、特定の目的に対する商品性もしくは適合性についての黙示的な保証を含 み、いかなる他の保証や条件も提供するものではありません。オラクル社は 本文書に関するいかなる法的責任も明確に否認し、本文書によって直接的ま たは間接的に確立される契約義務はないものとします。本文書はオラクル社 の書面による許可を前もって得ることなく、いかなる目的のためにも、電子 または印刷を含むいかなる形式や手段によっても再作成または送信すること はできません。Oracle は米国 Oracle Corporation およびその子会社、関連会 社の登録商標です。その他の名称はそれぞれの会社の商標です。

参照

関連したドキュメント

EUで非原産材料の糸から製織した綿製織物(第 52.08 項)を使用し、英国で生産した 男子用シャツ(第 62.05

7-3.可搬型設備,消火設備 大湊側エリア 常設代替交流電源設備 使用可能・使用不可・不明 1 ガスタービン発電機 ガスタービン発電機用

Oracle の Sun Storage 16 Gb Fibre Channel PCIe Universal Host Bus Adapter (HBA) (パーツ番号 7101674) は、QLogic テクノロジを使用したスタンドアロンの PCIe ロー

利用している暖房機器について今冬の使用開始月と使用終了月(見込) 、今冬の使用日 数(見込)

ダイヤフラム フロア 使用済

ダイヤフラム フロア 使用済

使用済燃料プールからのスカイシャイン線による実効線量評価 使用済燃料プールの使用済燃料の全放射能強度を考慮し,使用

製造 輸送 使用