A JCEフレームワークへの移行

11gリリース1以降のOracle Security Developer Toolsのフレームワークでは、Java暗号化拡張機能(JCE)フレームワークに準拠するために、下位レベルのライブラリが変更されています。この変更により、クライアント・プログラムと、Oracle Security Developer Toolsの上位レベルのライブラリの両方が影響を受けました。従来のプログラムを移行してJCE機能を利用できます。

この章では、変更点がツールキットのアーキテクチャに与える影響と、従来のプログラムを移行してJCE機能を利用できるようにする方法について説明します。この項の内容は、次のとおりです。

A.1 JCEフレームワークについて

Oracle Fusion Middleware 11gより前のOracle Security Developer Toolsでは、JCEが市場で採用される前に開発された暗号化エンジンを使用していました。Oracle WebLogic Serverなどのアプリケーションを引き続き利用して、JCEを採用できるようにするために、Oracle Security Developer Toolsは、Oracle Fusion Middleware 11gのJava暗号化拡張機能(JCE)フレームワークに準拠した下位レベルのライブラリで標準化されています。

JCEフレームワークの利点には次のものがあります。

  • 暗号化および証明書管理エンジンの標準ベースの実装

  • サード・パーティのJCEプロバイダ実装の利用を可能にする、プラガブルなJCEプロバイダ・アーキテクチャ

  • 暗号化エンジンとしてのサード・パーティ・プロバイダの使用機能

追加資料

この章では、JCEフレームワークに対応するためのOracle Security Developer Toolsの変更点と、既存のセキュリティ・アーティファクトをJCEオブジェクトに移行する方法について重点的に説明します。

A.2 JCEキーの理解

リリース11gR1では、上位レベルのツールキット(Oracle XML SecurityOracle Web Services SecurityOracle CMSOracle S/MIME、Oracle XKMS)で、Oracle暗号鍵と証明書のかわりにJCEキーと証明書が取得されるように変更されました。

したがって、APIが取得していたのは次のもので、

oracle.security.crypto.core.PublicKey

現在取得するのは次のものです。

java.security.PublicKey

注意:

ここでは、JCEに対応するためのOracle Security Developer Toolsの変更点に焦点を当てています。利用可能な暗号化機能の詳細は、APIドキュメントを参照してください。

  • oracle.security.crypto.core.PublicKeyjava.security.PublicKeyに変更

  • oracle.security.crypto.core.PrivateKeyjava.security.PrivateKeyに変更

  • oracle.security.crypto.core.SymmetricKeyjavax.crypto.SecretKeyに変更

A.3 OSDTキー・オブジェクトとJCEキー・オブジェクト間の変換

鍵をOracle Security Developer Tools(OSDT)オブジェクトからJCEオブジェクトに(またはその逆に)変換できます。

鍵を格納するためにjava.security.KeyStoreを使用している場合、それから直接java.security.PrivateKeyオプジェクトを取得できるので、変換を行う必要はありません。

ただし、鍵を格納するためにoracle.security.crypto.cert.PKCS12オブジェクトを使用している場合は、それからoracle.security.crypto.core.PrivateKeyを取得した後に、java.security.PrivateKeyオブジェクトに変換する必要があります。

A.3.1 秘密鍵のOSDTからJCEオブジェクトへの変換

Oracle Security Developer Tools(OSDT)形式の鍵をJCEオブジェクトへ変換できます。

次はその例です。

//***** Conversion of PrivateKeys from OSDT -> JCE *******
{
// Example code to convert an RSAPrivateKey (non CRT) to JCE
oracle.security.crypto.core.RSAPrivateKey osdtKey = null;
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(
osdtKey.getModulus(), osdtKey.getExponent());
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateKey jceKey = (RSAPrivateKey)kf.generatePrivate(keySpec);
}
 
{
// Example code to convert an RSAPrivateKey (CRT) to JCE
oracle.security.crypto.core.RSAPrivateKey osdtKey = null;
RSAPrivateKeySpec keySpec = new RSAPrivateCrtKeySpec(
osdtKey.getModulus(),
osdtKey.getPublicExponent(),
osdtKey.getExponent(),
osdtKey.getPrimeP(),
osdtKey.getPrimeQ(),
osdtKey.getPrimeExponentP(),
osdtKey.getPrimeExponentQ(),
osdtKey.getCrtCoefficient());
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateCrtKey jceKey = (RSAPrivateCrtKey)kf.generatePrivate(keySpec);
 
}
 
