ヘッダーをスキップ
Oracleセキュリティ開発ツール・リファレンス
10gリリース3(10.1.3)
B28615-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

8 Oracle XML Security

Extensible Markup Language(XML)は、Standard Generalized Markup Language(SGML)から応用された言語です。XMLは、実装者が独自の自己記述マークアップを定義することができるメタ言語です。実装者は、XMLを使用して独自のカスタム・タグのセットを定義します。タグはHTML文書のタグと似ています。HTMLもXMLと同様にSGMLから応用された言語であるためです。

文書が有効とされるためには、所定のDocument Type Definition(DTD)またはスキーマで課されるすべての制約に準拠する必要があります。有効なXML文書とは、セマンティックが正しいと表現されます。

XMLセキュリティとは、XML文書の標準セキュリティ要件(機密保持、整合性、メッセージの認証、否認防止など)を意味します。XML文書のためのデジタル署名暗号化の規格のニーズが高まったため、W3Cは、XML署名規格およびXML暗号化規格を提唱しています。XML署名規格は、Internet Engineering Task Force(IETF)を含む共同作業グループによって開発されました。また、W3CとIETFは、XML Key Management Specification(XKMS)も共同で提案しています。XKMSでは、XML署名およびXML暗号化に関連する公開鍵の配布と登録のためのプロトコルが定義されます。

この章では、Oracle XML Securityの主要な機能と利点、およびOracle XML Securityを使用するための環境設定について説明します。

この章に含まれる内容は次のとおりです。


関連項目:

XMLおよびXML規格の詳細は、次のリソースを参照してください。
  • XML 1.0のW3C勧告

  • JavaSoft XML FAQ

  • O'Reilly XML Webサイト

  • Internet Engineering Task Force(IETF)のWebサイト

  • XML署名のW3C勧告

  • XML暗号化のW3C勧告

  • XML Key Management Specification

これらのリソースへのリンクは、付録A「リファレンス」を参照してください。


8.1 Oracle XML Securityの機能と利点

Oracle XML Security SDKは、次の機能を提供するPure Javaソリューションです。

これらの規格へのリンクは、付録A「リファレンス」を参照してください。

8.2 Oracle XML Securityの環境設定

Oracleセキュリティ開発ツールは、Oracle Application ServerとともにORACLE_HOMEにインストールされます。

この項では、Oracle XML Securityを使用するための環境設定について説明します。この項に含まれる内容は次のとおりです。

8.2.1 Oracle XML Securityのシステム要件

Oracle XML Securityを使用するには、システムに次のコンポーネントがインストールされている必要があります。

  • Java Development Kit(JDK)バージョン1.2.2以上

  • JAXP互換XMLパーサーおよびXSLTプロセッサ

Oracle XML Securityは、次の実装でテストされています。

  • Apache Xalan-Java(Xerces-Jを含む)

  • Oracle XDK for Java


注意:

