A JCEフレームワークへの移行
11gリリース1以降のOracle Security Developer Toolsのフレームワークでは、Java暗号化拡張機能(JCE)フレームワークに準拠するために、下位レベルのライブラリが変更されています。この変更により、クライアント・プログラムと、Oracle Security Developer Toolsの上位レベルのライブラリの両方が影響を受けました。従来のプログラムを移行してJCE機能を利用できます。
この章では、変更点がツールキットのアーキテクチャに与える影響と、従来のプログラムを移行してJCE機能を利用できるようにする方法について説明します。この項の内容は、次のとおりです。
- 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キーの理解
リリース11gR1では、上位レベルのツールキット(Oracle XML Security、Oracle Web Services Security、Oracle CMS、Oracle S/MIME、Oracle XKMS)で、Oracle暗号鍵と証明書のかわりにJCEキーと証明書が取得されるように変更されました。 - OSDTキー・オブジェクトとJCEキー・オブジェクト間の変換
鍵をOracle Security Developer Tools (OSDT)オブジェクトからJCEオブジェクトに(またはその逆に)変換できます。 - JCE証明書の操作
リリース11gR1では、oracle.security.crypto.cert.X509
がjava.security.cert.X509Certificate
に変更されました。JCE証明書の作成と処理には、複数のユーティリティ・メソッドを使用できます。X509Certificateオブジェクトは、java.security.cert.CertificateFactoryを使用して入力ストリームから作成できます。 - JCE証明書失効リスト(CRL)の操作
リリース11gR1では、oracle.security.crypto.cert.CRL
がjava.security.cert.CRL
で置換されました。java.security.cert.CRL
オブジェクトは、java.security.cert.CertificateFactory
を使用して入力ストリームから作成できます。 - JCEキーストアの使用方法
Oracle Security Developer Toolsには、JKSキーストア、Oracleウォレット、PKCS12ウォレット、PKCS8ウォレットの4種類のキーストアがあります。 - Oracle JCEのJava APIリファレンス
Oracle JCEフレームワークで利用可能なクラスとメソッドについては、Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンスを参照してください。
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オブジェクトに移行する方法について重点的に説明します。
親トピック: JCEフレームワークへの移行
A.2 JCEキーの理解
リリース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 Security Developer Toolsの変更点に焦点を当てています。利用可能な暗号化機能の詳細は、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
に変更
親トピック: JCEフレームワークへの移行
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オブジェクトに変換する必要があります。
- 秘密鍵のOSDTからJCEオブジェクトへの変換
Oracle Security Developer Tools (OSDT)形式の鍵をJCEオブジェクトへ変換できます。 - 秘密鍵のJCEオブジェクトからOSDTオブジェクトへの変換
秘密鍵オブジェクトをJCEからOSDT形式へ変換できます。
親トピック: JCEフレームワークへの移行
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.X509
がjava.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
は、証明書ファイルの名前です。
親トピック: JCEフレームワークへの移行
A.5 JCE証明書失効リスト(CRL)の操作
リリース11gR1では、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ファイルの名前です。
親トピック: JCEフレームワークへの移行
A.6 JCEキーストアの使用方法
Oracle Security Developer Toolsには、JKSキーストア、Oracleウォレット、PKCS12ウォレット、PKCS8ウォレットの4種類のキーストアがあります。
これらのキーストアを次に示します。
- JKSキーストア、Oracleのjava.security.KeyStoreインタフェースの実装です。
- Oracleウォレット。Oracleのjava.security.KeyStoreインタフェースの実装です。
- PKCS12ウォレット。Oracle固有のPKCS12のインタフェース/実装です。
- PKCS8ウォレット。Oracle固有のPKCS8のインタフェース/実装です。
- 標準のKeyStoreタイプ・ウォレットの処理
Oracleプロバイダを使用してキーストア・オブジェクトをインスタンス化し、キーストア・ファイルをロードして、証明書を取得できます。 - PKCS12およびPKCS8ウォレットの処理
キーストアをPKCS12またはPKCS8のOracleウォレット形式で管理する場合は、鍵、証明書またはCRLをOracle Security Developer Tools形式のストアから取得できます。
親トピック: JCEフレームワークへの移行
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();
親トピック: JCEキーストアの使用方法
A.6.2 PKCS12およびPKCS8ウォレットの処理
キーストアをPKCS12またはPKCS8のOracleウォレット形式で管理する場合は、鍵、証明書またはCRLをOracle Security Developer Tools形式のストアから取得できます。
親トピック: JCEキーストアの使用方法
A.6.2.1 PKCSオブジェクトの取得
Oracleウォレットでは、鍵はoracle.security.crypto.core.PrivateKeyにあります。
取得した鍵は、ユーティリティ・クラスPhaosJCEKeyTranslatorを使用してJCE鍵形式に変換できます。
詳細は、「OSDTキー・オブジェクトとJCEキー・オブジェクト間の変換」を参照してください。
親トピック: PKCS12およびPKCS8ウォレットの処理
A.6.2.2 証明書の取得
Oracleウォレットでは、証明書はoracle.security.crypto.cert.X509にあります。
取得すると、次の操作が可能になります。
- エンコードされたX509証明書の値(例: X509.getEncoded();)を取得
- CertificateFactoryを使用して、エンコードされたバイト値に基づいてX509Certificateインスタンスを作成
詳細は、「JCE証明書の操作」を参照してください。
親トピック: PKCS12およびPKCS8ウォレットの処理
A.6.2.3 CRLの取得
Oracleウォレットでは、CRLはoracle.security.crypto.cert.CRLにあります。
取得すると、次の操作が可能になります。
- エンコードされたCRLの値(例: CRL.getEncoded();)を取得
- CertificateFactoryを使用して、エンコードされたバイト値に基づいてjava.security.cert.CRLインスタンスを作成
詳細は、「JCE証明書失効リスト(CRL)の操作」を参照してください。
親トピック: PKCS12およびPKCS8ウォレットの処理
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リファレンス
親トピック: JCEフレームワークへの移行