{
// Example code to convert a DSAPrivateKey to JCE
oracle.security.crypto.core.DSAPrivateKey osdtKey = null;
DSAPrivateKeySpec keySpec = new DSAPrivateKeySpec(
osdtKey.getX(),
osdtKey.getParams().getP(),
osdtKey.getParams().getQ(),
osdtKey.getParams().getG());
 
KeyFactory kf = KeyFactory.getInstance("DSA");
DSAPrivateKey jceKey = (DSAPrivateKey)kf.generatePrivate(keySpec);
 
}
 
{
// Example code to convert a DHPrivateKey to JCE
oracle.security.crypto.core.DHPrivateKey osdtKey = null;
 
// Note q is assumed to be (p-1)/2
DHPrivateKeySpec keySpec = new DHPrivateKeySpec(
osdtKey.getX(),
osdtKey.getParams().getP(),
osdtKey.getParams().getG());
 
KeyFactory kf = KeyFactory.getInstance("DiffieHelman");
DHPrivateKey jceKey = (DHPrivateKey)kf.generatePrivate(keySpec);
 
}

A.3.2 秘密鍵のJCEオブジェクトからOSDTオブジェクトへの変換

秘密鍵オブジェクトをJCEからOSDT形式へ変換できます。

次はその例です。

//***** Conversion or Private Keys from JCE -> OSDT *******
{
// Example code to convert an RSAPrivateKey (non CRT) to OSDT
RSAPrivateKey jceKey = null;
oracle.security.crypto.core.RSAPrivateKey osdtKey =
new oracle.security.crypto.core.RSAPrivateKey(
jceKey.getModulus(),
jceKey.getPrivateExponent());
}
 
{
// Example code to convert an RSAPrivateKey (CRT) to OSDT
RSAPrivateCrtKey jceKey = null;
oracle.security.crypto.core.RSAPrivateKey osdtKey =
new oracle.security.crypto.core.RSAPrivateKey(
jceKey.getModulus(),
jceKey.getPrivateExponent(),
jceKey.getPublicExponent(),
jceKey.getPrimeP(),
jceKey.getPrimeQ(),
jceKey.getPrimeExponentP(),
jceKey.getPrimeExponentQ(),
jceKey.getCrtCoefficient());
}
 
{
// Example code to convert an DSAPrivateKey to OSDT
DSAPrivateKey jceKey = null;
oracle.security.crypto.core.DSAPrivateKey osdtKey =
new oracle.security.crypto.core.DSAPrivateKey(
jceKey.getX(),
new oracle.security.crypto.core.DSAParams(
jceKey.getParams().getP(),
jceKey.getParams().getQ(),
jceKey.getParams().getG()));
}
 
{
// Example code to convert an DHPrivateKey to OSDT
DHPrivateKey jceKey = null;
 
// Note calculate q = (p-1)/2
oracle.security.crypto.core.DHPrivateKey osdtKey =
new oracle.security.crypto.core.DHPrivateKey(
jceKey.getX(),
new oracle.security.crypto.core.DHParams(
jceKey.getParams().getP(),
jceKey.getParams().getG(),
jceKey.getParams().getP().subtract(new BigInteger("1")).divide(new BigInteger("2"))));
}

A.4 JCE証明書の操作

リリース11gR1では、oracle.security.crypto.cert.X509java.security.cert.X509Certificateに変更されました。JCE証明書の作成と処理には、複数のユーティリティ・メソッドを使用できます。X509Certificateオブジェクトは、java.security.cert.CertificateFactoryを使用して入力ストリームから作成できます。

入力ストリームは次のいずれかになります。

  • FileInputSream(証明書がファイルに格納されている場合)

  • ByteArrayInputStream(エンコードされたバイトが古いX509オブジェクトから取得される場合)

  • その他のソース。

たとえば、次のコードでは、Oracle Security Developer Toolsの証明書をJCE証明書に変換します。

CertificateFactory cf = CertificateFactory.getInstance("X.509");
  