その他のパーサーとの互換性を確認するには、Oracle Technology Network Webサイト(http://www.oracle.com/technology/index.html)を参照してください。

Apacheライブラリ

Sun JDK 1.4.xディストリビューションには、Apache Crimsonパーサーの埋込みバージョンとApache Xalan XSLTエンジンの古いバージョンが含まれます。これらのバージョンの使用はお薦めしません。これらには複数の不具合や非互換性が含まれるため、署名および暗号化が失敗する可能性があります。JDK 1.4.xとApache XMLパーサーまたはXSLTエンジン(あるいはその両方)を一緒に使用する場合は、ApacheライブラリJARファイルをJREの/lib/endorsedディレクトリに配置して、JREの組込みバージョンのApacheを上書きしてください。

8.2.2 CLASSPATH環境変数の設定

CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。次の項目をCLASSPATHに指定します。

  • osdt_core.jar

  • osdt_cert.jar

  • osdt_xmlsec.jar

  • jaxen.jar。セキュリティ・ツール・ディストリビューションの$ORACLE_HOME/jlibディレクトリに含まれます。Oracle XML Securityは、XPathの処理のためにJaxen XPathエンジンを利用します。

  • 適切なXMLパーサーおよびXSLTプロセッサの実装(JREの/lib/extまたは/lib/endorsedディレクトリにインストールしていない場合)。


注意:

Oracle XML Securityディストリビューションに含まれるJaxenライブラリは、Jaxen 1.0 FCSリリースが変更されたバージョンです。CLASSPATHにJaxenの以前のリリースも存在する場合は、このディストリビューションのバージョンを先に指定する必要があります。

8.2.2.1 WindowsでのCLASSPATHの設定

Oracle XML SecurityをWindowsにインストールする場合は、CLASSPATHを次のように設定します。

  1. Windowsの「コントロール パネル」で「システム」を選択します。

  2. 「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。

  3. 「環境変数」をクリックします。

  4. ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH環境変数をユーザー・プロファイルに追加します。CLASSPATH環境変数がすでに存在している場合は、選択して「編集」をクリックします。

  5. 必要なjarファイルおよびclassファイルすべてのフルパスとファイル名をCLASSPATHに追加します。

    たとえば、CLASSPATHは次のようになります。

    %CLASSPATH%;C:\ORACLE_HOME\jlib\osdt_core.jar;
    C:\ORACLE_HOME\jlib\osdt_cert.jar;
    C:\ORACLE_HOME\jlib\osdt_xmlsec.jar;
    C:\ORACLE_HOME\jlib\jaxen.jar;
    
    
  6. 「OK」をクリックします。

8.2.2.2 UNIXでのCLASSPATHの設定

UNIXでは、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を含むようにCLASSPATH環境変数を設定します。次に例を示します。

setenv CLASSPATH $CLASSPATH:$ORACLE_HOME/jlib/osdt_core.jar:\
$ORACLE_HOME/jlib/osdt_cert.jar:\
$ORACLE_HOME/jlib/osdt_xmlsec.jar:\
$ORACLE_HOME/jlib/jaxen.jar:

8.3 クラスとインタフェース

この項では、XML SecurityのAPIのクラスについて説明します。内容は次のとおりです。

8.3.1 コア・クラス

この項では、コア・クラスについて説明し、クラスのインスタンスの作成方法を示し、コード例を使用して各クラスの機能を説明します。

8.3.1.1 oracle.security.xmlsec.dsig.XSSignatureクラス

このクラスは、XML署名スキーマの最上位レベルのSignature要素を表します。新しい署名の作成または既存の署名の検証を行う場合は、まずこのクラスのインスタンスを作成します。

新しい署名を作成するには、静的なnewInstance()メソッドをコールしてXSSignatureクラスの新しいインスタンスを作成します。

例8-1 XSSignatureによる署名の作成

XSSignature sig = XSSignature.newInstance("MySignatureID");

Signature要素をXML文書から取得して署名を検証するには、まず、すべてのSignature要素を含むorg.w3c.dom.NodeListオブジェクトをorg.w3c.dom.Nodeのインスタンスとして取得します。その後、次の例に示すように、NodeListを反復処理し、各ノードをXSSignatureのインスタンスに変換できます。

例8-2 XSSignatureによる署名の検証

Document doc = Instance of org.w3c.dom.Document;
// Get list of all XML Signatures in the document.
NodeList sigList = doc.getElementsByTagNameNS(XMLURI.ns_xmldsig, "Signature");
if (sigList.getLength() == 0)
    System.err.println("No XML-DSIG Signature elements found.");

// Convert each org.w3c.dom.Node object to a oracle.security.xmlsec.dsig.XSSignature
// object and perform verification
for (int s = 0, n = sigList.getLength(); s < n; ++s)
{
    XSSignature sig = new XSSignature((Element)sigList.item(s));
    //Perform signature verification for this signature
    ...
}

8.3.1.2 oracle.security.xmlsec.dsig.XSSignedInfoクラス

このクラスは、XML署名スキーマのSignedInfo要素を表します。XSSignatureの場合と同じく、署名の作成と検証の両方にこのクラスを使用する必要があります。署名の作成では、次のコードを使用してこのクラスのインスタンスを作成します。

例8-3 XSSignedInfoによる署名の作成

XSignature sig = XSSignature.newInstance("MySignatureID");
XSSignedInfo si = sig.createSignedInfo("MySignedInfoID");

検証を実行する際は、まず例8-2のようにXSSignatureのインスタンスを取得してから、次のコードを使用して最上位のSignatureからSignedInfo要素を取得します。

例8-4 XSSignedInfoによる署名の検証

XSSignature sig;

//Instance of XSSignature is obtained (Example 8-2)

//Get SignedInfo
XSSignedInfo si = sig.getSignedInfo();

8.3.1.3 oracle.security.xmlsec.dsig.XSReferenceクラス

このクラスは、XML署名スキーマのReference要素を表します。署名の作成と検証にはこのクラスを使用する必要があります。署名の作成では、次のコードを使用してこのクラスのインスタンスを作成します。

例8-5 XSReferenceによる署名のReference要素の作成

XSignature sig = XSSignature.newInstance("MySignatureID");
String uri = "the URI of the data object you want to reference";
String type = "the type of the data object you want to reference (optional)";
XSAlgorithmIdentifier digestAlg =
    the digest algorithm identifier (e.g., XMLURI.alg_sha1);
XSReference ref =
    sig.createReference("MyReferenceID", uri, type, digestAlg);

検証を実行する際は、まず例8-2のようにXSSignatureのインスタンスを取得してから、次のコードを使用して最上位のSignatureからReference要素を取得します。

例8-6 XSSignatureのReference要素の取得

XSSignature sig;

//Instance of XSSignature is obtained (Example 8-2)

//Get Vector of reference objects
Vector refs = sig.References();

8.3.1.4 oracle.security.xmlsec.dsig.XSKeyInfoクラス

このクラスは、XML署名スキーマのKeyInfo要素を表します。このクラスは署名の作成と署名の検証に使用できます。

署名の作成では、次のコードを使用してこのクラスのインスタンスを作成します。

例8-7 XSKeyInfoによる鍵情報要素の作成

XSignature sig = XSSignature.newInstance("MySignatureID");
XSKeyInfo si = sig.createKeyInfo("MyKeyInfoID");

KeyInfo要素は、実際の鍵データを含む様々な子要素を持つことができます。KeyInfoの各子要素をサポートするクラスは、oracle.security.xmlsec.keysパッケージに用意されています。

たとえば、署名者の公開鍵を含むRSAKeyValue要素を作成するには、次のコードを使用します。

例8-8 署名者の公開鍵を含むRSAKeyValue要素の作成

X509 cert = An instance of the oracle.security.crypto.cert.X509 class;
XSKeyInfo ki = An instance of the XSKeyInfo class;
RSAKeyValue rsaKeyValue = ki.createKeyValue(cert.getPublicKey());
ki.addKeyInfoData(rsaKeyValue);

検証を実行する際は、まず例8-2のようにXSSignatureのインスタンスを取得してから、次のコードを使用して最上位のSignatureからKeyInfo要素を取得します。

例8-9 XSSignatureのKeyInfo要素の取得

XSSignature sig;

//Instance of XSSignature is obtained (Example 8-2)

//Get KeyInfo
XSSignedInfo si = sig.getKeyInfo();

8.3.1.5 oracle.security.xmlsec.enc.XEEncryptedDataクラス

このクラスは、XML暗号化スキーマのEncryptedData要素を表します。任意のデータまたはXML文書全体を暗号化または復号化する際は、このクラスのインスタンスを作成する必要があります。

暗号化では、次のコードを使用してこのクラスのインスタンスを作成します。

例8-10 暗号化のためのXEEncryptedDataの使用

Document doc = Instance of org.w3c.dom.Document;
String dataType = Either XMLURI.obj_content (content only) or
    XMLURI.obj_Element (entire element);
XEEncryptedData encData =
    XEEncryptedData.newInstance(doc, "MyEncryptedDataID", dataType);

復号化では、次のコードを使用してXML文書からEncryptedData要素を取得できます。

例8-11 復号化のためのXEEncryptedDataの使用

Document doc = Instance of org.w3c.dom.Document;

// Get list of all XML EncryptedData elements in the document.
NodeList encDataList =
    doc.getElementsByTagNameNS(XMLURI.ns_xmlenc, "EncryptedData");
if (encDataList.getLength() == 0)
    System.err.println("No XML-ENC EncryptedData elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.enc.XEEncryptedData
// object and perform decryption
for (int s = 0, n = encDataList.getLength(); s < n; ++s)
{
    XEEncryptedData = new XEEncryptedData((Element)encDataList.item(s));

    //TODO: Perform decryption of the encrypted data
    //contained in this element
}

8.3.1.6 oracle.security.xmlsec.enc.XEEncryptedKeyクラス

このクラスは、XML暗号化スキーマのEncryptedKey要素を表します。暗号鍵マテリアルの暗号化または復号化にこのクラスのインスタンスを使用できます。

鍵の暗号化では、次のコードを使用してこのクラスのインスタンスを作成します。

例8-12 鍵の暗号化のためのXEEncryptedKeyの使用

Document doc = Instance of org.w3c.dom.Document;
XEEncryptedKey encKey = XEEncryptedKey.newInstance(doc, "MyEncryptedKeyID");

鍵の復号化では、まず例8-11のコードを使用してXML文書からXEEncryptedDataを取得し、次のコードを使用してEncryptedKey要素を取得します。

例8-13 鍵の復号化のためのXEEncryptedKeyの使用

XEEncryptedData encData;
//Instance of XEEncryptedData is obtained (See Example 8-11

//Get Vector of XEEncryptedKey objects
XEKeyInfo ki = encData.getKeyInfo();
Vector encKeys;
if (ki != null)
    Vector encKeys = encData.getEncryptedKeys();

8.3.1.7 oracle.security.xmlsec.enc.XEEncryptionMethodクラス

このクラスは、XML暗号化スキーマのEncryptionMethod要素を表します。データの暗号化または鍵の暗号化で使用されるアルゴリズムとパラメータが含まれます。

暗号化では、次のコードを使用してこのクラスのインスタンスを作成します。

例8-14 暗号化のためのXEEncryptionMethodの使用

String algURI = "String containing the URI of the encryption algorithm";
XEEncryptedObject encObj = Instance of XEEncryptedData or XEEncryptedKey;
XEEncryptionMethod em = encObj.createEncryptionMethod(algURI);

復号化では、例8-11を使用してEncryptedData要素を取得するか、例8-13を使用してEncryptedKey要素を取得してから、次のコードを使用してEncryptionMethod要素を取得します。

例8-15 復号化のためのXEEncryptionMethodの使用

XEEncryptedObject encObj;

//Obtain instance of XEEncryptedData (see class example earlier) or
//XEEncryptedKey (see class example earlier)
XEEncryptionMethod em = encObj.getEncryptionMethod();

8.3.1.8 oracle.security.xmlsec.enc.XECipherDataクラス

このクラスは、暗号化されたデータを提供するCipherData要素を表します。暗号化されたデータをCipherValue要素に格納するか、CipherReference要素を介してデータを含むソースを参照します。暗号化を実行する際は、XEEncryptedDataまたはXEEncryptedKeyのインスタンスを作成してから、次のコードを使用してXECipherDataのインスタンスを作成します。

例8-16 暗号化でのXECipherDataの使用

XEEncryptedObject encObj;

//Create an instance of XEEncryptedData (see class example earlier)
//XEEncryptedKey (see example 8-12)
XECipherData cd = encObj.createCipherData();

復号化では、例8-11を使用してEncryptedData要素を取得するか、例8-13を使用してEncryptedKey要素を取得してから、次のコードを使用してXECipherData要素のインスタンスを取得します。

例8-17 復号化でのXECipherDataの使用

XEEncryptedObject encObj;

//Obtain an instance of XEEncryptedData (see example 8-11) or
//XEEncryptedKey (see example 8-13)
XECipherData cd = encObj.getCipherData();

8.3.2 サポート・クラスとインタフェース

この項では、Oracle XML Security SDKのその他のクラスとインタフェースについて説明します。

8.3.2.1 oracle.security.xmlsec.util.XMLURIインタフェース

このインタフェースは、アルゴリズム、ネームスペースおよびオブジェクトのURI文字列定数を定義します。次のネーミング規則が使用されます。

  • アルゴリズムのURIはalg_で始まります。

  • ネームスペースのURIはns_で始まります。

  • オブジェクト・タイプのURIはobj_で始まります。

8.3.2.2 oracle.security.xmlsec.util.XMLUtilsクラス

このクラスには、XMLおよびXML-DSIGの静的ユーティリティ・メソッドが含まれます。アプリケーションで頻繁に使用されるメソッドには、createDocBuilder()createDocument()toBytesXML()およびtoStringXML()メソッドがあります。

8.4 XMLセキュリティに関する一般的な質問

この項では、XMLセキュリティやOracle XML Securityの使用に関してよくある質問に回答します。内容は次のとおりです。

8.4.1 鍵と証明書に関する一般的な質問

この項では、鍵と証明書に関する一般的な問題について説明します。

DER形式とはなんですか。PEM形式とはなんですか。これらの形式はどのように使用しますか。

DERは、ASN.1 Distinguished Encoding Rules(特殊エンコーディング規則)の略称です。DERは、証明書と秘密鍵のエンコードに使用されるバイナリ形式です。Oracle XML Security SDKでは、証明書と秘密鍵を使用するほとんどの市販製品と同様に、ネイティブ形式としてDERを使用しています。

証明書と秘密鍵のエンコーディングに使用される形式は、PEM、PKCS #7およびPKCS #12など他にも多くありますが、これらはDERエンコーディングが変化したものです。たとえば、プライバシ強化メール(PEM)はテキスト形式ですが、DERバイナリ形式のBase 64エンコーディングです。PEM形式では、エンコードされるコンテンツのタイプを指定する、BEGINおよびENDテキスト行の使用も指定されます。

テキスト形式の電子メールで証明書を受信しました。テキスト文字が数行ありますが意味が不明です。Oracle XML Securityで使用可能な形式に変換するにはどうすればよいですか。

電子メールで証明書を受信した場合、証明書はPEM形式になっています。証明書をプライバシ強化メール(PEM)形式からASN.1特殊エンコーディング規則(DER)形式に変換する必要があります。

ブラウザでエクスポートした証明書はどのように使用すればよいですか。

ブラウザで証明書をエクスポートした際、多くの場合は、証明書はPKCS #12形式(*.p12または*.pfx)になります。PKCS #12オブジェクトを解析してコンポーネント部に分ける必要があります。

8.4.2 XML署名に関する一般的な質問

この項では、鍵と証明書に関する一般的な問題について説明します。

Oracle XML Securityでサポートされている署名アルゴリズムはなんですか。

Oracle XML Securityでは次の署名アルゴリズムをサポートしています。

  • DSA-SHA1

  • RSA-SHA1


関連項目:

これらのアルゴリズムの詳細は、付録A「リファレンス」でDSA-SHAおよびRSA-SHAのリンクを参照してください。

8.4.3 XML暗号化に関する一般的な質問

この項では、鍵と証明書に関する一般的な問題について説明します。

Oracle XML Securityでサポートされているデータ暗号化アルゴリズムはなんですか。

Oracle XML Securityでは次の署名アルゴリズムをサポートしています。

  • AES-128(CBCモード)

  • AES-192(CBCモード)

  • AES-256(CBCモード)

  • DES EDE(CBCモード)

これらの規格へのリンクは、付録A「リファレンス」を参照してください。

Oracle XML Securityでサポートされている鍵ラップ・アルゴリズムはなんですか。

Oracle XML Securityでは次の鍵ラップ・アルゴリズムをサポートしています。

  • AES-128

  • AES-192

  • AES-256

  • DES-EDE

これらの規格へのリンクは、付録A「リファレンス」を参照してください。

Oracle XML Securityでサポートされている鍵転送アルゴリズムはなんですか。

Oracle XML Securityでは次の鍵転送アルゴリズムをサポートしています。

  • MGF1使用のRSAES-OAEP-ENCRYPT

  • RSAES-PKCS1-v1_5

これらの規格へのリンクは、付録A「リファレンス」を参照してください。

Oracle XML Securityでサポートされている鍵合意アルゴリズムはなんですか。

Oracle XML SecurityではDiffie-Hellman鍵合意アルゴリズムをサポートしています。


関連項目:

この規格へのリンクは、付録A「リファレンス」を参照してください。

8.5 Oracle XML Security API

Oracle XML SecurityのAPIリファレンスは次のドキュメントで参照できます。

『Oracle Security Developer Tools XML Security Java API Reference』