| Oracle® Fusion Middleware Oracle Security Developer Toolsによるセキュアなアプリケーションの開発 11gリリース1 (11.1.1) B61386-04 |
|
![]() 前 |
![]() 次 |
11gリリース1 (11.1.1)のOracleセキュリティ開発ツールのフレームワークでは、Java暗号化拡張機能(JCE)フレームワークに準拠するために、下位レベルのライブラリが変更されています。
この変更により、11gより前のバージョンのクライアント・プログラムと、Oracleセキュリティ開発ツールの上位レベルのライブラリの両方が影響を受けます。
この章では、変更点がツールキットのアーキテクチャに与える影響と、プログラムを移行して新しい機能を利用できるようにする方法について説明します。次の項目について説明します。
追加資料
この章では、JCEフレームワークに対応するためのOracleセキュリティ開発ツールの変更点と、既存のセキュリティ・アーティファクトをJCEオブジェクトに移行する方法について重点的に説明します。
各種の鍵および鍵ペア、証明書などの生成に関する内容を含む、JCEフレームワークとセキュリティ関連のAPIの機能を使用する方法の詳細は、JDK 6 Securityのドキュメント(http://docs.oracle.com/javase/6/docs/technotes/guides/security/index.html)を参照してください。
Oracle Fusion Middleware 11gより前のOracleセキュリティ開発ツールでは、JCEが市場で採用される前に開発された暗号化エンジンを使用していました。Oracle WebLogic Serverなどのアプリケーションを引き続き利用して、JCEを採用できるようにするために、Oracle Fusion Middleware 11g以降、Oracleセキュリティ開発ツールはJava暗号化拡張機能(JCE)フレームワークに準拠した下位レベルのライブラリで標準化されています。新しいツールキットの利点は次のとおりです。
暗号化および証明書管理エンジンの標準ベースの実装
サード・パーティのJCEプロバイダ実装の利用を可能にする、プラガブルなJCEプロバイダ・アーキテクチャ
暗号化エンジンとしてのサード・パーティ・プロバイダの使用機能
OracleAS 11gR1では、上位レベルのツールキット(Oracle XML Security、Oracle Web Services Security、Oracle CMS、Oracle S/MIME、Oracle XKMS)で、Oracle暗号鍵と証明書のかわりにJCEキーと証明書が取得されるように変更されました。そのため、APIはoracle.security.crypto.core.PublicKeyを取得していましたが、java.security.PublicKeyを取得するようになりました。
|
注意: ここでは、JCEに対応するためのOracleセキュリティ開発ツールの変更点に焦点を当てています。利用可能な暗号化機能の詳細は、APIドキュメントを参照してください。 |
oracle.security.crypto.core.PublicKeyがjava.security.PublicKeyに変更
oracle.security.crypto.core.PrivateKeyがjava.security.PrivateKeyに変更
oracle.security.crypto.core.SymmetricKeyがjavax.crypto.SecretKeyに変更
鍵を格納するためにjava.security.KeyStoreを使用している場合、それから直接java.security.PrivateKeyオプジェクトを取得できるので、変換を行う必要はありません。
ただし、鍵を格納するためにoracle.security.crypto.cert.PKCS12オブジェクトを使用している場合は、それからoracle.security.crypto.core.PrivateKeyを取得した後に、java.security.PrivateKeyオブジェクトに変換する必要があります。
Oracleセキュリティ開発ツールからJCEオブジェクトへの秘密鍵の変換
//***** Conversion or 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);
}
JCEオブジェクトからOracleセキュリティ開発ツールへの秘密鍵の変換
//***** 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"))));
}
OracleAS 11gリリース1では、oracle.security.crypto.cert.X509がjava.security.cert.X509Certificateに変更されています。
JCE証明書の作成と処理には、複数のユーティリティ・メソッドを使用できます。
X509Certificateオブジェクトは、java.security.cert.CertificateFactoryを使用して入力ストリームから作成できます。入力ストリームは次のいずれかになります。
FileInputSream(証明書がファイルに格納されている場合)
ByteArrayInputStream(エンコードされたバイトが古いX509オブジェクトから取得される場合)
その他のソース
たとえば、次のコードでは、Oracleセキュリティ開発ツールの証明書をJCE証明書に変換します。
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(
new FileInputStream(certFileName);
certFileNameは、証明書ファイルの名前です。
OracleAS 11gリリース1では、oracle.security.crypto.cert.CRLがjava.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ファイルの名前です。
Oracleセキュリティ開発ツールには、次の4種類のキーストアがあります。
JKSキーストア。Sunのjava.security.KeyStoreインタフェースの実装です。
Oracleウォレット。Oracleのjava.security.KeyStoreインタフェースの実装です。
PKCS12ウォレット。Oracle固有のPKCS12のインタフェース/実装です。
PKCS8ウォレット。Oracle固有のPKCS8のインタフェース/実装です。
キーストア形式に応じて、SunのプロバイダまたはOracleプロバイダのいずれかを使用してキーストア・オブジェクトをインスタンス化できます。
JKSキーストア
この例では、次のようにJKSプロバイダのJKSキーストアをインスタンス化します。
java.security.KeyStore keystore = KeyStore.getInstance("JKS", "SUN");
Oracleキーストア
この例では、次のように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();
キーストアをPKCS12またはPKCS8のOracleウォレット形式で管理する場合は、鍵、証明書またはCRLをOracleセキュリティ開発ツール形式のストアから取得できます。
鍵の取得
Oracleウォレットでは、鍵はoracle.security.crypto.core.PrivateKeyにあります。
取得した鍵は、ユーティリティ・クラスPhaosJCEKeyTranslatorを使用してJCE鍵形式に変換できます。
詳細は、2.2.1項「既存の鍵オブジェクトからJCE鍵オブジェクトへの変換」を参照してください。
証明書の取得
Oracleウォレットでは、証明書はoracle.security.crypto.cert.X509にあります。
取得すると、次の操作が可能になります。
エンコードされたX509証明書の値(例: X509.getEncoded();)を取得
CertificateFactoryを使用して、エンコードされたバイト値に基づいてX509Certificateインスタンスを作成
詳細は、以下を参照してください。2.3項「JCE証明書の操作」。
CRLの取得
Oracleウォレットでは、CRLはoracle.security.crypto.cert.CRLにあります。
取得すると、次の操作が可能になります。
エンコードされたCRLの値(例: CRL.getEncoded();)を取得
CertificateFactoryを使用して、エンコードされたバイト値に基づいてjava.security.cert.CRLインスタンスを作成
詳細は、2.4項「JCE証明書失効リスト(CRL)の作成」を参照してください。
Oracle JCEプロバイダAPI (Javadoc) は次のドキュメントで参照できます。
『Oracle Fusion Middleware JCE Java API Reference for Oracle Security Developer Tools』