X509Certificate cert = (X509Certificate)cf.generateCertificate(
    new FileInputStream(certFileName);

certFileNameは、証明書ファイルの名前です。

A.5 JCE証明書失効リスト(CRL)の操作

リリース11gR1では、oracle.security.crypto.cert.CRLjava.security.cert.CRLで置換されました。java.security.cert.CRLオブジェクトは、java.security.cert.CertificateFactoryを使用して入力ストリームから作成できます。

入力ストリームは次のいずれかになります。

  • FileInputSream(CRLがファイルに格納されている場合)

  • ByteArrayInputStream(エンコードされたバイトが古いoracle.security.crypto.cert.CRLオブジェクトから取得された場合)

  • その他のソース

次のコードは、CRLオブジェクトの作成例です。

CertificateFactory cf = CertificateFactory.getInstance("X.509");
 
509Certificate cert = (X509Certificate)cf.generateCRL(
   new FileInputStream(crlFileName));

crlFileNameは、CRLファイルの名前です。

A.6 JCEキーストアの使用方法

Oracle Security Developer Toolsには、JKSキーストア、Oracleウォレット、PKCS12ウォレット、PKCS8ウォレットの4種類のキーストアがあります。

これらのキーストアを次に示します。

  1. JKSキーストア、Oracleのjava.security.KeyStoreインタフェースの実装です。
  2. Oracleウォレット。Oracleのjava.security.KeyStoreインタフェースの実装です。
  3. PKCS12ウォレット。Oracle固有のPKCS12のインタフェース/実装です。
  4. PKCS8ウォレット。Oracle固有のPKCS8のインタフェース/実装です。

A.6.1 標準のKeyStoreタイプ・ウォレットの処理

Oracleプロバイダを使用してキーストア・オブジェクトをインスタンス化し、キーストア・ファイルをロードして、証明書を取得できます。

PKCS12ウォレットの作成

この例では、次のようにOracleプロバイダのPKCS12ウォレットをインスタンス化します。

java.security.KeyStore keystore = KeyStore.getInstance("PKCS12", "OraclePKI");

キーストア・ファイルのロード

このタスクは、次のkeystore.loadメソッドを使用して実行します。

keystore.load(new FileInputStream(walletFile), pass);

証明書の取得

証明書と秘密鍵を取得するには、次のようにエイリアスを使用します。

Key key = keystore.getKey(alias);

Certificate cert = keystore.getCert(alias);

エイリアスが事前にわからない場合は、次のようにコールするとすべてのエイリアスをリスト表示できます。

keystore.aliases();

A.6.2 PKCS12およびPKCS8ウォレットの処理

キーストアをPKCS12またはPKCS8のOracleウォレット形式で管理する場合は、鍵、証明書またはCRLをOracle Security Developer Tools形式のストアから取得できます。

A.6.2.1 PKCSオブジェクトの取得

Oracleウォレットでは、鍵はoracle.security.crypto.core.PrivateKeyにあります。

取得した鍵は、ユーティリティ・クラスPhaosJCEKeyTranslatorを使用してJCE鍵形式に変換できます。

詳細は、「OSDTキー・オブジェクトとJCEキー・オブジェクト間の変換」を参照してください。

A.6.2.2 証明書の取得

Oracleウォレットでは、証明書はoracle.security.crypto.cert.X509にあります。

取得すると、次の操作が可能になります。

  1. エンコードされたX509証明書の値(例: X509.getEncoded();)を取得
  2. CertificateFactoryを使用して、エンコードされたバイト値に基づいてX509Certificateインスタンスを作成

詳細は、「JCE証明書の操作」を参照してください。

A.6.2.3 CRLの取得

Oracleウォレットでは、CRLはoracle.security.crypto.cert.CRLにあります。

取得すると、次の操作が可能になります。

  1. エンコードされたCRLの値(例: CRL.getEncoded();)を取得
  2. CertificateFactoryを使用して、エンコードされたバイト値に基づいてjava.security.cert.CRLインスタンスを作成

詳細は、「JCE証明書失効リスト(CRL)の操作」を参照してください。

A.7 Oracle JCEのJava APIリファレンス

Oracle JCEフレームワークで利用可能なクラスとメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

このガイドには、次のリンクからアクセスできます。

Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス