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規格の詳細は、次のリソースを参照してください。
これらのリソースへのリンクは、付録A「リファレンス」を参照してください。 |
Oracle XML Security SDKは、次の機能を提供するPure Javaソリューションです。
XML署名規格のサポート
XML暗号化規格のサポート
復号化変換規格のサポート
XML正規化規格のサポート
排他的XML正規化規格のサポート
JAXP 1.1準拠の様々なXMLパーサーおよびXSLTエンジンとの互換性
これらの規格へのリンクは、付録A「リファレンス」を参照してください。
Oracleセキュリティ開発ツールは、Oracle Application ServerとともにORACLE_HOMEにインストールされます。
この項では、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を上書きしてください。
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の以前のリリースも存在する場合は、このディストリビューションのバージョンを先に指定する必要があります。
|
Oracle XML SecurityをWindowsにインストールする場合は、CLASSPATHを次のように設定します。
Windowsの「コントロール パネル」で「システム」を選択します。
「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。
「環境変数」をクリックします。
ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH環境変数をユーザー・プロファイルに追加します。CLASSPATH環境変数がすでに存在している場合は、選択して「編集」をクリックします。
必要な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;
「OK」をクリックします。
この項では、XML SecurityのAPIのクラスについて説明します。内容は次のとおりです。
この項では、コア・クラスについて説明し、クラスのインスタンスの作成方法を示し、コード例を使用して各クラスの機能を説明します。
このクラスは、XML署名スキーマの最上位レベルのSignature要素を表します。新しい署名の作成または既存の署名の検証を行う場合は、まずこのクラスのインスタンスを作成します。
新しい署名を作成するには、静的なnewInstance()メソッドをコールしてXSSignatureクラスの新しいインスタンスを作成します。
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
...
}
このクラスは、XML署名スキーマのSignedInfo要素を表します。XSSignatureの場合と同じく、署名の作成と検証の両方にこのクラスを使用する必要があります。署名の作成では、次のコードを使用してこのクラスのインスタンスを作成します。
例8-3 XSSignedInfoによる署名の作成
XSignature sig = XSSignature.newInstance("MySignatureID");
XSSignedInfo si = sig.createSignedInfo("MySignedInfoID");
検証を実行する際は、まず例8-2のようにXSSignatureのインスタンスを取得してから、次のコードを使用して最上位のSignatureからSignedInfo要素を取得します。
このクラスは、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要素を取得します。
このクラスは、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要素を取得します。
このクラスは、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
}
このクラスは、XML暗号化スキーマのEncryptedKey要素を表します。暗号鍵マテリアルの暗号化または復号化にこのクラスのインスタンスを使用できます。
鍵の暗号化では、次のコードを使用してこのクラスのインスタンスを作成します。
例8-12 鍵の暗号化のためのXEEncryptedKeyの使用
Document doc = Instance of org.w3c.dom.Document; XEEncryptedKey encKey = XEEncryptedKey.newInstance(doc, "MyEncryptedKeyID");
鍵の復号化では、まず例8-11のコードを使用してXML文書からXEEncryptedDataを取得し、次のコードを使用してEncryptedKey要素を取得します。
このクラスは、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要素を取得します。
このクラスは、暗号化されたデータを提供する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要素のインスタンスを取得します。
この項では、XMLセキュリティやOracle XML Securityの使用に関してよくある質問に回答します。内容は次のとおりです。
この項では、鍵と証明書に関する一般的な問題について説明します。
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オブジェクトを解析してコンポーネント部に分ける必要があります。
この項では、鍵と証明書に関する一般的な問題について説明します。
Oracle XML Securityでサポートされている署名アルゴリズムはなんですか。
Oracle XML Securityでは次の署名アルゴリズムをサポートしています。
DSA-SHA1
RSA-SHA1
この項では、鍵と証明書に関する一般的な問題について説明します。
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鍵合意アルゴリズムをサポートしています。