Oracle® Fusion Middleware

Oracle Security Developer Toolsによるアプリケーションの開発

12c (12.2.1.2)

E82830-01(原本部品番号:E78159-01)

2016年10月

Oracle Security Developer Toolsに関する参照情報を提供します。

Oracle Fusion Middleware Oracle Security Developer Toolsによるアプリケーションの開発, 12c (12.2.1.2)

E82830-01

Copyright © 2013, 2016, Oracle and/or its affiliates. All rights reserved.

原本著者: Sudhira Subudhi

原本協力著者: Gaurav Sharma

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

Oracleセキュリティ開発ツールの新機能

- 12c (12.2.1)の新機能

- 12c (12.1.3)の2014年9月のドキュメント改訂における更新

- 12c (12.1.3)の新機能

1 Oracleセキュリティ開発ツールの概要

- 1.1 暗号化について

- 1.1.1 暗号化アルゴリズムのタイプ

- 1.1.1.1 対称暗号化アルゴリズムについて

- 1.1.1.2 非対称暗号化アルゴリズムについて

- 1.1.1.3 ハッシュ関数の理解

- 1.2 公開鍵インフラストラクチャ(PKI)について

- 1.2.1 鍵ペアの理解

- 1.2.2 認証局について

- 1.2.3 デジタル証明書とは

- 1.2.4 関連するPKIの規格

- 1.2.5 PKIの利点

- 1.3 Webサービスのセキュリティについて

- 1.4 SAMLについて

- 1.4.1 SAMLアサーションの理解

- 1.4.2 SAMLリクエストおよびレスポンスの理解

- 1.4.2.1 SAMLのリクエストおよびレスポンスのサイクルについて

- 1.4.2.2 SAMLのプロトコル・バインディングとプロファイルについて

- 1.4.2.3 SAMLとXMLセキュリティの統合方法

- 1.5 Identity Federationについて

- 1.6 Oracleセキュリティ開発ツールについて

- 1.6.1 ツールキットのアーキテクチャの理解

- 1.6.2 XML、SAMLおよびWeb Services Securityアプリケーションのツール

- 1.6.2.1 Oracle XML Securityについて

- 1.6.2.2 Oracle SAMLについて

- 1.6.2.3 Oracle Web Services Securityについて

- 1.6.2.4 Oracle Liberty SDKについて

- 1.6.3 公開鍵暗号化(PKI)アプリケーションのツール

- 1.6.3.1 Oracle PKI LDAP SDKについて

- 1.6.3.2 Oracle PKI TSP SDKについて

- 1.6.3.3 Oracle PKI OCSP SDKについて

- 1.6.3.4 Oracle PKI CMP SDKについて

- 1.6.3.5 Oracle XKMSについて

- 1.6.4 電子メール・セキュリティ・アプリケーションのツール

- 1.6.4.1 Oracle CMSについて

- 1.6.4.2 Oracle S/MIMEについて

- 1.6.5 低レベルの暗号化アプリケーションのツール

- 1.6.5.1 Oracle Cryptoについて

- 1.6.5.2 Oracle Security Engineについて

- 1.6.6 Web Tokenのためのツール

- 1.6.6.1 Oracle JWTについて

- 1.7 サポートされる標準について

- 1.8 CLASSPATH環境変数の設定

- 1.8.1 WindowsでのCLASSPATHの設定

- 1.8.2 UNIXでのCLASSPATHの設定

2 Oracle Crypto

- 2.1 Oracle Cryptoの機能と利点について

- 2.2 Oracle Cryptoパッケージについて

- 2.3 Oracle Cryptoの環境設定

- 2.4 Oracle Cryptoのコア・クラスとインタフェースの理解および使用方法

- 2.4.1 Oracle Cryptoのキー・クラスについて

- 2.4.1.1 oracle.security.crypto.core.Keyインタフェース

- 2.4.1.2 oracle.security.crypto.core.PrivateKeyインタフェース

- 2.4.1.3 oracle.security.crypto.core.PublicKeyインタフェース

- 2.4.1.4 oracle.security.crypto.core.SymmetricKeyクラス

- 2.4.2 Oracle Cryptoの鍵生成クラスの使用

- 2.4.2.1 oracle.security.crypto.core.KeyPairGeneratorクラスの使用方法

- 2.4.2.2 oracle.security.crypto.core.SymmetricKeyGeneratorクラスの使用方法

- 2.4.3 Oracle CryptoのCipherクラスの使用方法

- 2.4.3.1 対称暗号の使用方法

- 2.4.3.2 RSA暗号の使用方法

- 2.4.3.3 パスワード・ベース暗号化(PBE)の使用方法

- 2.4.4 Oracle Cryptoの署名クラスの使用方法

- 2.4.5 Oracle Cryptoのメッセージ・ダイジェスト・クラスの使用

- 2.4.5.1 oracle.security.crypto.core.MessageDigestクラスの使用方法

- 2.4.5.2 oracle.security.crypto.core.MACクラスの使用方法

- 2.4.6 Oracle Cryptoの鍵合意クラスの使用方法

- 2.4.7 Oracle Cryptoの疑似乱数ジェネレータ・クラスの使用方法

- 2.4.7.1 oracle.security.crypto.core.RandomBitsSourceクラスの使用方法

- 2.4.7.2 oracle.security.crypto.core.EntropySourceクラスの使用方法

- 2.5 Oracle CryptoおよびCrypto FIPSのJava APIリファレンス

3 Oracle Security Engine

- 3.1 Oracle Security Engineの機能と利点

- 3.2 Oracle Security Engineの環境設定

- 3.3 Oracle Security Engineのコア・クラスとインタフェース

- 3.3.1 oracle.security.crypto.cert.X500RDNクラスの使用方法

- 3.3.2 oracle.security.crypto.cert.X500Nameクラスの使用方法

- 3.3.3 oracle.security.crypto.cert.CertificateRequestクラスの使用方法

- 3.3.4 java.security.cert.X509Certificateクラスの使用方法

- 3.4 Oracle Security EngineのJava APIリファレンス

4 Oracle CMS

- 4.1 Oracle CMSの機能と利点

- 4.1.1 Oracle CMSのコンテンツ・タイプ

- 4.1.2 Oracle CMS実装とRFCの違い

- 4.2 Oracle CMSの環境設定

- 4.3 Oracle CMSによるアプリケーションの理解および開発

- 4.3.1 Oracle CMSクラスについて

- 4.3.2 CMSのオブジェクト・タイプについて

- 4.3.3 CMS***ContentInfoクラスを使用したCMSオブジェクトの構成

- 4.3.3.1 抽象ベース・クラスCMSContentInfoの使用方法

- 4.3.3.1.1 CMSオブジェクトの構成

- 4.3.3.1.2 CMSオブジェクトの読取り

- 4.3.3.2 CMSDataContentInfoクラスの使用方法

- 4.3.3.3 ESSReceiptクラスの使用方法

- 4.3.3.3.1 ESSReceiptオブジェクトの作成

- 4.3.3.3.2 ESSReceiptオブジェクトの読み取り

- 4.3.3.4 CMSDigestedDataContentInfoクラス

- 4.3.3.4.1 CMS digested-dataオブジェクトの構成

- 4.3.3.4.2 CMS digested-dataオブジェクトの読取り

- 4.3.3.4.3 デタッチされたdigested-dataオブジェクトの操作

- 4.3.3.5 CMSSignedDataContentInfoクラス

- 4.3.3.5.1 CMS signed-dataオブジェクトの構成

- 4.3.3.5.2 CMS signed-dataオブジェクトの読取り

- 4.3.3.5.3 外部署名(デタッチ・オブジェクト)の操作

- 4.3.3.5.4 証明書またはCRL専用オブジェクトの操作

- 4.3.3.6 CMSEncryptedDataContentInfoクラスの使用方法

- 4.3.3.6.1 CMS encrypted-dataオブジェクトの構成

- 4.3.3.6.2 CMS encrypted-dataオブジェクトの読取り

- 4.3.3.6.3 デタッチされた暗号化データCMSオブジェクトの生成

- 4.3.3.7 CMSEnvelopedDataContentInfoクラスの理解および使用方法

- 4.3.3.7.1 CMS enveloped-dataオブジェクトの構成

- 4.3.3.7.2 CMS enveloped-dataオブジェクトの読取り

- 4.3.3.7.3 鍵転送鍵交換メカニズムについて

- 4.3.3.7.4 鍵合意鍵交換メカニズムについて

- 4.3.3.7.5 鍵暗号化(ラップ)鍵交換メカニズムについて

- 4.3.3.7.6 デタッチされたCMS enveloped-dataオブジェクトの使用方法

- 4.3.3.8 CMSAuthenticatedDataContentInfoクラスの使用方法

- 4.3.3.8.1 CMS authenticated-dataオブジェクトの構成

- 4.3.3.8.2 CMS authenticated-dataオブジェクトの読取り

- 4.3.3.8.3 デタッチされたCMS authenticated-dataオブジェクトの操作

- 4.3.3.9 3回以上ラップされたCMSContentInfoオブジェクトの操作

- 4.3.3.9.1 ネスト(ラップ)したCMSオブジェクトの読取り

- 4.3.4 CMS***StreamおよびCMS***Connectorクラスを使用したCMSオブジェクト

- 4.3.4.1 CMS***StreamおよびCMS***Connectorクラスの制限

- 4.3.4.2 CMS***StreamとCMS***Connectorクラスの違い

- 4.3.4.3 CMS***OutputStreamおよびCMS***InputStreamクラスの使用

- 4.3.4.3.1 CMS id-dataオブジェクトの操作

- 4.3.4.3.2 CMS id-ct-receiptオブジェクトの操作

- 4.3.4.3.3 CMS id-digestedDataオブジェクトの操作

- 4.3.4.3.4 CMS id-signedDataオブジェクトの操作

- 4.3.4.3.5 CMS id-encryptedDataオブジェクトの操作

- 4.3.4.3.6 CMS id-envelopedDataオブジェクトの操作

- 4.3.4.3.7 CMS id-ct-authDataオブジェクトについて

- 4.3.4.4 CMS***Connectorオブジェクトの3回以上のラップ

- 4.4 Oracle CMSのJava APIリファレンス

5 Oracle S/MIME

- 5.1 Oracle S/MIMEの機能と利点

- 5.2 Oracle S/MIMEの環境設定

- 5.3 Oracle S/MIMEでのアプリケーションの開発

- 5.3.1 Oracle S/MIMEのコア・クラスとインタフェース

- 5.3.1.1 oracle.security.crypto.smime.SmimeObjectインタフェースの使用方法

- 5.3.1.2 oracle.security.crypto.smime.SmimeSignedObjectインタフェースの使用方法

- 5.3.1.3 oracle.security.crypto.smime.SmimeSignedクラスの使用方法

- 5.3.1.4 oracle.security.crypto.smime.SmimeEnvelopedクラスの使用方法

- 5.3.1.5 oracle.security.crypto.smime.SmimeMultipartSignedクラスの使用方法

- 5.3.1.6 oracle.security.crypto.smime.SmimeSignedReceiptクラスの使用方法

- 5.3.1.7 oracle.security.crypto.smime.SmimeCompressedクラスの使用方法

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

- 5.3.2.1 oracle.security.crypto.smime.Smimeインタフェースの使用方法

- 5.3.2.2 oracle.security.crypto.smime.SmimeUtilsクラスの使用方法

- 5.3.2.3 oracle.security.crypto.smime.MailTrustPolicyクラスの使用方法

- 5.3.2.4 oracle.security.crypto.smime.SmimeCapabilitiesクラスの使用方法

- 5.3.2.5 oracle.security.crypto.smime.SmimeDataContentHandlerクラスの使用方法

- 5.3.2.6 oracle.security.crypto.smime.essパッケージの使用方法

- 5.3.3 Oracle S/MIMEクラスの使用

- 5.3.3.1 抽象クラスSmimeObjectの使用

- 5.3.3.2 メッセージの署名

- 5.3.3.3 マルチパート署名付きエンティティの作成

- 5.3.3.4 デジタル・エンベロープの作成

- 5.3.3.5 証明書専用メッセージの作成

- 5.3.3.6 メッセージの読取り

- 5.3.3.7 署名付きメッセージの認証

- 5.3.3.8 デジタル・エンベロープ(暗号化されたメッセージ)のオープン

- 5.3.3.9 拡張セキュリティ・サービス(ESS)の追加

- 5.3.3.9.1 ESSを使用した署名付き通知のリクエスト

- 5.3.3.9.2 ESSを使用したセキュリティ・ラベルの添付

- 5.3.3.9.3 ESSを使用した署名証明書の添付

- 5.3.3.10 拡張セキュリティ・サービス(ESS)の処理

- 5.4 Oracle S/MIMEのJava APIリファレンス

6 Oracle PKI SDK

- 6.1 Oracle PKI CMP SDK

- 6.1.1 Oracle PKI CMP SDKの機能と利点

- 6.1.2 Oracle PKI CMP SDKの環境設定

- 6.1.3 Oracle PKI CMP SDKのJava APIリファレンス

- 6.2 Oracle PKI OCSP SDK

- 6.2.1 Oracle PKI OCSP SDKの機能と利点

- 6.2.2 Oracle PKI OCSP SDKの環境設定

- 6.2.3 Oracle PKI OCSP SDKのJava APIリファレンス

- 6.3 Oracle PKI TSP SDK

- 6.3.1 Oracle PKI TSP SDKの機能と利点

- 6.3.2 Oracle PKI TSP SDKの環境設定

- 6.3.3 Oracle PKI TSP SDKのJava APIリファレンス

- 6.4 Oracle PKI LDAP SDK

- 6.4.1 Oracle PKI LDAP SDKの機能と利点

- 6.4.2 Oracle PKI LDAP SDKの環境設定

- 6.4.3 Oracle PKI LDAP SDKのJava APIリファレンス

7 Oracle XML Security

- 7.1 Oracle XML Securityの機能と利点

- 7.2 Oracle XML Securityの環境設定

- 7.3 Oracle XML Securityを使用したデータの署名

- 7.3.1 署名対象の識別

- 7.3.1.1 署名エンベロープの決定

- 7.3.1.2 バイナリ・データの署名方法の決定

- 7.3.1.3 1つの署名での複数XMLフラグメントの署名

- 7.3.1.4 署名からの要素の除外

- 7.3.2 署名鍵の決定

- 7.3.2.1 鍵交換の設定

- 7.3.2.2 受信者ヒントの提供

- 7.4 XMLデータの検証

- 7.5 データの暗号化方法の理解

- 7.5.1 暗号化対象の識別

- 7.5.1.1 コンテンツのみの暗号化モードの使用

- 7.5.1.2 バイナリ・データの暗号化

- 7.5.2 暗号化鍵の決定

- 7.6 Oracle XML Securityを使用したデータの復号化の理解

- 7.7 OSDT XML APIでの要素ラッパーの理解および使用方法

- 7.7.1 ラッパー・オブジェクトの構成

- 7.7.2 ラッパー・オブジェクトからのDOM要素の取得

- 7.7.3 複合要素の解析

- 7.7.4 複合要素の構成

- 7.8 Oracle XML Security APIを使用したデータの署名

- 7.8.1 デタッチされた署名の作成、基本手順

- 7.8.2 基本的な署名手順に対するバリエーションの使用方法

- 7.8.2.1 複数の参照の挿入

- 7.8.2.2 エンベロープされた署名の使用方法

- 7.8.2.3 XPath式の使用方法

- 7.8.2.4 証明書ヒントの使用方法

- 7.8.2.5 HMAC鍵を使用した書名

- 7.9 Oracle XML Security APIを使用した署名の検証

- 7.9.1 署名対象の確認、基本手順

- 7.9.2 コールバックの設定

- 7.9.3 カスタムの鍵取得機能の記述

- 7.9.4 署名対象のチェック

- 7.9.5 署名の検証

- 7.9.5.1 コールバックが設定されている場合の検証

- 7.9.5.2 コールバックが設定されていない場合の検証

- 7.9.5.3 検証のデバッグ

- 7.10 Oracle XML Security APIを使用したデータの暗号化

- 7.10.1 共有対称鍵を使用した暗号化

- 7.10.2 ランダムの対称鍵を使用した暗号化

- 7.11 Oracle XML Security APIを使用したデータの復号化

- 7.11.1 共有対称鍵を使用した復号化

- 7.11.2 ランダムの対称鍵を使用した復号化

- 7.12 サポート・クラスとインタフェースについて

- 7.12.1 oracle.security.xmlsec.util.XMLURIインタフェースについて

- 7.12.2 oracle.security.xmlsec.util.XMLUtilsクラスについて

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

- 7.14 Oracle XML Securityのベスト・プラクティス

- 7.15 Oracle XML SecurityのJava APIリファレンス

8 Oracle SAML

- 8.1 Oracle SAMLの機能と利点

- 8.2 Oracle SAML 1.0/1.1

- 8.2.1 Oracle SAML 1.0/1.1のパッケージ

- 8.2.2 Oracle SAML 1.0/1.1の環境設定

- 8.2.3 Oracle SAML 1.xのクラスおよびインタフェース

- 8.2.3.1 Oracle SAML 1.xのコア・クラス

- 8.2.3.1.1 oracle.security.xmlsec.saml.SAMLInitializerクラスの使用方法

- 8.2.3.1.2 oracle.security.xmlsec.saml.Assertionクラスの使用方法

- 8.2.3.1.3 oracle.security.xmlsec.samlp.Requestクラスの使用方法

- 8.2.3.1.4 oracle.security.xmlsec.samlp.Responseクラスの使用方法

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

- 8.2.3.2.1 oracle.security.xmlsec.saml.SAMLURIインタフェースの使用方法

- 8.2.3.2.2 oracle.security.xmlsec.saml.SAMLMessageクラスの使用方法

- 8.2.4 Oracle SAML 1.0/1.1のJava APIリファレンス

- 8.3 Oracle SAML 2.0

- 8.3.1 Oracle SAML 2.0のパッケージ

- 8.3.2 Oracle SAML 2.0の環境設定

- 8.3.3 Oracle SAML 2.0のクラスおよびインタフェース

- 8.3.3.1 Oracle SAML 2.0のコア・クラス

- 8.3.3.1.1 oracle.security.xmlsec.saml2.core.Assertionクラスの使用方法

- 8.3.3.1.2 oracle.security.xmlsec.saml2.protocol.AuthnRequestクラスの使用方法

- 8.3.3.1.3 oracle.security.xmlsec.saml2.protocol.StatusResponseTypeクラスの使用方法

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

- 8.3.3.2.1 oracle.security.xmlsec.saml2.util.SAML2URIインタフェースの使用方法

- 8.3.4 Oracle SAML 2.0のJava APIリファレンス

9 Oracle Web Services Security

- 9.1 Oracle Web Services Securityの環境設定

- 9.2 Oracle Web Services Securityのクラスおよびインタフェース

- 9.2.1 Oracle Web Services Securityの要素ラッパー

- 9.2.2 <wsse:Security>ヘッダー

- 9.2.2.1 送信メッセージの処理

- 9.2.2.2 受信メッセージの処理

- 9.2.3 Oracle Web Services Securityのセキュリティ・トークン(ST)

- 9.2.3.1 WSSユーザー名トークンの作成

- 9.2.3.2 X509トークンの作成

- 9.2.3.3 クライアント側Kerberosトークンの作成

- 9.2.3.4 サーバー側Kerberosトークンの作成

- 9.2.3.5 SAMLアサーション・トークンの作成

- 9.2.4 セキュリティ・トークン参照(STR)

- 9.2.4.1 直接参照STRの作成

- 9.2.4.2 ユーザー名トークンの参照STRの作成

- 9.2.4.3 X509トークンの参照STRの作成

- 9.2.4.4 Kerberosトークンの参照STRの作成

- 9.2.4.5 SAMLアサーション・トークンの参照STRの作成

- 9.2.4.6 EncryptedKeyの参照STRの作成

- 9.2.4.7 汎用トークンの参照STRの作成

- 9.2.4.8 キー識別子STRの作成

- 9.2.4.9 X509トークンのKeyIdentifier STRの作成

- 9.2.4.10 KerberosトークンのKeyIdentifier STRの作成

- 9.2.4.11 SAMLアサーション・トークンのKeyIdentifier STRの作成

- 9.2.4.12 EncryptedKeyのKeyIdentifier STRの作成

- 9.2.4.13 STRTransformの追加

- 9.2.5 署名と検証

- 9.2.5.1 SOAPメッセージの署名

- 9.2.5.1.1 要素へのIDの追加

- 9.2.5.1.2 WSSignatureParamsオブジェクトの作成

- 9.2.5.1.3 変換の指定

- 9.2.5.1.4 WSSecurity.signメソッドのコール

- 9.2.5.2 SOAPメッセージの検証

- 9.2.5.3 署名の確認

- 9.2.5.3.1 署名確認レスポンスの生成

- 9.2.5.3.2 署名確認レスポンスの処理

- 9.2.6 暗号化と復号化

- 9.2.6.1 EncryptedKeyを使用したSOAPメッセージの暗号化

- 9.2.6.2 EncryptedKeyを使用しないSOAPメッセージの暗号化

- 9.2.6.3 SOAPヘッダーのEncryptedHeaderへの暗号化

- 9.2.6.4 EncryptedKeyを使用したSOAPメッセージの復号化

- 9.2.6.5 EncryptedKeyを使用しないSOAPメッセージの復号化

- 9.3 Web Services Securityの追加リソース

- 9.4 Oracle Web Services SecurityのJava APIリファレンス

10 Oracle Liberty SDK

- 10.1 Oracle Liberty SDKの機能と利点

- 10.2 Oracle Liberty 1.1

- 10.2.1 Oracle Liberty 1.1の環境設定

- 10.2.1.1 Oracle Liberty 1.1のシステム要件の理解

- 10.2.2 Oracle Liberty 1.1のクラスとインタフェースの概要

- 10.2.2.1 コア・クラスとインタフェースの使用方法

- 10.2.2.1.1 oracle.security.xmlsec.liberty.v11.AuthnRequestクラスの使用方法

- 10.2.2.1.2 oracle.security.xmlsec.liberty.v11.AuthnResponseクラスの使用方法

- 10.2.2.1.3 oracle.security.xmlsec.liberty.v11.FederationTerminationNotificationクラスの使用方法

- 10.2.2.1.4 oracle.security.xmlsec.liberty.v11.LogoutRequestクラスの使用方法

- 10.2.2.1.5 oracle.security.xmlsec.liberty.v11.LogoutResponseクラスの使用方法

- 10.2.2.1.6 oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierRequestクラスの使用方法

- 10.2.2.1.7 oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierResponseクラスの使用方法

- 10.2.2.2 サポート・クラスとインタフェースの使用方法

- 10.2.2.2.1 oracle.security.xmlsec.liberty.v11.LibertyInitializerクラスの使用方法

- 10.2.2.2.2 oracle.security.xmlsec.liberty.v11.LibertyURIインタフェース

- 10.2.2.2.3 oracle.security.xmlsec.liberty.v11.ac.AuthenticationContextURIインタフェースの使用方法

- 10.2.2.2.4 oracle.security.xmlsec.util.ac.AuthenticationContextStatementクラス

- 10.2.2.2.5 oracle.security.xmlsec.saml.SAMLURIインタフェース

- 10.2.2.2.6 oracle.security.xmlsec.saml.SAMLMessageクラス

- 10.2.3 Oracle Liberty 1.1のAPIリファレンス

- 10.3 Oracle Liberty 1.2

- 10.3.1 Oracle Liberty 1.2の環境設定

- 10.3.2 Oracle Liberty 1.2のクラスとインタフェースの概要

- 10.3.2.1 コア・クラスとインタフェース

- 10.3.2.1.1 oracle.security.xmlsec.saml.Assertionクラスの使用方法

- 10.3.2.1.2 oracle.security.xmlsec.samlp.Requestクラスの使用方法

- 10.3.2.1.3 oracle.security.xmlsec.samlp.Responseクラスの使用方法

- 10.3.2.1.4 oracle.security.xmlsec.liberty.v12.AuthnRequestクラスの使用方法

- 10.3.2.1.5 oracle.security.xmlsec.liberty.v12.AuthnResponseクラスの使用方法

- 10.3.2.1.6 oracle.security.xmlsec.liberty.v12.FederationTerminationNotificationクラスの使用方法

- 10.3.2.1.7 oracle.security.xmlsec.liberty.v12.LogoutRequestクラスの使用方法

- 10.3.2.1.8 oracle.security.xmlsec.liberty.v12.LogoutResponseクラスの使用方法

- 10.3.2.1.9 oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierRequestクラスの使用方法

- 10.3.2.1.10 oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierResponseクラスの使用方法

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

- 10.3.2.2.1 oracle.security.xmlsec.liberty.v12.LibertyInitializerクラス

- 10.3.2.2.2 oracle.security.xmlsec.liberty.v12.LibertyURIインタフェース

- 10.3.2.2.3 oracle.security.xmlsec.util.ac.AuthenticationContextStatementクラス

- 10.3.2.2.4 oracle.security.xmlsec.saml.SAMLInitializerクラス

- 10.3.2.2.5 oracle.security.xmlsec.saml.SAMLURIインタフェース

- 10.3.2.2.6 oracle.security.xmlsec.saml.SAMLMessageクラス

- 10.3.3 Oracle Liberty SDK 1.2のAPIリファレンス

11 Oracle XKMS

- 11.1 Oracle XKMSの機能と利点の理解

- 11.2 Oracle XKMSの環境設定

- 11.3 コア・クラスとインタフェース

- 11.3.1 oracle.security.xmlsec.xkms.xkiss.LocateRequest

- 11.3.2 oracle.security.xmlsec.xkms.xkiss.LocateResultクラスの使用方法

- 11.3.3 oracle.security.xmlsec.xkms.xkiss.ValidateRequestクラスの使用方法

- 11.3.4 oracle.security.xmlsec.xkms.xkiss.ValidateResultクラスの使用方法

- 11.3.5 oracle.security.xmlsec.xkms.xkrss.RecoverRequestクラスの使用方法

- 11.3.6 oracle.security.xmlsec.xkms.xkrss.RecoverResultクラスの使用方法

- 11.4 Oracle XKMSのJava APIリファレンス

12 Oracle JSON Web Token

- 12.1 Oracle JSON Web Tokenの機能と利点

- 12.1.1 JSON Web Tokenについて

- 12.1.2 Oracle JSON Web Tokenの機能

- 12.2 Oracle JSON Web Tokenの環境設定

- 12.3 コア・クラスとインタフェースの使用方法

- 12.4 Oracle JSON Web Tokenの使用例

- 12.4.1 JWTトークンの作成

- 12.4.2 JWTトークンの署名

- 12.4.3 JWTトークンの検証

- 12.4.4 署名なしのJWTトークンのシリアライズ

- 12.5 Oracle JSON Web Token Java APIのリファレンス

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

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

- A.2 JCEキーの理解

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

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

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

- A.4 JCE証明書の操作

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

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

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

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

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

- A.6.2.2 証明書の取得

- A.6.2.3 CRLの取得

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

B 参照

表一覧

- 1-1 公開鍵と秘密鍵の使用方法のサマリー

- 1-2 サポートされる規格

- 4-1 Oracle CMSでサポートされるコンテンツ・タイプ

- 4-2 CMS***ContentInfoクラス

- 4-3 CMSContentInfoの有用なメソッド

- 4-4 ESSReceiptの有用なメソッド

- 4-5 CMSDigestedDataContentInfoの有用なメソッド

- 4-6 CMSSignedDataContentInfoの有用なメソッド

- 4-7 CMSEncryptedDataContentInfoの有用なメソッド

- 4-8 CMSEnvelopedDataContentInfoの有用なメソッド

- 4-9 CMSAuthenticatedDataContentInfoの有用なメソッド

- 4-10 CMS***Streamクラス

- 4-11 CMS***Connectorクラス

- 5-1 oracle.security.crypto.smime.essパッケージのクラス

- 6-1 Oracle PKI TSP SDKのクラスとインタフェース

- 9-1 Oracle Web Services Securityの要素ラッパー

- 9-2 Oracle Web Services Securityのセキュリティ・トークン

- 9-3 STRキー識別子を解決するためのコールバック

- 11-1 Oracle XKMSライブラリに含まれるパッケージ

- B-1 セキュリティの規格とプロトコル

はじめに

『Oracle Security Developer Toolsによるアプリケーションの開発』では、Oracleセキュリティ開発ツールのリファレンス情報を提供します。この章に含まれる内容は次のとおりです。

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

対象読者

『Oracle Security Developer Toolsによるアプリケーションの開発』は、安全なアプリケーションの開発を担当するJava開発者を対象としています。このドキュメントでは、読者がJavaを使用したプログラミングに熟練し、セキュリティの概念(暗号化、公開鍵インフラストラクチャ、Webサービス・セキュリティ、アイデンティティ・フェデレーションなど)に詳しいことを前提としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティへの取り組みについては、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)にアクセスしてください。

Oracleサポートへのアクセス

サポートを購入したオラクル社のお客様は、My Oracle Supportを介して電子的なサポートにアクセスできます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

詳細は、Oracle Fusion Middleware 12c (12.2.1)ドキュメンテーション・セットで提供される次のドキュメントを参照してください。

- 『Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』

- 『Oracle Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護』

表記規則

このマニュアルでは次の表記規則を使用します。

表記規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

Oracleセキュリティ開発ツールの新機能

この章では、Oracleセキュリティ開発ツールの新機能および変更された機能について説明します。

12c (12.2.1)での新機能

APIドキュメント・セット(javadocs)は1つのjavadoc (Oracle Security Developer Tools Java APIリファレンス)に統合されました。

『Oracle Security Developer Toolsによるアプリケーションの開発』のこのエディションには、ユーザビリティの強化および編集上の修正が含まれています。

12c (12.1.3)の2014年9月のドキュメント改訂における更新

『Oracle Security Developer Toolsによるアプリケーションの開発』のこのエディションには、ユーザビリティの強化および編集上の修正が含まれています。

12c (12.1.3)の新機能

新しいJava APIリファレンス(javadocs)がすべてのツールに対して公開されました。

1 Oracleセキュリティ開発ツールの概要

Oracleセキュリティ開発ツールによって、デジタル署名や安全なメッセージングなどの基本タスクから、サービス指向アーキテクチャの安全な実装といった複雑なプロジェクトに及ぶ、堅牢なセキュリティ・アプリケーションの開発に必要な暗号ビルディング・ブロックが提供されます。これらのツールは、暗号化、公開鍵インフラストラクチャ、Webサービス・セキュリティおよびフェデレーテッド・アイデンティティ管理を基盤として構築されています。

セキュリティ・ツールは、アプリケーション開発プロジェクトにとって重要な構成要素です。市場のニーズや政府の規制により、重要なデータを機密保護し、改ざんや変更を防ぐことが求められます。

次のような、様々なOracle製品がOracleセキュリティ開発ツールを利用します。

- Oracle JDeveloper統合サービス環境

- システム・コンポーネントのSSL構成機能を含むOracle Platform Security Services、およびOracle Databaseなどの複数のコンポーネントで利用されるOracle Wallet

- Oracle Web Services Manager (OWSM)、Business Integration (B2B)、Oracle SOA Suiteなどのシステム・コンポーネント

この章では、この基礎を形成するセキュリティ・テクノロジについて詳しく説明し、Oracleセキュリティ開発ツールのコンポーネントを紹介します。内容は次のとおりです。

- 暗号化について

- 公開鍵インフラストラクチャ(PKI)について

- Webサービスのセキュリティについて

- SAMLについて

- Identity Federationについて

- Oracleセキュリティ開発ツールについて

- サポートされる規格について

- CLASSPATH環境変数の設定

- リファレンス

1.1 暗号化について

暗号化により、通信チャネルで送信されるメッセージを侵入者による傍受(受動的攻撃)または変更(能動的攻撃)から守ります。メッセージを保護するには、発信者が暗号化ツールを使用して、読取り可能なプレーン・メッセージ、すなわち平文を暗号化された暗号文に変換します。メッセージの受信者も暗号化ツールを使用し、暗号文を元の読取り可能な形式に復号化します。

暗号化では、次の機能が提供され、インターネットなどネットワークを介した通信が保護されます。

- 認証: 情報の受信者に、その情報が信頼できるソースからのものであることを保証します。通常、認証は、メッセージ認証コード(MAC)、デジタル署名およびデジタル証明書を使用して達成されます。

- 機密保護: 意図した受信者のみがメッセージを読み取ることを保証します。通常、機密保護は暗号化によって実現されます。

- 整合性: 受信したメッセージが元のメッセージから変更されていないことを保証します。通常、整合性は暗号化ハッシュ関数を使用して保証されます。

- 否認防止: 所定の送信者が特定のメッセージを実際に送信したことを証明する方法です。通常、否拒否はデジタル署名を使用して実行されます。

暗号化に関するその他の暗号化リソースについては、リファレンスを参照してください。

1.1.1 暗号化アルゴリズムのタイプ

暗号化アルゴリズム(または暗号)では、鍵を使用して平文と暗号文を相互に変換します。基本的には3つのタイプの暗号化アルゴリズムがあり、暗号化と復号化に使用される鍵の数と、適用方法や使用方法によって分類されます。これらは、対称暗号化アルゴリズム、非対称暗号化アルゴリズムおよびハッシュ関数です。

各タイプは特定の用途に最適化されています。ハッシュ関数はデータの整合性の保証に適しています。対称暗号化はメッセージの暗号化に最適です。非対称暗号化は、鍵の安全な交換、認証および否認防止に使用されます。また、非対称暗号化はメッセージの暗号化にも使用できますが、頻繁ではありません。対称暗号化は非対称暗号化の約1000倍の速度で処理されるため、非対称暗号化よりも暗号化に適しています。

暗号化アルゴリズム・タイプを次に示します。

- 対称暗号化アルゴリズムについて

- 非対称暗号化アルゴリズムについて

- ハッシュ関数の理解

1.1.1.1 対称暗号化アルゴリズムについて

対称暗号化アルゴリズム(または秘密鍵暗号化)は、暗号化と復号化の両方で1つの鍵を使用します。送信者が鍵を使用して平文を暗号化し、暗号文を受信者に送信します。受信者は同じ鍵を使用してメッセージを復号化し、平文に戻します。送信者と受信者の両方が鍵を知っている必要があります。対称暗号化の最大の問題は、鍵を安全に配布することです。

一般的に、対称暗号化スキームはブロック暗号とストリーム暗号に分類されます。ブロック暗号では、固定サイズのデータ・ブロック(通常は64ビット)が一度に1つずつ暗号化され、各ブロックには同じ鍵が使用されます。現在使用されている一般的なブロック暗号には、Blowfish、AES、DESおよび3DESがあります。

ストリーム暗号は、一度に1ビットで処理され、特定の形式のフィードバック・メカニズムの実装によって、鍵が絶えず変更されます。RC4は、SSLプロトコルを使用した安全な通信のために使用されるストリーム暗号の一例です。

1.1.1.2 非対称暗号化アルゴリズムについて

非対称暗号化アルゴリズム(または公開鍵暗号化)では、平文の暗号化と暗号文の復号化にそれぞれ別の鍵が使用されます。どちらの鍵を先に適用してもかまいませんが、暗号が機能するためには両方の鍵が必要です。

非対称暗号化では、1つの鍵が公開鍵として指定され、広く使用されます。もう1つの鍵は秘密鍵に指定され、第三者には公開しません。このスキームでメッセージを送信する場合、送信者は受信者の公開鍵を使用して情報を暗号化します。受信者は自身の秘密鍵を使用して暗号文を復号化します。この方法は、メッセージの送信者を証明する場合にも使用できます(否認防止)。送信者は自身の秘密鍵を使用して平文を暗号化でき、受信者は、送信者の公開鍵を使用してメッセージを復号化するため、メッセージがその送信者から実際に送信されたことがわかります。

現在使用されている一般的な非対称アルゴリズムには、RSA、DSAおよびDiffie-Hellmanがあります。

1.1.1.3 ハッシュ関数の理解

ハッシュ関数(またはメッセージ・ダイジェスト)は、本質的に鍵を使用しない一方向暗号化アルゴリズムです。かわりに、平文に基づいて固定長のハッシュ値を計算しますが、この値から、平文の内容または長さを復元することはできません。通常、ハッシュ・アルゴリズムは、ファイルの内容のデジタル・フィンガープリントを提供するために使用され、ファイルが侵入者やウイルスによって変更されていないことを確認するためによく使用されます。また、ハッシュ関数は、一般に多くのオペレーティング・システムでパスワードの暗号化に利用されています。ハッシュ関数は、ファイルの整合性の保持にも有用です。一般的なハッシュ関数には、MD2、MD4、MD5、SHAなどがあります。

1.2 公開鍵インフラストラクチャ(PKI)について

公開鍵インフラストラクチャ(PKI)は、パブリック・ネットワークおよびプライベート・ネットワークでの安全な通信を実現するために設計されています。データの安全な送信と格納のみでなく、PKIによって、電子メールの安全性、デジタル署名およびデータの整合性も実現されます。PKIでは公開鍵暗号化が使用されます。これは、関連する1組の暗号鍵を使用して、送信者のアイデンティティ確認(デジタル署名)や、メッセージのプライバシ確保(暗号化)を行う数学的な技術です。PKIの機能によって、インターネットでの情報交換が保護されます。

PKIの目的を達成するためには、次の要素が必要です。

- 通信を保護する暗号化アルゴリズムと鍵

- 公開鍵を所有者のIDに関連付けるデジタル証明書

- 暗号化を広く安全に使用できるようにする鍵の配布方法

- 鍵とその正当な所有者の関係を保証する、認証局(CA)と呼ばれる信頼できるエンティティ

- CAに対する証明書リクエストの情報を確認する登録局(RA)

利用者は、CAが発行した証明書とそれに含まれる公開鍵を使用して、デジタル証明書を確認し、データを暗号化します。

1.2.1 鍵ペアの理解

暗号化技術では、送信者と受信者のみが知っている鍵がよく使用されます。公開鍵暗号化では、数学的に関連する暗号鍵(公開鍵と秘密鍵)の鍵ペアが使用されます。

両者が同じ鍵を使用する暗号化スキームは対称と呼ばれます。対称システムを利用する際の難点として、鍵を傍受されずに両者に渡すことや、1組の受信者と送信者ごとに個別の鍵が必要になるため、各ユーザーが多数の鍵(受信者ごとに1つずつ)を管理する必要があることがあげられます。

鍵ペアの使用方法は、「非対称暗号化アルゴリズムについて」を参照してください。

表1-1に、公開鍵と秘密鍵の利用者と目的をまとめています。

表1-1 公開鍵と秘密鍵の使用方法のサマリー

機能

鍵のタイプ

鍵の所有者

受信者のためにデータを暗号化

公開鍵

受信者

データの署名

秘密鍵

送信者

受信データの復号化

秘密鍵

受信者

署名の検証

公開鍵

送信者

1.2.2 認証局について

認証局(CA)は、公開鍵の所有者のIDを保証する、信頼できるサード・パーティです。

認証局の例には、Verisign社やThawte社があります。

1.2.3 デジタル証明書とは

認証局は、デジタル証明書を作成して、公開鍵と特定のエンティティとの関係を検証します。このデジタル証明書には、公開鍵、鍵所有者および署名する認証局の情報が含まれます。

エンティティのアイデンティティを証明するためにPKI証明書を使用することは、運転免許証やパスポートで身分を証明することと似ています。

1.2.4 関連するPKIの規格

多数の規格やプロトコルで、PKI証明書の実装がサポートされています。これらは、暗号メッセージ構文(CMS)、Secure/Multipurpose Internet Mail Extension (S/MIME)、Lightweight Directory Access Protocol (LDAP)、タイムスタンプ・プロトコル(TSP)、オンライン証明書ステータス・プロトコル(OCSP)およびCertificate Management Protocol (CMP)です。

暗号メッセージ構文

暗号メッセージ構文(CMS)は、Internet Engineering Task Force (IETF)によって開発されたデータ保護の一般的な構文です。署名付きデータ、エンベロープ・データ、ダイジェスト、暗号化データなど、様々なコンテンツ・タイプがサポートされます。CMSでは複数のカプセル化が可能になるため、たとえば、事前に署名されているデータを、受け取った相手がエンベロープに入れることができます。

CMSで生成される値は、X.509基本エンコーディング規則(BER)を使用してエンコードされます。つまり、値は8ビット文字列として表されます。

Secure/Multipurpose Internet Mail Extension

Secure/Multipurpose Internet Mail Extension (S/MIME)は、デジタル署名と暗号化を使用したMIMEデータの保護に関するInternet Engineering Task Force (IETF)の規格。

S/MIMEでは、電子メッセージ・アプリケーションのために次の暗号化セキュリティ・サービスが提供されます。

- 認証

- メッセージ整合性と発信元の否認防止(デジタル署名の使用)

- プライバシとデータ・セキュリティ(暗号化の使用)

Lightweight Directory Access Protocolの略。

Lightweight Directory Access Protocol (LDAP)は、一般的に使用されているディレクトリ・サーバーとの間で情報の取得とポストを行うためのオープン規格です。公開鍵インフラストラクチャ(PKI)システムでは、多くの場合、ユーザーのデジタル証明書はLDAPディレクトリに格納され、必要に応じて、リクエスト・アプリケーションやリクエスト・サービスによってアクセスされます。

タイムスタンプ・プロトコル

タイムスタンプ・プロトコル(TSP)システムでは、信頼できるサード・パーティのタイムスタンプ局(TSA)がデジタル・メッセージのタイムスタンプを発行します。タイムスタンプによって、メッセージが特定のエンティティから特定の時刻に送信されたことが証明され、オンライン・トランザクションに否認防止機能が提供されます。

タイムスタンプ・プロトコルでは、RFC 3161に指定されているように、デジタル・メッセージのタイムスタンプに関連するエンティティ、メッセージ書式および転送プロトコルが定義されます。

タイムスタンプ・システムが機能する方法を確認するために、Sallyが文書に署名し、タイムスタンプを必要とする場合について説明します。彼女が安全なハッシュ関数を使用して文書のメッセージ・ダイジェストを計算し、メッセージ・ダイジェスト(文書自体ではなく)をTSAに送信すると、メッセージ・ダイジェスト、それがTSAサーバーで受信された日時、およびTSAの署名で構成されるデジタル・タイムスタンプが、TSAから返されます。メッセージ・ダイジェストからは文書の内容に関する情報はわからないため、TSAがタイムスタンプの際に文書を傍受することはありません。その後、Sallyは文書とタイムスタンプを一緒に示して、文書の作成時刻を証明できます。ベリファイアは、文書のメッセージ・ダイジェストを計算し、タイムスタンプのダイジェストと一致することを確認して、タイムスタンプのTSAの署名を検証します。

オンライン証明書ステータス・プロトコル

Online Certificate Status Protocol (OCSP)は、デジタル証明書の有効性確認において、広く使用されている2つの方式のうちの1つ。もう1つの方式は証明書失効リスト(CRL)と呼ばれ、OCSPよりも古く、使用シナリオによってはOCSPに置き換えられています。

OCSPでは、クライアント側でリストを最新に保つために、更新分を頻繁にダウンロードする必要があるというCRLの大きな制限が解消されています。ユーザーがサーバーにアクセスしようとすると、OCSPは証明書ステータス情報のリクエストを送信します。サーバーは、レスポンス(有効、失効または不明)を返信します。このプロトコルによって、サーバー(証明書ステータスを格納する)とクライアント・アプリケーション(ステータスが通知される)の間の通信の構文が指定されます。

Certificate Management Protocol

Certificate Management Protocol (CMP)を使用すると、証明書の作成および管理に関連する処理のすべてを実行できます。CMPでは、公開鍵インフラストラクチャ(PKI)の構成要素(認証局(CA)、登録局(RA)、証明書発行先のエンド・エンティティなど)間の相互作用がサポートされます。

1.2.5 PKIの利点

PKIは、安全で信頼できる認証を提供します。データ整合性と否認防止を実現し、送信または格納されている情報への未許可アクセスを防止します。

PKIを使用した場合のユーザーの利点は次のとおりです。

- 安全で信頼できるユーザーの認証
信頼できる認証は次の2つの要因に基づきます。1つは、公開鍵と秘密鍵のペアの秘密鍵部分の所有を証明することで、これは、公開鍵を使用する自動手順で確認されます。もう1つは、特定のアイデンティティへの公開鍵の所属が認証局によって検証されることです。PKIに基づくデジタル証明書では、鍵ペアに基づいてこのアイデンティティの接続が検証されます。

- データ整合性
公開鍵と秘密鍵のペアの秘密鍵を使用してデジタル・トランザクションに署名すると、送信中にデータを変更することが困難になります。このようなデジタル署名は、送信者の秘密鍵で暗号化された元のメッセージのダイジェストがコード化されたものです。受信者は、送信者の対応する公開鍵を使用して、メッセージの送信者、およびメッセージが変更されていないことを確認できます。メッセージまたはダイジェストの変更があると、公開鍵を使用した検証が失敗するため、メッセージを信頼できないことが受信者に伝わります。

- 非拒否
PKIは、メッセージの送信者を証明する場合にも使用できます。送信者は自身の秘密鍵を使用して平文を暗号化してデジタル署名を作成し、受信者は、送信者の公開鍵を使用してメッセージを復号化するため、メッセージがその送信者から実際に送信されたことがわかり、メッセージの発信者がメッセージを否認することは困難になります。この機能は否認防止と呼ばれます。

- 送信または格納されている情報への未許可アクセスの防止
公開鍵から秘密鍵を導出するためにはかなりの時間と労力が必要になるため、鍵ペアの所有者以外がメッセージを復号化することは考えられません。

1.3 Webサービスのセキュリティについて

Webサービスでは、組織がXML、SOAP、WSDLなどの標準のオープン・テクノロジを使用してWebベース・アプリケーションを統合するための標準的な方法を提供しています。コア仕様のSOAPによってXMLやWebサービスに関連する多くの問題が解決されますが、機密保護、整合性、メッセージ認証、否認防止など、メッセージ・セキュリティ要件に対処する手段は提供されません。

SOAPは、サービス指向環境で情報を交換するための軽量プロトコルです。このような環境では、アプリケーションは、他のアプリケーションで使用するように選択した機能(ビジネス・ロジックなど)を公開できます。SOAPは、アプリケーションがこれらのサービスを提供および消費するための手段を提供します。これは分散非集中管理Webサービス・アプリケーション環境でのメッセージ転送のためのXMLベースのプロトコルです。

SOAPを保護するニーズが高まったため、OASISは次のようなWebサービス・セキュリティの規格を提唱しています。

- SOAPメッセージの署名と暗号化を可能にする拡張機能の指定。

- セキュリティ・トークンとメッセージを関連付ける汎用メソッドの指定。

- メッセージに組み込まれるトークンの特徴を指定するための、その他の手段の提供。

1.4 SAMLについて

Security Assertions Markup Language(SAML)は、インターネットでセキュリティ情報を交換する際に利用するXMLベースのフレームワークです。SAMLを使用すると、通常は相互運用できない様々なセキュリティ・サービス・システム間で、認証や認可の情報を交換できます。

SAML 1.0、1.1および2.0仕様は、それぞれ2002年、2003年および2005年にOrganization for the Advancement of Structured Information Standards (OASIS)に採用されました。OASISは、E-Business規格の開発、統合および採用を促進する国際的な非営利団体です。

SAML 2.0では、Liberty ID-FF、Shibboleth、SAML 1.0/1.1の各フェデレーション・プロトコルが統合されています。

1.4.1 SAMLアサーションの理解

SAMLは、電子メール・アドレスやディレクトリのリストなどのIDをユーザーやシステムなどのサブジェクトに関連付けて、特定のドメインでのアクセス権を定義します。基本SAML文書はAssertionで、Subject(通常はユーザー)に関する事実の宣言が含まれます。

SAMLでは、次の3種類の宣言(Statement)が提供されます。

- AuthnStatement: ユーザーが特定の方法で特定の日時に認証されたことを表明します。

- AttributeStatement: ユーザーが特定の属性や詳細情報(従業員番号や口座番号など)に関連付けられていることを表明します。

- AuthzDecisionStatement: 特定のリソースに対する特定アクセスのユーザー・リクエストが許可または拒否されたことを表明します。

アサーションは、すでに発生したイベントに関して生成されるXML文書です。SAMLによって資格証明に関するアサーションが作成されますが、実際にユーザーの認証や許可が行われるわけではありません。例1-1に、SAMLPレスポンス・メッセージにラップされた典型的なSAMLの認証アサーションを示します。

例1-1 SAML 1.0認証アサーションを含むサンプルSAMLPレスポンス

<samlp:Response
MajorVersion="1" MinorVersion="0"
ResponseID="128.14.234.20.90123456"
InResponseTo="123.45.678.90.12345678"
IssueInstant="2005-12-14T10:00:23Z"
xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol">
<samlp:Status>
<samlp:StatusCode Value="samlp:Success" />
</samlp:Status>
<saml:Assertion
MajorVersion="1" MinorVersion="0"
AssertionID="123.45.678.90.12345678"
Issuer="IssuingAuthority.com"
IssueInstant="2005-12-14T10:00:23Z" >
<saml:Conditions
NotBefore="2005-12-14T10:00:30Z"
NotAfter="2005-12-14T10:15:00Z" />
</saml:Conditions
<saml:AuthenticationStatement
AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"
AuthenticationInstant="2005-12-14T10:00:20Z">
<saml:Subject>
<saml:NameIdentifier NameQualifier="RelyingParty.com">
john.smith
</saml:NameIdentifier>
<saml:SubjectConfirmation>
<saml:ConfirmationMethod>
urn:oasis:names:tc:SAML:1.0:cm:artifact-01
</saml:ConfirmationMethod>
</saml:SubjectConfirmation>
</saml:Subject>
</saml:AuthenticationStatement>
</saml:Assertion>
</samlp:Response>

1.4.2 SAMLリクエストおよびレスポンスの理解

あるユーザーがSAML準拠サービスにサインオンすると、そのサービスによって認証アサーションのリクエストが発行局(アイデンティティ・プロバイダ)に送信されます。発行認証局は、そのユーザーが特定の方法で特定の時刻に認証されていることを記述した「認証アサーション」参照を返します。

アサーションを発行する機関は、発行局またはIDプロバイダと呼ばれます。発行局は、サード・パーティのサービス・プロバイダまたは、民間の企業連合内で発行局の役割を果す企業です。発行局やIDプロバイダを信頼してサービスを利用するSAML準拠のアプリケーションおよびサービスは、利用者またはサービス・プロバイダと呼ばれます。

1.4.2.1 SAMLのリクエストおよびレスポンスのサイクルについて

典型的なSAMLサイクルでは、特定のクライアント・リクエストの認証を必要とする利用者(サービス・プロバイダ)が、SAMLリクエストを発行局またはIDプロバイダに送信します。アイデンティティ・プロバイダは、リクエストされたセキュリティ情報を利用者(サービス・プロバイダ)に提供する、SAMLアサーションで応答します。

たとえば、あるユーザーが利用者またはアイデンティティ・プロバイダのSAML準拠サービスにサインオンすると、そのサービスによって認証アサーションのリクエストが発行局(アイデンティティ・プロバイダ)に送信されます。発行認証局は、そのユーザーが特定の方法で特定の時刻に認証されていることを記述した「認証アサーション」参照を返します。次に、サービスは、ユーザーの資格証明の検証用に、このアサーションの参照先を他の利用者またはアイデンティティ・プロバイダのサイトに渡すことができます。認証を必要とする別のSAML準拠サイトにユーザーがアクセスすると、そのサイトは参照先を使用して発行局やアイデンティティ・プロバイダに認証アサーションをリクエストし、これにより、ユーザーがすでに認証されていることが通知されます。

発行局では、アサーション・レイヤーが、通信や転送の様々なプロトコル(HTTP、SOAPなど)にバインドできるSAMLプロトコルを使用して、リクエストおよびレスポンス・メッセージを処理します。クライアントは常にアサーションを消費しますが、発行局やアイデンティティ・プロバイダは、アサーションの作成と検証の両方を行うため、プロデューサおよびコンシューマとして機能できることに注意してください。

このサイクルを図1-1に示します。

図1-1 SAMLのリクエストとレスポンスのサイクル

この図は、SAMLのリクエストとレスポンスのサイクルを表し、ユーザー、利用者の枠および発行局の枠を示します。ユーザーまたはクライアントのリクエストはまず利用者に送られ、利用者がSAMLリクエストを発行局に送ります。発行認証局はSAMLアサーションで回答し、リクエストされたセキュリティ情報をリライング・パーティに提供します。利用者(複数の利用者が可能)とのクライアントの通信が双方向矢印で示され、利用者と発行局の間のリクエストとレスポンスの通信も双方向矢印で示されます。

発行局を示す枠では、アサーション・レイヤー(SAML)とトランスポート・レイヤー(HTTP、SOAPなど)が分かれており、これらのレイヤー間の通信により発行局がアサーションを作成および検証できることを示します。

1.4.2.2 SAMLのプロトコル・バインディングとプロファイルについて

SAMLでは、アサーションのリクエストおよび取得のためのプロトコル(SAMLP)が定義されます。バインディングにより、SAMLメッセージと標準通信プロトコルのマッピングが提供され、SAMLのリクエスト・メッセージとレスポンス・メッセージが発行局(アイデンティティ・プロバイダ)と利用者(アイデンティティ・プロバイダ)の間で転送される標準的な方法が定義されます。たとえば、SAMLのリクエストおよびレスポンスのために定義された転送メカニズムとしては、HTTP上のSimple Object Access Protocol (SOAP)があります。これにより、複数のWebサービス間で標準的な方法でSAML情報を交換できるようになります。

プロファイルでは、特定の転送バインディングでSAMLアサーションとプロトコル・メッセージを組み合せて、特定のユースケースを達成する方法が指定されます。最も広く実装されているSAMLプロファイルの例としては、シングル・サインオンのためのWebブラウザのプロファイルや、SOAPペイロードを保護するSOAPプロファイルがあります。

1.4.2.3 SAMLとXMLセキュリティの統合方法

また、SAMLは、XML文書に暗号化したデータまたはデジタル署名を埋め込むためのWorld Wide Web Consortiumの規格であるXML署名およびXML暗号化と統合するように設計されています。XML署名をサポートすることで、SAMLは認証のみでなく、メッセージ整合性や送信者の否認防止も処理できるようになります。Oracle XML Securityの詳細は、Oracle XML Securityを参照してください。

1.5 Identity Federationについて

国際的な企業は、供給業者や顧客にいっそう緊密な関係を求めるようになり、これまで以上に密接でしかも安全性の高い商取引を形成するという課題に直面しています。商取引を行う関係者は、取引先の個人または代理店のアイデンティティを確認する必要があります。また、取引をする企業のために行動する権限をその個人または代理店が持っていることも確認する必要があります。フェデレーテッド・アイデンティティ管理では、関係者の間に信頼関係が確立され、相手方が発行したセキュリティ・トークンを認識して利用できます。Identity Federationにより、複雑性、コストの管理、従業員と顧客のためにリソースへの安全なアクセスを実現すること、法規制の順守などの課題が解消されます。

従来、企業が提携して業務を行う場合は、提携企業のために行動するすべてのエンティティの名前、職責、その他の関連情報を収集していました。特に大企業においては役割や職責は変化するため、データの維持や管理のコストが急速にきわめて高くなり、ロジスティック上の問題を引き起こすことがあります。

フェデレーションの重要な概念は次のとおりです。

- プリンシパル - フェデレーテッド環境の重要なアクター。許可されたビジネス・タスクを実行するエンティティです。

- IDプロバイダ - プリンシパルのIDを認証するサービス。

- サービス・プロバイダ - プリンシパルまたはその他のエンティティにサービスを提供するエンティティ。たとえば、旅行代理店は、パートナの従業員(プリンシパル)に対してはサービス・プロバイダとして機能できます。

- シングル・サインオン - あるシステム・エンティティ(IDプロバイダ)で認証し、他のエンティティ(サービス・プロバイダ)がその認証を認めるようにする、プリンシパルの機能。

注意:

ここで説明した規格の詳細は、「リファレンス」を参照してください。

1.6 Oracleセキュリティ開発ツールについて

Oracleセキュリティ開発ツールは、暗号化の規格とプロトコルを使用して多様なセキュリティ・タスクとプロジェクトの実装を可能にするJavaツールです。

この項には次のトピックが含まれます。

- ツールキットのアーキテクチャの理解

- XML、SAMLおよびWeb Services Securityアプリケーションのツール

- 公開鍵暗号化(PKI)アプリケーションのツール

- 電子メール・セキュリティ・アプリケーションのツール

- 低レベルの暗号化アプリケーションのツール

- Web Tokenのためのツール

1.6.1 ツールキットのアーキテクチャの理解

Oracle Security Developer Toolsは、様々な設定レイヤーに配置されるXML、SAMLおよびWeb Services Securityアプリケーションのツール、公開鍵暗号化(PKI)アプリケーションのツール、電子メール・セキュリティ・アプリケーションのツール、低レベルの暗号化アプリケーションのツール、およびWeb Tokenのためのツールで構成されます。

ツールキット内の各ツールを全体として考え、アプリケーションごとにツールの機能のサブセットを確認すると便利です。

図1-2 Oracleセキュリティ開発ツール

図1-2は、Oracleセキュリティ開発ツールのコンポーネントを示しています。通常、各ツールは、スタック内のすぐ下のツールで提供される機能を利用します。たとえば、Oracle SAMLツールは、Oracle XMLセキュリティ・ツールで提供される機能を利用します。

次の点に注意してください。

- 概念上、ツールは、下部のレイヤーに基本ビルディング・ブロックがあるレイヤーに配置されており、各追加レイヤーは、直下のレイヤーを利用してその上に構築され、特定のセキュリティ・アプリケーションのためのツールを提供しています。

- この図は、階層やシーケンス図ではありません。コンポーネント間の関係、および、スタックの上昇に伴う、下位レベルのツールから特化されたアプリケーション固有のコンポーネントへの進行を表しています。

Oracle CryptoおよびOracle Security Engineは、このセットの基本的な暗号化ツールです。次のレイヤーには、Oracle CMS(メッセージ構文)、Oracle XML Security (署名の暗号化)、Oracle PKI SDK (Oracle PKI LDAP SDK、Oracle PKI TSP SDK、Oracle PKI OCSP SDKおよびOracle PKI CMP SDKで構成されるPKIツール・スイート)があります。Oracle S/MIMEは、Oracle CMSを利用して安全な電子メールのためのツールセットを提供します。次のレイヤーには、Oracle SAMLおよびOracle Liberty SDKがあり、構造化アサーション・マークアップとフェデレーテッド・アイデンティティ管理の機能が提供されます。最後に、Oracle Web Services Securityは、Webサービスとの安全な対話を促進します。

1.6.2 XML、SAMLおよびWeb Services Securityアプリケーションのツール

Oracle XML Securityパッケージでは、XMLドキュメントのセキュリティが提供されます。Oracle Web Services Security、Oracle SAMLおよびOracle Liberty SDKの基盤が提供されます。

Oracle XML Securityパッケージでは、ツールキットの次のコンポーネントの基盤が提供されます。

- Oracle Web Services Security

- SAML 1.0および2.0準拠のJavaセキュリティ・サービスを開発するためのOracle SAML

- シングル・サインオン(SSO)およびLiberty Alliance仕様に基づいたフェデレーテッド・アイデンティティ・アプリケーションのためのOracle Liberty SDK

図1-3 XML、SAMLおよびWS Securityのツール

この図は、Oracle SAML、Oracle Web Services SecurityおよびOracle LibertyのツールがOracle XML Security上に構築されている様子を示しています。

注意:

この図は、わかりやすくする都合上、やむを得ず簡素化していますが、実際は、Oracleセキュリティ開発ツール間のjarの関係は複雑であり、実装の詳細に依存しています。たとえば、SAMLライブラリを使用する場合、実際は次のような複数のコンポーネントが必要になります。

- SAMLでは署名が必要なため、Oracle XML Securityライブラリが必要です。

- Oracle Security Engineでは、証明書とCRL管理機能が提供されます

依存関係の全体像については、図1-2を参照してください。各アプリケーションのタイプに適した環境を確認できるように、各ツールのクラスパスの設定に関する手順は、このガイドで後述するツールに関する章を参照してください。

1.6.2.1 Oracle XML Securityについて

XMLセキュリティとは、XML文書の共通データ・セキュリティ要件(機密保持、整合性、メッセージの認証、否認防止など)を意味します。

Oracle XML Securityは、次の機能を提供してこれらのニーズを満たします。

- 復号化変換規格案のサポート

- XML正規化規格のサポート

- 排他的XML正規化規格のサポート

- JAXP 1.1準拠の様々なXMLパーサーおよびXSLTエンジンとの互換性

1.6.2.2 Oracle SAMLについて

Oracle SAML APIは、SAML準拠のJavaセキュリティ・サービスの開発者を支援するツールとマニュアルを提供します。Oracle SAMLは、アプレット、アプリケーション、EJB、サーブレット、JSPなどの既存のJavaソリューションに統合できます。

Oracle SAMLでは次の機能が提供されます。

- SAML 1.0/1.1および2.0仕様のサポート

- SAMLベースのシングル・サインオン(SSO)、属性、メタデータ、拡張クライアント・プロキシ、およびフェデレーテッド・アイデンティティ・プロファイルのサポート

1.6.2.3 Oracle Web Services Securityについて

Oracle Web Services Securityでは、Organization for the Advancement of Structured Information Standards (OASIS仕様)に基づく認証と認可のフレームワークが提供されます。Oracle Web Services Securityでは次の機能が提供されます。

- SOAPメッセージ・セキュリティ規格(SOAP 1.1、1.2)のサポート

- ユーザー名トークン・プロファイル規格(UsernameToken Profile 1.1)のサポート

- X.509証明書トークン・プロファイル規格のサポート

- WSS SAMLトークン・プロファイル(バージョン1.0)のサポート

注意:

WSS SAMLトークン・プロファイルのバージョンは、SAMLのバージョンとは異なります。

1.6.2.4 Oracle Liberty SDKについて

Java開発者は、Oracle Liberty SDKを使用することで、Liberty Alliance仕様に基づくシングル・サインオン(SSO)およびフェデレーテッド・アイデンティティ・ソリューションを設計および開発することができます。Oracle Liberty SDKバージョン1.1および1.2は、Liberty Alliance 1.1および1.2の仕様に準拠するシステムの開発と統合のあらゆる面の統一、単純化および拡張を目的としています。

Oracle Liberty SDKでは次の機能が提供されます。

- Liberty Allianceプロジェクト・バージョン1.1および1.2仕様のサポート

- Libertyベースのシングル・サインオンとフェデレーテッド・アイデンティティのサポート

注意:

この章で説明した規格と仕様の詳細は、「リファレンス」を参照してください。

1.6.3 公開鍵暗号化(PKI)アプリケーションのツール

Oracle PKIパッケージは、LDAPリポジトリ内のデジタル証明書を処理するためのツール、RFC 3161に準拠するタイプスタンプ・サービスを開発するためのツール、RFC 2560に準拠したOCSPメッセージングのためのツール、およびCertificate Management Protocol (CMP)仕様のためのツールで構成されています。Oracle PKIパッケージでは、デジタル署名処理のためのXMLトランザクションの開発を可能にするOracle XKMSの基盤も提供されます。

図1-4 PKIツール

この図は、Oracle LDAP、Oracle TSP、Oracle OCSPおよびOracle CMPで構成されるOracle PKIツール上に、Oracle XKMSツールが構築されている様子を示しています。

1.6.3.1 Oracle PKI LDAP SDKについて

Oracle PKI LDAP SDKでは、LDAPディレクトリ内のデジタル証明書にアクセスする機能が提供されます。Oracle PKI LDAP SDKを使用して実行できるタスクの一部を次に示します。

- LDAPディレクトリにあるユーザーの証明書の検証

- LDAPディレクトリへの証明書の追加

- LDAPディレクトリからの証明書の取出し

- LDAPディレクトリからの証明書の削除

1.6.3.2 Oracle PKI TSP SDKについて

Oracle PKI TSP SDKの特徴と機能は次のとおりです。

- Oracle PKI TSP SDKはRFC 3161に準拠し、このタイムスタンプ・プロトコル(TSP)仕様に準拠する他の製品と互換性があります。

- Oracle PKI TSP SDKでは、TSAサーバーのサンプル実装が提供されます。これは、TSPリクエスト・メッセージをテストするため、または独自のタイムスタンプ・サービスを開発する基礎として使用できます。

1.6.3.3 Oracle PKI OCSP SDKについて

Oracle PKI OCSP SDKの特徴と機能は次のとおりです。

- Oracle PKI OCSP SDKは、RFC 2560に準拠し、この仕様に準拠する他の製品(Valicert社のValidation Authorityなど)と互換性があります。

- Oracle PKI OCSP SDK APIでは、OCSPリクエスト・メッセージを構成するためのクラスとメソッドが提供されます。このメッセージは、HTTPを介してRFC 2560に準拠する任意の検証局に送信できます。

- Oracle PKI OCSP SDK APIでは、OCSPリクエスト・メッセージのレスポンスを構成するためのクラスとメソッドが提供されます。また、発行した証明書の有効性をチェックするための独自のOCSPサーバーを開発する基礎として使用可能なOCSPサーバー実装が提供されます。

1.6.3.4 Oracle PKI CMP SDKについて

Certificate Management Protocol (CMP)メッセージでは、次の機能セットがサポートされます。

- エンティティの登録(証明書の発行よりも先に行われる)

- 初期化(鍵ペアの生成など)

- 認証(証明書の発行)

- 鍵ペアのリカバリ(なくした鍵の再発行)

- 鍵ペアの更新(証明書が失効し、新しい鍵ペアと証明書を発行する必要が生じた場合)

- CAへの失効リクエスト(CRLへの証明書の組込み)

- 2つのCAでのクロス認証

Oracle PKI CMP SDKはRFC 2510に準拠し、Certificate Management Protocol仕様に準拠する他の製品と互換性があります。また、RFC 2511にも準拠し、この証明書要求メッセージ・フォーマット(CRMF)仕様に準拠する他の製品と互換性があります。

1.6.3.5 Oracle XKMSについて

Oracle XKMS (XML Key Management Specification)を使用すると、開発者はデジタル署名の処理に関するXMLトランザクションを記述できるため、公開鍵のインフラストラクチャを簡単に処理できるようになります。Oracle XKMSにはW3C XKMS規格が実装されており、公開鍵インフラストラクチャに関連するコストや複雑性をある程度軽減することができます。

1.6.4 電子メール・セキュリティ・アプリケーションのツール

Oracle CMSでは、CMSオブジェクトの読取りと書込みのためのツールが提供されるだけでなく、証明書の解析と検証、X.509証明書、秘密鍵の暗号化、および関連する機能を含む、電子メール・セキュリティのためのOracle S/MIMEツールの基盤も提供されます。

図1-5 CMSおよびS/MIMEツール

この図は、Oracle S/MIMEツールがOracle CMS上に構築されている様子を示しています。

1.6.4.1 Oracle CMSについて

Oracle CMSでは、CMSオブジェクトの読取りと書込みのツールや、安全なメッセージ・エンベロープを開発するためのサポート・ツールなど、豊富なツールが提供されます。

Oracle CMSでは、RFC 2630に規定されているIETF暗号メッセージ構文が実装されます。Oracle CMSでは、RFC 2630のコンテンツ・タイプがすべて実装されます。

1.6.4.2 Oracle S/MIMEについて

Oracle S/MIMEでは、次のSecure/Multipurpose Internet Mail Extension (S/MIME)の機能が提供されます。

- 拡張領域付きX.509バージョン3証明書の全面的なサポート(証明書の解析と検証などを含む)。

- PKCS#7およびPKCS#12形式のX.509証明連鎖のサポート。

- PKCS#5、PKCS#8およびPKCS#12を使用する秘密鍵暗号化。

- ASN.1 DER/BER形式でのデータの入出力のための統合ASN.1ライブラリ。

1.6.5 低レベルの暗号化アプリケーションのツール

Oracle Cryptoでは、様々な暗号化アルゴリズム、メッセージ・ダイジェストおよびMACアルゴリズムだけでなく、X.509証明書とCRL拡張機能のためのOracle Security Engineの基礎も提供されます。

図1-6 暗号化ツール

この図は、Oracle Security EngineがOracle Cryptoツール上に構築されている様子を示しています。

1.6.5.1 Oracle Cryptoについて

Oracle Cryptoのツールキットでは、次の機能が提供されます。

- 公開鍵暗号化。RSAなど。

- デジタル署名アルゴリズム。Digital Signature Algorithm (DSA)、RSAなど。

- 鍵交換アルゴリズム。Diffie-Hellmanなど。

- 対称暗号化アルゴリズム。Blowfish、AES、DES、3DES、RC2、RC4など。

- メッセージ・ダイジェスト・アルゴリズム。MD2、MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512など。

- MACアルゴリズム。HMAC-MD5、HMAC-SHA-1など。

- ASN.1オブジェクトの構築および解析のためのメソッド。

1.6.5.2 Oracle Security Engineについて

Oracle Security Engineのツールキットでは、次の機能が提供されます。

- RFC 3280に定義されているX.509バージョン3証明書。

- PKCS#12の全面的なサポート

- 証明書リクエストのためのPKCS#10のサポート。

- RFC 3280で定義されているCRL

- Signed Public Key And Challenge (SPKAC)の実装。

- X.500相対識別名のサポート。

- X.509証明書とCRLをラップするためのPKCS#7のサポート。

- 標準X.509証明書とCRL拡張の実装。

1.6.6 Web Tokenのためのツール

Oracle JWTにより、JSON Web Signature (JWS)を使用してデジタル署名され、オプションで、JSON Web Encryption (JWE)を使用して暗号化されるJSONオブジェクトを作成できます。

1.6.6.1 Oracle JWTについて

Oracle JWT (JSON Web Token)は、JSON Web Token規格のサポートを提供します。Oracle JWTを使用すると、コンパクトなトークン・フォーマットを使用する二者の間で転送されるクレームを表すJSONオブジェクトを構成および管理できます。

1.7 サポートされる規格について

Oracleセキュリティ開発ツールは、SAML、XMLセキュリティ変換およびWS-Securityの複数の標準をサポートします。

次の表に、サポートされている規格とプロトコルを示します。

表1-2 サポートされる規格

機能/コンポーネント

規格

SAML

- SAML 1.0

- SAML 1.1

- SAML 2.0

XMLセキュリティ変換

次の変換がサポートされています。

- Canonicalization 1.0

- Canonicalization 1.1

- Exclusive Canonicalization

- decrypt transform

- xpath filter transform

- xpath filter 2.0 transform

- enveloped signature transform

WS-Security

WS-Security 1.1の内容は、次のとおりです。

- WS-Security Core Specification 1.1

- Username Token Profile 1.1

- X.509 Token Profile 1.1

- SAML Token profile 1.1

- Kerberos Token Profile 1.1

- SOAP with Attachments (SWA) Profile 1.1

注意:

説明として、SAML Token Profile 1.0はSAML 1.0およびSAML 1.1に適用され、SAML Token Profile 1.1はSAML 2.0に適用されます。

1.8 CLASSPATH環境変数の設定

OSDTツールキットの各ツールには固有のCLASSPATH要件があります。CLASSPATH環境変数を設定する必要があります。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

特定のOSDTツールにどのjarが必要かを決定するには、そのツールについて説明する章の環境設定に関する項を参照してください。

1.8.1 WindowsでのCLASSPATHの設定

Windowsでは、Windowsのコントロール パネルを使用して、必要なすべてのjarファイルのフルパスとファイル名を含むようにCLASSPATH環境変数を設定します。

WindowsでCLASSPATHを設定する手順を次に示します。

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

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

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

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

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

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

%CLASSPATH%;%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_xmlsec.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_saml.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_saml2.jar;
%ORACLE_HOME%\modules\org.jaxen_1.1.1.jar;

6. 「OK」をクリックします。

1.8.2 UNIXでのCLASSPATHの設定

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

次に例を示します。

setenv CLASSPATH $CLASSPATH:$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cert.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_xmlsec.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_saml.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_saml2.jar:
$ORACLE_HOME/modules/org.jaxen_1.1.1.jar

2 Oracle Crypto

Java開発者は、Oracle Crypto Software Development Kit (SDK)を使用して、データのセキュリティと整合性を確保するアプリケーションを作成できます。

注意:

リリース11gR1以降では、Oracle Cryptoライブラリの使用はお薦めしません。かわりに、すべての暗号化操作に対して標準のJCEインタフェースを使用します。

ただし、ASN.1の解析については、そのタスクに対応するJDKの標準APIがないため、Oracle Cryptoライブラリを継続して使用する必要があります。

詳細は次の情報を参照してください。

- http://www.oracle.com/technetwork/java/index.htmlにあるJCEインタフェースの使用方法に関するJDKドキュメント

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

この章のトピックは、次のとおりです:

- Oracle Cryptoの機能と利点について

- Oracle Cryptoの環境設定

- Oracle Cryptoのコア・クラスとインタフェースの理解および使用方法

- Oracle CryptoおよびCrypto FIPSのJava APIリファレンス

2.1 Oracle Cryptoの機能と利点について

Oracle Cryptoでは、公開鍵暗号化アルゴリズム、デジタル署名アルゴリズム、鍵交換アルゴリズム、対称暗号化アルゴリズム、メッセージ・ダイジェスト・アルゴリズム、MACアルゴリズム、およびASN.1オブジェクトの構築と解析のためのメソッドがサポートされています。

Oracle Cryptoでは次の機能が提供されます。

- 公開鍵暗号化。RSAなど。

- デジタル署名アルゴリズム。DSA、RSAなど。

- 鍵交換アルゴリズム。Diffie-Hellmanなど。

- 対称暗号化アルゴリズム。Blowfish、AES、DES、3DES、RC2、RC4など。

- メッセージ・ダイジェスト・アルゴリズム。MD2、MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512など。

- MACアルゴリズム。HMAC-MD5、HMAC-SHA-1など。

- ASN.1オブジェクトの構築および解析のためのメソッド。

2.2 Oracle Cryptoパッケージについて

Oracle Cryptoには、基本暗号化プリミティブ、数学関数を処理するユーティリティ・クラス、様々なユーティリティ・クラス、およびBERエンコードとDERエンコードのASN.1構造体の読取り機能と書込み機能のパッケージが含まれています。

Oracle Cryptoには次のパッケージが含まれます。

- oracle.security.crypto.core - 基本暗号化プリミティブ

- oracle.security.crypto.core.math - 数学関数を処理するユーティリティ・クラス

- oracle.security.crypto.util - 様々なユーティリティ・クラス

- oracle.security.crypto.asn1 - BERエンコードおよびDERエンコードのASN.1構造体の読取りと書込みのための機能

2.3 Oracle Cryptoの環境設定

Oracle Crypto SDKを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。

osdt_core.jarファイルがCLASSPATHにあることを確認します。

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

%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar

関連項目:

CLASSPATH環境変数の設定

2.4 Oracle Cryptoのコア・クラスとインタフェースの理解および使用方法

Oracle Cryptoは複数のコア・クラスとインタフェースで構成されます。これらは、鍵クラス、鍵生成クラス、Cipherクラス、署名クラス、メッセージ・ダイジェスト・クラス、鍵合意クラスおよび擬似乱数ジェネレータ・クラスに分類されます。

この項では、Oracle Cryptoのコア・クラスとインタフェースの使用について説明し、コード例を示します。次の各項で、さらに詳しく説明します。

- Oracle Cryptoのキー・クラスについて

- Oracle Cryptoの鍵生成クラスの使用方法

- Oracle CryptoのCipherクラスの使用方法

- Oracle Cryptoの署名クラスの使用方法

- Oracle Cryptoのメッセージ・ダイジェスト・クラスの使用

- Oracle Cryptoの鍵合意クラスの使用方法

- Oracle Cryptoの疑似乱数ジェネレータ・クラスの使用方法

2.4.1 Oracle Cryptoのキー・クラスについて

Oracle Cryptoでは、鍵の処理のために複数のクラスとインタフェースが提供されます。

これらのクラスとインタフェースを次に示します。

- oracle.security.crypto.core.Keyインタフェース

- oracle.security.crypto.core.PrivateKeyインタフェース

- oracle.security.crypto.core.PublicKeyインタフェース

- oracle.security.crypto.core.SymmetricKeyクラス

2.4.1.1 oracle.security.crypto.core.Keyインタフェース

このインタフェースは鍵を表しており、暗号化または復号化、デジタル署名の生成または検証、MACの生成または検証に使用できます。鍵は、秘密鍵、公開鍵または対称鍵です。

2.4.1.2 oracle.security.crypto.core.PrivateKeyインタフェース

このインタフェースは秘密鍵を表します。これは、暗号化された秘密鍵を保持するRSAPrivateKey、DSAPrivateKey、DHPrivateKey、ECPrivateKeyまたはPrivateKeyPKCS8インスタンスです。

2.4.1.3 oracle.security.crypto.core.PublicKeyインタフェース

このインタフェースは公開鍵を表します。これは、RSAPublicKey、DSAPublicKey、DHPublicKeyまたはECPublicKeyインスタンスです。

2.4.1.4 oracle.security.crypto.core.SymmetricKeyクラス

このクラスは対称鍵を表します。これは、暗号化、復号化またはMAC操作で使用できます。

2.4.2 Oracle Cryptoの鍵生成クラスの使用

Oracle Cryptoでは、鍵を生成するためのクラスが提供されます。

これらのクラスを次に示します。

- oracle.security.crypto.core.KeyPairGeneratorクラスの使用方法

- oracle.security.crypto.core.SymmetricKeyGeneratorクラスの使用方法

2.4.2.1 oracle.security.crypto.core.KeyPairGeneratorクラスの使用方法

この抽象クラスは、RSA、DSA、Diffie-HellmanまたはECDSAなどの鍵ペアを生成するために使用されます。

新しい鍵ペア・ジェネレータを取得するには、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールし、新しいKeyPairGeneratorインスタンスを作成します。次の例に、新しいKeyPairGeneratorインスタンスを作成する方法を示します。

KeyPairGenerator kpg = KeyPairGenerator.getInstance(AlgID.rsaEncryption);

これにより、具体クラスRSAKeyPairGenerator、DSAKeyPairGenerator、DHKeyPairGeneratorまたはECKeyPairGeneratorの1つから、KeyPairGeneratorオブジェクトが作成されます。

いずれかのinitialize()メソッドを使用して、鍵ペア・ジェネレータを初期化します。generateKeyPair()メソッドを使用して、鍵ペアを生成します。次の例に、鍵ペア・ジェネレータを初期化して鍵ペアを生成する方法を示します。

kpg.initialize(1024, RandomBitsSource.getDefault());
KeyPair kp = kpg.generateKeyPair();
PrivateKey privKey = kp.getPrivate();
PublicKey pubKey = kp.getPublic();

output()メソッドを使用して鍵を保存するか、秘密鍵の場合は、暗号化してからPrivateKeyPKCS8クラスを使用して保存します。次の例に、鍵ペアを保存する方法を示します。

FileOutputStream pubKeyFos = new
FileOutputStream("my-pub-key.der");
pubKey.output(pubKeyFos);
pubKeyFos.close();

PrivateKeyPKCS8 privKeyPKCS8 =
new PrivateKeyPKCS8(privKey, "myPassword");
FileOutputStream privKeyFos =
new FileOutputStream("my-encrypted-priv-key.der");
privKeyPKCS8.output(privKeyFos);
privKeyFos.close();

2.4.2.2 oracle.security.crypto.core.SymmetricKeyGeneratorクラスの使用方法

このクラスでは、Blowfish、DES、3DES、RC4、RC2、AES、HMAC鍵などの対称鍵ペアが生成されます。

新しい対称鍵ジェネレータを取得するには、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールし、新しいSymmetricKeyGeneratorインスタンスを作成します。次の例に、新しいSymmetricKeyGeneratorインスタンスを作成する方法を示します。

SymmetricKeyGenerator skg = SymmetricKeyGenerator.getInstance(AlgID.desCBC);

generateKey()メソッドを使用して鍵ペアを生成します。次に、getEncoded()メソッドを使用して鍵を保存します。次の例に、対称鍵ペアを生成して保存する方法を示します。

SymmetricKey sk = skg.generateKey();

FileOutputStream symKeyFos =
new FileOutputStream("my-sym-key.der");
symKeyFos.write(sk.getEncoded());
symKeyFos.close();

2.4.3 Oracle CryptoのCipherクラスの使用方法

Oracle Cryptoでは、対象暗号のクラス、RSA暗号のクラス、およびパスワード・ベース暗号化のメソッドが提供されます。

Oracle Cryptoの暗号のコア・クラスとインタフェースは、次のように分類されます。

- 対称暗号の使用方法

- RSA暗号の使用方法

- パスワード・ベース暗号化(PBE)の使用方法

2.4.3.1 対称暗号の使用方法

対称暗号は、ブロック暗号(Blowfish、DES、3DES、RC2、AESなど)とストリーム暗号(RC4など)の2つに分類されます。

対称暗号は、次の4つの操作で使用できます。

- RAWデータの暗号化。暗号化するデータを渡して、いずれかのencrypt()メソッドを使用します。

- 暗号化されたデータの復号化。暗号化されたデータを復号化するために渡して、いずれかのdecrypt()メソッドを使用します。

- 秘密鍵または対称鍵のラップ。暗号化する秘密鍵または対称鍵を渡して、いずれかのwrapKey()メソッドを使用します。

- 暗号化された秘密鍵または対称鍵のラップ解除。暗号化された秘密鍵または対称鍵を復号化するために渡して、unwrapPrivateKey()またはunwrapSymmetricKey()メソッドを使用します。

ブロック暗号の具体クラスは、oracle.security.crypto.core.BlockCipher抽象クラスを拡張したもので、これはoracle.security.crypto.core.Cipherクラスを拡張したものです。ストリーム暗号クラスは、oracle.security.crypto.core.Cipherクラスを直接拡張したものです。

新しいCipherインスタンスを作成するには、AlgorithmIdentifierオブジェクトとKeyオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

次の例に、新しいCipherインスタンスを作成する方法を示します。まず、RC4オブジェクトが作成され、指定した鍵で初期化されます。次に、ブロック暗号DESオブジェクトが作成され、指定した鍵と空白の埋込みで初期化されます。これで、暗号が作成され、渡したパラメータで初期化されます。既存の暗号を再度初期化するには、いずれかのinitialize()メソッドをコールします。

Cipher rc4 = Cipher.getInstance(AlgID.rc4, rc4SymKey);

Cipher desCipher = Cipher.getInstance(AlgID.desCBC, desSymKey, Padding.PKCS5);

CBC暗号を使用する場合、AlgorithmIdentifierオブジェクトは、RC2暗号の初期化ベクトル(IV)や有効な鍵の長さなどの、暗号化パラメータを保持することができます。ブロック暗号を作成または初期化する際に暗号化パラメータを指定するには、これらのパラメータを使用してCBCAlgorithmIdentifierオブジェクトまたはRC2AlgorithmIdentifierオブジェクトを構築します。次の例に、CBC暗号とRC2暗号を作成して初期化する方法を示します。

CBCAlgorithmIdentifier cbcAlgID =
new CBCAlgorithmIdentifier(AlgID.desCBC, iv);
desCipher.initialize(cbcAlgID, desSymKey, Padding.PKCS5);
RC2AlgorithmIdentifier rc2AlgID =
new RC2AlgorithmIdentifier(iv, 56);
BlockCipher rc2Cipher =
(BlockCipher)Cipher.getInstance(rc2AlgID, rc2SymKey, Padding.PKCS5);

2.4.3.2 RSA暗号の使用方法

RSA暗号は、RSAES-OAEPおよびRSAES-PKCS1-v1_5の暗号化スキームをサポートするPKCS#1 v2.0の実装です。仕様に従い、新しいアプリケーションにはRSAES-OAEPを推奨しており、RSAES-PKCS1-v1_5は、既存のアプリケーションおよびプロトコルとの互換性を保つためにのみ含まれています。

これらの暗号化スキームは、RSAの暗号化プリミティブと復号化プリミティブをencodingメソッドに組み合せるために使用されます。暗号化と復号化は、encrypt(byte[])およびdecrypt(byte[])メソッドのみで実行できます。

RSA暗号は、次の4つの操作で使用できます。

- RAWデータの暗号化。暗号化するデータを渡して、いずれかのencrypt()メソッドを使用します。

- 暗号化されたデータの復号化。暗号化されたデータを復号化するために渡して、いずれかのdecrypt()メソッドを使用します。

- 鍵のラップ。暗号化する鍵を渡して、wrapKey()メソッドを使用します。

- 暗号化した鍵のラップ解除。暗号化された鍵を復号化するために渡して、unwrapSymmetricKey()メソッドを使用します。

新しいCipherインスタンスを作成するには、AlgorithmIdentifierオブジェクトとKeyオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。次の例に、RSApkcs1オブジェクトを作成し、指定した鍵で初期化する方法を示します。この暗号はデータの暗号化または復号化に使用できます。

Cipher rsaEnc = Cipher.getInstance(AlgID.rsaEncryption, pubKey);
byte[] encryptedData = rsaEnc.encrypt(data);
Cipher rsaDec = Cipher.getInstance(AlgID..rsaEncryption, privKey);
byte[] decryptedData = rsaDec.decrypt(encryptedData);

RSA暗号を使用する場合、AlgorithmIdentifierオブジェクトは、RSAES-OAEPのマスク生成関数などの暗号化パラメータを保持できます。RSA暗号を作成または初期化する際にこれらのパラメータを指定するには、OAEPAlgorithmIdentifierを構築するか、oracle.security.crypto.core.AlgIDインタフェースにあるデフォルトのオブジェクトを使用します。

2.4.3.3 パスワード・ベース暗号化(PBE)の使用方法

oracle.security.crypto.core.PBE抽象クラスでは、パスワード・ベース暗号化(PBE)操作のためのメソッドが提供されます。PBEを拡張した具体クラスは、PKCS5PBEクラスとPKCS12PBEクラスです。

PBEオブジェクトは、次の4つの操作で使用できます。

- RAWデータの暗号化。次に例を示します。

byte[] encData = pbeEnc.encrypt("myPassword", data);

- 暗号化されたデータの復号化。次に例を示します。

byte[] decData = pbeDec.decrypt("myPassword", encData);

- 秘密鍵または対称鍵のラップ。次に例を示します。

byte[] encPrivKey = pbeEnc.encryptPrivateKey("myPassword", privKey);
byte[] encSymKey = pbeEnc.encryptSymmetricKey("myPassword", symKey);

- 暗号化された秘密鍵または対称鍵のラップ解除。次に例を示します。

PrivateKey decPrivKey = pbeDec.decryptPrivateKey("myPassword", encPrivKey);
SymmetricKey decSymKey = pbeDec.decryptSymmetricKey("myPassword", encSymKey);

新しいPBEインスタンスを作成するには、PBEAlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。次に例を示します。

PBE pbeEnc = PBE.getInstance(pbeAlgID);

これにより、PKCS5PBEオブジェクトが作成され、指定したPBEアルゴリズムで初期化されます。PBEは、データの暗号化や復号化、または鍵のラップやラップ解除に使用できます。

PBEオブジェクトを使用する場合、AlgorithmIdentifierオブジェクトは、ソルトまたは反復カウントなどの暗号化パラメータと、使用するPBEアルゴリズムを指定するASN.1オブジェクト識別子を保持できます。PBEを作成または初期化する際にこれらのパラメータを指定するには、暗号化パラメータを使用してPBEAlgorithmIdentifierオブジェクトを構築します。

PBEオブジェクトを作成する例を示します。

PBEAlgorithmIdentifier pbeAlgID =
new PBEAlgorithmIdentifier(PBEAlgorithmIdentifier.pbeWithMD5AndDES_CBC, salt, 1024);
pbeEnc.initialize(pbeAlgID);
PBE pbeDec = PBE.getInstance(pbeAlgID);

2.4.4 Oracle Cryptoの署名クラスの使用方法

oracle.security.crypto.core.Signature抽象クラスでは、署名や署名の検証を行うメソッドが提供されます。Signatureクラスを拡張した具体クラスは、RSAMDSignature、DSAおよびECDSAクラスです。

署名の操作に使用できるアルゴリズムを次に示します。

- RSAの場合: AlgID.md2WithRSAEncryption、AlgID.md5WithRSAEncryptionおよびAlgID.sha_1WithRSAEncryption

- DSAの場合: AlgID.dsaWithSHA1

- ECDSAの場合: AlgID.ecdsaWithSHA1

新しいSignatureインスタンスを作成するには、AlgorithmIdentifierオブジェクトと、PrivateKeyオブジェクトまたはPublicKeyオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。次の例に、新しいSignatureオブジェクトを作成し、指定したアルゴリズムで初期化する方法を示します。

Signature rsaSign = Signature.getInstance(AlgID.md5WithRSAEncryption);
Signature rsaVerif = Signature.getInstance(AlgID.md5WithRSAEncryption);

次の例に、Signatureオブジェクトの鍵、および署名または検証する文書を設定する方法を示します。

rsaSign.setPrivateKey(privKey);
rsaSign.setDocument(data);
rsaVerif.setPublicKey(pubKey);
rsaVerif.setDocument(data);

次の例に、秘密鍵を使用して署名を計算し、公開鍵と署名バイトを使用して署名を検証する方法を示します。

byte[] sigBytes = rsaSign.sign();
boolean verified = rsaVerif.verify(sigBytes);

2.4.5 Oracle Cryptoのメッセージ・ダイジェスト・クラスの使用

Oracle Cryptoには、データのハッシング、ダイジェストおよび計算を行うためのメッセージ・ダイジェスト・クラスが含まれています。

Oracle Cryptoでは、次のメッセージ・ダイジェスト・クラスが提供されます。

- oracle.security.crypto.core.MessageDigestクラスの使用方法

- oracle.security.crypto.core.MACクラスの使用方法

2.4.5.1 oracle.security.crypto.core.MessageDigestクラスの使用方法

MessageDigest抽象クラスでは、データのハッシュとダイジェストのメソッドが提供されます。MessageDigestクラスを拡張した具体クラスは、MD2、MD4、MD5およびSHAクラスです。

メッセージ・ダイジェスト操作に使用できるアルゴリズムは、AlgID.md2、AlgID.md4、AlgID.md5、AlgID.sha_1、AlgID.sha_256、AlgID.sha_384、AlgID.sha_512です。

メッセージ・ダイジェストを作成する基本的なプロセスを次に示します。

1. 新しいMessageDigestインスタンスを作成するために、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

2. ダイジェストするデータを追加します。

3. ハッシュ値を計算します。

次の例に、MD5メッセージ・ダイジェスト・オブジェクトを作成する方法を示します。

//Create a new MD5 MessageDigest object
MessageDigest md5 = Signature.getInstance(AlgID.md5);

//Add the data to be digested
md5.udpate(data1);
md5.udpate(data2);

//Compute the hash value
md5.computeCurrent();
byte[] digestBits = md5.getDigestBits();

2.4.5.2 oracle.security.crypto.core.MACクラスの使用方法

MAC抽象クラスでは、メッセージ認証コード(MAC)の計算と検証のためのメソッドが提供されます。MACを拡張した具体クラスはHMACクラスです。

MACの操作に使用できるアルゴリズムは、AlgID.hmacMD5およびAlgID.hmacSHAです。

MACを作成する基本的なプロセスを次に示します。

1. 新しいMACインスタンスを作成するために、AlgorithmIdentifierオブジェクトおよびSymmetricKeyオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

2. ダイジェストするデータを追加します。

3. MAC値を計算して検証します。

次の例に、HMAC-SHA1アルゴリズムを使用して、新しいHMACオブジェクトを作成する方法を示します。

//Create an HMAC object with the HMAC-SHA1 algorithm
MAC hmacSha1Compute = MAC.getInstance(AlgID.hmacSHA, hmacSha1Key);

//Add the data to be digested
hmacSha1Compute.udpate(data);

//Compute the MAC value and verify
byte[] macValue = hmacSha1Compute.computeMAC();
boolean verified = hmacSha1Verify.verifyMAC(data, macValue);

2.4.6 Oracle Cryptoの鍵合意クラスの使用方法

oracle.security.crypto.core.KeyAgreement抽象クラスでは、公開鍵合意スキーム(Diffie-Hellmanなど)のためのメソッドが提供されます。KeyAgreementクラスを拡張した具体クラスは、DHKeyAgreementおよびECDHKeyAgreementクラスです。

鍵合意の操作に使用できるアルゴリズムは、AlgID.dhKeyAgreementおよびECDHKeyAgreement(楕円曲線Diffie-Hellman鍵合意)です。

鍵合意の基本的なプロセスを次に示します。

1. 新しいKeyAgreementインスタンスを作成するために、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

2. ローカルの秘密鍵と相手の公開鍵を設定します。

3. 共有秘密値を計算します。

次の例に、鍵合意を実行する方法を示します。

//Create a DH key agreement object
KeyAgreement dh = KeyAgreement.getInstance(AlgID.dhKeyAgreement);

//Set the private key and public key
dh.setPrivateKey(privKey);
dh.setPublicKey(otherPubKey);

//Compute the shared secret
byte[] sharedSecret = dh.generateSecret();

2.4.7 Oracle Cryptoの疑似乱数ジェネレータ・クラスの使用方法

暗号化では、乱数は鍵を生成するために使用されます。暗号化システムでは、攻撃側から推測できないように、暗号の強度が高い(疑似)乱数が必要です。Oracle Cryptoでは、擬似乱数ジェネレータ(PRNG)クラスが提供されます。

これらの擬似乱数ジェネレータ(PRNG)クラスを次に示します。

- oracle.security.crypto.core.RandomBitsSourceクラスの使用方法

- oracle.security.crypto.core.EntropySourceクラスの使用方法

2.4.7.1 oracle.security.crypto.core.RandomBitsSourceクラスの使用方法

RandomBitsSourceは、安全なPRNG実装を表す抽象クラスです。PRNGの性質に基づき、出力のセキュリティは、使用されるシード・エントロピの量と質によることに注意してください。適切な初期化と使用方法については、クラスを実装した際にガイダンスが示されます。RandomBitsSourceを拡張した具体クラスは、MD5RandomBitsSource、SHA1RandomBitsSourceおよびDSARandomBitsSourceクラスです。

新しいRandomBitsSourceインスタンスを作成するために、次のように、デフォルトのPRNGを返す、静的なgetDefault()メソッドをコールします。

RandomBitsSource rbs = RandomBitsSource.getDefault();

RandomBitsSourceオブジェクトは、次のようにサブクラスの1つをインスタンス化して作成することもできます。

RandomBitsSource rbs = new SHA1RandomBitsSource();

デフォルトでは、新たにサブクラスから作成されるPRNGが組み込まれます。汎用のRandomBitsSourceオブジェクトを組み込むには、バイト配列またはEntropySourceオブジェクトを使用して、いずれかのseedメソッドを使用します。

rbs.seed(myByteArray);

これで、オブジェクトが乱数を生成する準備ができました。

rbs.randomBytes(myRandomByteArray);

2.4.7.2 oracle.security.crypto.core.EntropySourceクラスの使用方法

EntropySourceクラスでは、PRNGのシード・マテリアルのソースが提供されます。EntropySourceを拡張した具体クラスは、SpinnerEntropySourceおよびSREntropySourceクラスです。

新しいEntropySourceインスタンスを作成するために、次のように、デフォルトのエントロピ・ソースを返す静的なgetDefault()メソッドをコールします。

EntropySource es = EntropySource.getDefault();

EntropySourceオブジェクトは、次のようにサブクラスの1つをインスタンス化して作成することもできます。

EntropySource rbs = new SpinnerEntropySource();

次のようにgenerateByteメソッドの1つを使用することで、エントロピ・ソースを使用する準備ができます。

es.generateBytes(mySeedingArray);

2.5 Oracle CryptoおよびCrypto FIPSのJava APIリファレンス

Oracle CryptoおよびOracle Crypto FIPSのクラスとメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

3 Oracle Security Engine

Oracle Security Engine Software Development Kit (SDK)は、Oracle Cryptoのスーパーセットです。Oracle Cryptoで提供されるすべてのライブラリとツールの他に、デジタル証明書を生成するためのパッケージとユーティリティが含まれます。

注意:

リリース11gR1以降では、Oracle Security Engineライブラリの使用はお薦めしません。かわりに、JDKの証明書APIを使用します。

詳細は、次のサイトにあるJDKドキュメントを参照してください。

http://www.oracle.com/technetwork/java/index.html

ただし、次のPublic-Key Cryptography Standards (PKCS)には、JCEと同等の機能は含まれません。

- PKCS#7

- PKCS#10

- Signed Public Key And Challenge

これらの機能では、Oracle Security Engineを引き続き使用できます。

Java開発者は、Oracle Cryptoを使用して、データのセキュリティと整合性を確保するアプリケーションを開発することができます。Oracle Cryptoの機能の詳細は、「Oracle Crypto」を参照してください。

公開鍵インフラストラクチャの概要は、「公開鍵インフラストラクチャ(PKI)について」を参照してください。

この章のトピックは、次のとおりです:

- Oracle Security Engineの機能と利点

- Oracle Security Engineの環境設定

- Oracle Security Engineのコア・クラスとインタフェース

- Oracle Security EngineのJava APIリファレンス

3.1 Oracle Security Engineの機能と利点

Oracle Security Engineは、X.509、PKCS#10およびPKCS#12証明書をRDNおよびCRLとともにサポートします。デジタル証明書、CRLおよびPKCS#12の処理をサポートするパッケージが含まれています。これらのパッケージは、標準のX.509証明書とCRL拡張も処理します。

Oracle Security Engineでは、次の機能が提供されます。

- RFC 3280に定義されているX.509バージョン3証明書。

- PKCS#12の全面的なサポート

- 証明書リクエストのためのPKCS#10のサポート。

- RFC 3280で定義されている証明書失効リスト(CRL)機能。

- Signed Public Key And Challenge (SPKAC)の実装。

- X.500相対識別名のサポート。

- X.509証明書とCRLをラップするためのPKCS#7のサポート。

- 標準X.509証明書とCRL拡張の実装。

Oracle Security Engineのツールキットには、次のパッケージが含まれます。

- oracle.security.crypto.cert - デジタル証明書、CRL、およびPKCS#12を扱う機能

- oracle.security.crypto.cert.ext - 標準X.509証明書およびCRL拡張

3.2 Oracle Security Engineの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。Oracle Security Engineを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

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

%CLASSPATH%;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;

関連項目:

CLASSPATH環境変数の設定

3.3 Oracle Security Engineのコア・クラスとインタフェース

Oracle Security Engineには、Oracle Cryptoで提供されるすべてのクラスが含まれます。また、証明書機能の複数のコア・クラスも含まれています。

リリース11gR1でのクラスの変更

リリース11gR1では、証明書管理のためのoracle.security.crypto.cert.X509クラスがjava.security.cert.X509Certificateで置き換えられました

証明書のコア・クラス

証明書機能のコア・クラスを次に示します。

- oracle.security.crypto.cert.X500RDNクラスの使用方法

- oracle.security.crypto.cert.X500Nameクラスの使用方法

- oracle.security.crypto.cert.CertificateRequestクラスの使用方法

- java.security.cert.X509Certificateクラスの使用方法

3.3.1 oracle.security.crypto.cert.X500RDNクラスの使用方法

oracle.security.crypto.cert.X500RDNクラスは、X.500相対識別名(RDN)を表します。これは、X.500の名前のビルディング・ブロックです。RDNは、一連の属性と値のペアで構成されます。通常、各RDNには1つの属性と値のペアが含まれます。

// Create the X500RDN object
X500RDN rdn = new X500RDN(PKIX.id_at_commonName, "Joe Smith");

// Retrieve the value
X500Name n = Instance of oracle.security.crypto.cert.X500Name;
String name = n.getAttribute(PKIX.id_at_commonName).getValue().getValue();

3.3.2 oracle.security.crypto.cert.X500Nameクラスの使用方法

oracle.security.crypto.cert.X500Nameクラスは、X.500シリーズの仕様で使用され、X.520で定義されている識別名を表します。X500Nameオブジェクトは、X500RDNオブジェクトで構成されます。X500Nameは、共通名、国、組織などエンティティを定義する属性を保持します。

X500Nameオブジェクトを作成するには、標準のコンストラクタを使用してから、オブジェクトに属性を移入します。オブジェクトが作成されると、他のプロセスで使用できるようにDERエンコードを行うことができます。

X500Name name = new X500Name();
name.addComponent(PKIX.id_at_commonName, "Joe Smith");
name.addComponent(PKIX.id_at_countryName, "USA");
name.addComponent(PKIX.id_at_stateOrProvinceName, "NY");
name.addComponent(PKIX.id_at_localityName, "New York");
name.addComponent(PKIX.id_at_organizationName, "Oracle");
name.addComponent(PKIX.id_at_organizationalUnitName, "Engineering");
name.addComponent(PKIX.emailAddress, "joe.smith@example.com");

// Make object DER-encoded so its available to other processes

byte[] encodedName = Utils.toBytes(name);
X500Name n = new X500Name(new ByteArrayInputStream(encodedName));
String name = n.getAttribute(PKIX.id_at_commonName).getValue().getValue();
String email = n.getAttribute(PKIX.emailAddress).getValue().getValue();

3.3.3 oracle.security.crypto.cert.CertificateRequestクラスの使用方法

oracle.security.crypto.cert.CertificateRequestクラスは、エンティティの情報とリクエストの内容の署名が含まれるPKCS#10証明書リクエストを表します。証明書リクエストは、認証局(CA)が使用する情報および認証データ(署名)を渡して、対応するエンティティの証明書を生成するために使用されます。

新しい証明書リクエストを作成する手順の概要は次のとおりです。

1. 引数なしのコンストラクタを使用し、鍵とサブジェクト名を設定するか、X500NameとKeyPairオブジェクトをとるコンストラクタを使用して、CertificateRequestの新しいインスタンスを作成します。

2. X.509拡張領域を証明書リクエストに追加します。

3. 証明書リクエストに署名し、ファイルに保存します。

4. 作成した証明書リクエストを認証局に送信します。

//Create CertificateRequest by setting the keys and subject name
CertificateRequest certReq = new CertificateRequest();
certReq.setPrivateKey(privKey);
certReq.setPublicKey(pubKey);
certReq.setSubject(subjectName);

//OR

// Create CertificateRequest by taking an X500Name and KeyPair object
CertificateRequest certReq = new CertificateRequest(subjectName, keyPair);

// Add X.509 certificate extensions in a extensionRequest attribute
X509ExtensionSet extSet = new X509ExtensionSet();

// Basic Constraints: non-CA, critical
extSet.addExtension(new BasicConstraintsExtension(false, true));

// Key Usage: signature, data encipherment, key agreement
// & non-repudiation flags, critical
extSet.addExtension(new KeyUsageExtension(new int[] {
KeyUsageExtension.DIGITAL_SIGNATURE,
KeyUsageExtension.DATA_ENCIPHERMENT,
KeyUsageExtension.KEY_AGREEMENT,
KeyUsageExtension.NON_REPUDIATION},
true));

// Subject Alternative Name: email address, non-critical
if (email.length() > 0)
extSet.addExtension(new SubjectAltNameExtension(
new GeneralName(GeneralName.Type.RFC822_NAME, email), false));

// Subject Key Identifier: key ID bytes, non-critical
extSet.addExtension(new SubjectKeyIDExtension
(CryptoUtils.generateKeyID(kp.getPublic())));
req.addAttribute(PKIX.extensionRequest, extSet);

// Sign the certificate request and save to file
req.sign();
req.output(reqOS);
reqOS.close();
}
// The certificate request can then be sent to a CA

3.3.4 java.security.cert.X509Certificateクラスの使用方法

java.security.cert.X509Certificateクラスでは、新しい証明書の生成と既存の証明書の解析がサポートされます。

注意:

Oracle WebLogic Server 11gでは、X.509証明書管理のためのoracle.security.crypto.cert.X509がこのクラスで置き換えられています。

java.security.cert.X509Certificateクラスの完全なドキュメントは、http://www.oracle.com/technetwork/java/index.htmlで入手できます。

java.security.cert.X509Certificateを使用するためのコードの変換

X509Certificateオブジェクは、証明書ファクトリjava.security.cert.CertificateFactoryを使用して作成できます。

証明書は、次の入力ストリームから生成できます。

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

- ByteArrayInputStream(エンコードされたバイトが既存のX509オブジェクトから生成される場合)

- その他のソース。

次に例を示します。

// Generating an X.509 certificate from a file-based certificate

CertificateFactory cf = CertificateFactory.getInstance("X.509");

X509Certificate cert = (X509Certificate)cf.generateCertificate(
new FileInputStream(certFileName);

**

3.4 Oracle Security EngineのJava APIリファレンス

Oracle Security Engineのクラスとメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

4 Oracle CMS

Oracle CMS SDKは、CMSオブジェクトの読取りと書込みのためのツール、サンプル・プログラム、および安全なメッセージ・エンベロープを開発するためのサポート・ツールなど、豊富なツールを含むPure Java APIです。

この章には次のトピックが含まれます:

- Oracle CMSの機能と利点

- Oracle CMSの環境設定

- Oracle CMSによるアプリケーションの理解および開発

- Oracle CMSのJava APIリファレンス

4.1 Oracle CMSの機能と利点

Oracle CMS SDKは、CMSオブジェクトの読取りと書込みのためのツール、サンプル・プログラム、および安全なメッセージ・エンベロープを開発するためのサポート・ツールなど、豊富なツールを含むPure Java APIです。RFC 2630に指定されているIETF暗号メッセージ構文が実装されます。この構文は、メッセージのデジタル署名、ダイジェスト、認証および暗号化に使用されます。

暗号メッセージ構文は、RFC 2315[PKCS#7]に指定されているように、PKCS #7バージョン1.5から導出されています。

関連項目:

この仕様へのリンクは、「リファレンス」を参照してください。

4.1.1 Oracle CMSのコンテンツ・タイプ

Oracle CMSでは、署名付きデータ、エンベロープ・データ、暗号化データなど、様々なコンテンツ・タイプがサポートされます。RFC 2630に指定されているすべてのコンテンツ・タイプがサポートされます。RFC 2634に指定されているS/MIMEコンテンツ・タイプに対する拡張セキュリティ・サービスがサポートされます。RFC 3161に対応するIETF PKIXタイムスタンプ・プロトコルのコンテンツ・タイプもサポートされます。

表4-1 Oracle CMSでサポートされるコンテンツ・タイプ

タイプ

識別子

データ

1.2.840.113549.1.7.1

signed-data

1.2.840.113549.1.7.2

enveloped-data

1.2.840.113549.1.7.3

digested-data

1.2.840.113549.1.7.5

encrypted-data

1.2.840.113549.1.7.6

authenticated-data

1.2.840.113549.1.9.16.1.2

Oracle CMSはRFC 2630を完全実装していますが、次の例外があります。

- 属性証明書はサポートされません。

- 鍵合意のRecipientInfoはサポートされません。

Oracle CMSでは、RFC 2634に指定されているS/MIMEコンテンツ・タイプに対する拡張セキュリティ・サービスがサポートされます。

タイプ

識別子

receipt

1.2.840.113549.1.9.16.1.2

次の、RFC 3161に対応するIETF PKIXタイムスタンプ・プロトコルのコンテンツ・タイプもサポートされます。

タイプ

識別子

TSTInfo

1.2.840.113549.1.9.16.1.4

注意:

Oracle CMS では、これまでに説明したコンテンツ・タイプ以外は処理されません。

RFC 3161へのリンクは、「リファレンス」を参照してください。

4.1.2 Oracle CMS実装とRFCの違い

Oracle CMSは、いくつかの点でPKCS #7 v 1.5 [RFC 2315]およびIETF CMS [RFC 2630]と異なります。PKCS#7実装との相互運用性が必要な場合は、これらの相違点について知っておく必要があります。

次のような相違点があります。

- enveloped-dataにオプションのOriginatorInfoが含まれます。

- RFC 2630では、エンベロープ・データに、保護されていないオプションの属性も含まれます。

- signed-dataであるSignerInfoのSignerIdentifierとして、IssuerAndSerialNoまたはSubjectKeyIdentifierを選択できます。

- RFC 2630では、署名付きデータにencapsulatedcontentinfoが含まれます。encapsulatedcontentinfoにはオプションのコンテンツが含まれますが、RFC 2315にはコンテンツ・データが含まれます。

注意:

PKCS#7実装との相互運用性が必要な場合は、これらの違いに注意してください。

4.2 Oracle CMSの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。Oracle CMSを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

次の項目をCLASSPATHに指定します。

- osdt_core.jarファイル

- osdt_cert.jarファイル

- osdt_cms.jarファイル

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

%CLASSPATH%;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cms.jar;

4.3 Oracle CMSによるアプリケーションの理解および開発

Oracle CMSのAPIを使用すると、ネスト(ラップ)されたCMSオブジェクトを構築できます。ラップ数の制限はありません。Oracle CMSクラスを使用して、様々な方法でCMSオブジェクトを開発できます。

この項では、Oracle CMSのクラスについて紹介し、それにより使用可能になるCMSオブジェクトの開発に対する様々なアプローチと、オブジェクトの使用方法について説明します。

この項の内容は次のとおりです。

- Oracle CMSクラスについて

- CMSのオブジェクト・タイプについて

- CMS***ContentInfoクラスを使用したCMSオブジェクトの構成

- CMS***StreamおよびCMS***Connectorクラスを使用したCMSオブジェクト

4.3.1 Oracle CMSクラスについて

Oracle CMSクラスは、CMSオブジェクトの読取りと書込みの機能を備えています。

oracle.security.crypto.cmsパッケージでCMSオブジェクトの読取りと書込みを行うには、次の2つの方法があります。

- CMSContentInfoクラスの使用。比較的簡単に使用できます。

- 次のいずれかのクラスの使用:

- CMSInputStream

- CMSOutputStream

- CMSInputConnector

- CMSOutputConnector

これらのクラスでは、CMSオブジェクトのシングル・パスでの読取りおよび書込み機能が提供され、出力を書き込む前に入力データを累積する必要がありません。

4.3.2 CMSのオブジェクト・タイプについて

CMSオブジェクトのタイプとして、デタッチされたオブジェクトとデジェネレート・オブジェクトがあります。デタッチされたオブジェクトは、dataおよびreceiptコンテンツ・タイプに適用されます。デジェネレート・オブジェクトは、証明書専用のsigned-dataオブジェクトであり、signed-dataコンテンツ・タイプのみに定義されます。

デタッチされたオブジェクトは、dataおよびreceiptコンテンツ・タイプに適用されます。これらのタイプでは、デタッチされたオブジェクトは保護されるコンテンツがないオブジェクトです。

デジェネレート・オブジェクトは、signed-dataオブジェクトに署名者がいない場合に該当します。通常は証明書の格納に使用され、ファイル拡張子p7bおよびp7cが関連付けられます。

外部署名はsigned-dataコンテンツ・タイプのみに定義されます。これは、基本的にはデタッチされたsigned-dataオブジェクトです。つまり、signed-dataオブジェクトには1名以上の署名者がありますが、署名付きコンテンツがsigned-dataオブジェクトに存在しません。

4.3.3 CMS***ContentInfoクラスを使用したCMSオブジェクトの構成

CMS***ContentInfoクラスを使用して、適切なコンテンツ・タイプのオブジェクトの読取りと書込み、デタッチされたオブジェクトの構成と処理、およびネストしたオブジェクトの作成を行うことができます。

表4-2に、CMS***ContentInfoクラスを構成するクラスを示します。

表4-2 CMS***ContentInfoクラス

クラス

コンテンツ・タイプ

CMSDataContentInfo

CMS.id_data

ESSReceipt

CMS.id_ct_receipt (RFC 2634のreceipt)

CMSDigestedDataContentInfo

CMS.id_digestedData

CMSSignedDataContentInfo

CMS.id_signedData

CMSEncryptedDataContentInfo

CMS.id_encryptedData

CMSEnvelopedDataContentInfo

CMS.id_envelopedData

CMSAuthenticateDataContentInfo

CMS.id_ct_authData

CMS***ContentInfoクラスについては、次の各項で詳しく説明します。

- 抽象ベース・クラスCMSContentInfoの使用方法

- CMSDataContentInfoクラスの使用方法

- ESSReceiptクラスの使用方法

- CMSDigestedDataContentInfoクラス

- CMSSignedDataContentInfoクラス

- CMSEncryptedDataContentInfoクラスの使用方法

- CMSEnvelopedDataContentInfoクラスの理解および使用方法

4.3.3.1 抽象ベース・クラスCMSContentInfoの使用方法

CMSContentInfoは、基本的なCMSオブジェクトを表す抽象クラスです。表4-2に、CMSContentInfoのサブクラスを示しています。

この抽象クラスの有用なメソッドの一部を、表4-3に示します。

表4-3 CMSContentInfoの有用なメソッド

メソッド

説明

contentTypeName (oracle.security.crypto.asn1.ASN1ObjectID contentType)

オブジェクトのコンテンツ・タイプを文字列として返します。

getContentType()

オブジェクトのコンテンツ・タイプをオブジェクト識別子(OID)として返します。

input(java.io.InputStream is)

指定した入力ストリームからBERエンコーディングを読み取ることで、このオブジェクトを初期化します。

inputInstance(java.io.InputStream is)

指定した入力ストリームからBERエンコーディングを読み取ることで、新しいCMSContentInfoオブジェクトを作成します。

isDegenerate()

オブジェクトがデジェネレートかどうかを示します。

isDetached()

オブジェクトがデタッチされているかどうかを示します。

output(java.io.OutputStream os)

オブジェクトのエンコーディングを所定の出力ストリームに書き込みます。

4.3.3.1.1 CMSオブジェクトの構成

コンテンツ・タイプを指定してCMSContentInfoオブジェクトを作成できます。

CMSオブジェクトを構成する手順を次に示します。

1. 指定されたコンテンツ・タイプのオブジェクトを作成します。

2. オブジェクトを初期化します。

3. output(..)メソッドをコールして、オブジェクト・エンコーディングを書き込みます。

新しいオブジェクトを作成するには、作業している具体サブクラスのいずれかのコンストラクタを使用します。

4.3.3.1.2 CMSオブジェクトの読取り

既存のCMSContentInfoを読み取る際、事前に具体タイプがわからない場合には、inputInstance()を使用します。具体タイプのいずれかがわかっていて読み取るには、引数なしのコンストラクタを使用し、input()メソッドを呼び出します。

オブジェクトを読み取る手順を次に示します。

1. CMSContentInfo.inputInstance(..)をコールしてオブジェクトを読み取ります。

2. getContentType()をコールしてコンテンツ・タイプを判別します。

3. これでコンテンツ・タイプに対応する操作を呼び出すことができます。

4.3.3.2 CMSDataContentInfoクラスの使用方法

クラスCMSDataContentInfoは、定数CMS.id_dataで定義されるid-dataタイプのオブジェクトを表し、任意の8ビット文字列を指します(文字列の解釈はアプリケーションに任されます)。

このクラスの有用なメソッドを次に示します。

byte[] getData()

これは、dataオブジェクトに格納されているデータを返します。

CMS dataオブジェクトを作成する手順を次に示します。

1. 情報を含むバイト配列documentBytesをとるコンストラクタを使用して、次のようにCMSDataContentInfoのインスタンスを作成します。

CMSDataContentInfo exdata =
new CMSDataContentInfo(byte[] documentBytes)

2. dataオブジェクトをファイル(たとえばdata.p7m)に書き込みます。

exdata.output(new FileOutputStream("data.p7m"));

CMS dataオブジェクトの読取り手順は、オブジェクトのコンテンツ・タイプがわかっているかどうかによって異なります。

1. FileInputStreamを使用してファイルとの接続を開きます。

ファイルdata.p7mに格納されているオブジェクトのコンテンツ・タイプがid-dataであるとわかっている場合は、次のようにします。

CMSDataContentInfo exdata =
new CMSDataContentInfo(new FileInputStream("data.p7m"));

ただし、事前にコンテンツ・タイプがわからない場合は、読取りの前にタイプを調べます。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof CMSDataContentInfo)
{
CMSDataContentInfo exdata =  (CMSDataContentInfo) cmsdata;
// .....
}

2. 次のようにCMS dataオブジェクトに格納されている情報にアクセスします。

byte[] docBytes = exdata.getData();

4.3.3.3 ESSReceiptクラスの使用方法

クラスESSReceiptは、定数CMS.id_ct_receiptで定義されるid-ct-receiptタイプのオブジェクトを表し、RFC 2634のreceiptを指します。

表4-4に、このクラスの有用なメソッドの一部を示します。

表4-4 ESSReceiptの有用なメソッド

メソッド

説明

byte[] getOriginatorSignatureValue()

このreceiptの生成の原因となったメッセージの署名値を返します。

ASN1ObjectID getReceiptContentType()

このreceiptの生成の原因となったメッセージのコンテンツ・タイプを返します。

byte[] getReceiptData()

エンコードされたreceiptを返します。

byte[] getSignedContentIdentifier()

このreceiptの生成の原因となったメッセージの署名付きコンテンツ識別子を返します。

void inputContent(InputStream is)

指定した入力ストリームからBERエンコーディングを読み取ることで、このオブジェクトを初期化します。

4.3.3.3.1 ESSReceiptオブジェクトの作成

CMS receiptオブジェクトを作成する手順を次に示します。

1. コンテンツ・タイプの識別子、署名付きコンテンツ識別子を含むバイト配列、および発信者の署名値を含むバイト配列をとるコンストラクタを使用して、次のようにESSReceiptのインスタンスを作成します。

ESSReceipt rcpt =
new ESSReceipt(contentType, signedContentIdentifier,
originatorSignatureValue);

2. receiptオブジェクトをファイル(たとえばdata.p7m)に書き込みます。

rcpt.output(new FileOutputStream("data.p7m"));

注意:

ESSReceiptオブジェクトを作成する場合は、入力パラメータの設定をnullのままにしないでください。

4.3.3.3.2 ESSReceiptオブジェクトの読み取り

receiptオブジェクトを読み取る手順を次に示します。

1. FileInputStreamを使用してファイルとの接続を開きます。

ファイルdata.p7mに格納されているオブジェクトのコンテンツ・タイプがid-ct-receiptであるとわかっている場合は、次のようにします。

ESSReceipt rcptdata = new ESSReceipt(new FileInputStream("data.p7m"));

コンテンツ・タイプがわからない場合は、次のようにします。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof ESSReceipt)
{
ESSReceipt rcptdata =  (ESSReceipt) cmsdata;
// .....
}

2. receiptオブジェクトに格納されている情報に次のようにアクセスします。

ASASN1ObjectID contentType = rcptdata.getReceiptContentType();
byte[] sciBytes = rcptdata.getSignedContentIdentifier()
byte[] osvBytes = rcptdata.getOriginatorSignatureValue();

4.3.3.4 CMSDigestedDataContentInfoクラス

クラスCMSDigestedDataContentInfoは、定数CMS.id_digestedDataで定義されるタイプid-digestedDataのオブジェクトを表します。

表4-5に、このクラスの有用なメソッドの一部を示します。

表4-5 CMSDigestedDataContentInfoの有用なメソッド

メソッド

説明

byte[] getDigest()

メッセージ・ダイジェスト値を返します。

AlgorithmIdentifier getDigestAlgID()

メッセージ・ダイジェストのアルゴリズムIDを返します。

CMSContentInfo getEnclosed()

ダイジェスト済コンテンツを返します。

ASN1ObjectID getEnclosedContentType()

ダイジェスト済コンテンツのコンテンツ・タイプを返します。

ASN1Integer getVersion()

このオブジェクトのバージョン番号を返します。

boolean isDetached()

このオブジェクトがデタッチされているかどうかを示します。

void setEnclosed(CMSContentInfo content)

カプセル化されたコンテンツ(つまりダイジェストされた元のオブジェクト)を設定します。

void writeDetached(boolean writeDetached)

CMSDigestedDataContentInfoオブジェクトを作成する場合に、ダイジェスト対象のオブジェクトを省略する必要があるかどうかを示します。

4.3.3.4.1 CMS digested-dataオブジェクトの構成

CMS digested-dataオブジェクトを作成する手順を次に示します。

1. ダイジェスト対象のオブジェクトとダイジェスト・アルゴリズム識別子をとるコンストラクタを使用して、CMSDigestedDataContentInfoのインスタンスを作成します。たとえば、contentInfoがCMSDataContentInfoオブジェクト、MD5がダイジェスト・アルゴリズムの場合は、次のようになります。

CMSDigestedDataContentInfo dig =
new CMSDigestedDataContentInfo(contentInfo, CMS.md5);

2. CMS digested-dataオブジェクトをdata.p7mというファイルに書き込みます。

dig.output(new FileOutputStream("data.p7m"));

4.3.3.4.2 CMS digested-dataオブジェクトの読取り

CMS digested-dataオブジェクトの読取り手順は、オブジェクトのコンテンツ・タイプがわかっているかどうかによって異なります。

1. FileInputStreamを使用してファイルdata.p7mとの接続を開きます。

ファイルに格納されているオブジェクトのコンテンツ・タイプがid-digestedDataであるとわかっている場合は、次のように接続を開きます。

CMSDigestedDataContentInfo digdata =
new CMSDigestedDataContentInfo(new FileInputStream("data.p7m"));

事前にコンテンツ・タイプがわからない場合は、次のように接続を開きます。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof CMSDigestedDataContentInfo)
{
CMSDigestedDataContentInfo digdata =
(CMSDigestedDataContentInfo) cmsdata;
// .....
}

2. 次のようにCMS digested-dataオブジェクトに格納されている情報にアクセスします。

int version = digdata.getVersionNumber().intValue();
AlgorithmIdentifier digestAlgID = digdata.getDigestAlgID();
byte[] digestValue = digdata.getDigest();
CMSContentInfo digContentInfo = digData.getEnclosed()
if (digData.getEnclosedContentType().equals(CMS.id_data))
CMSDataContentInfo contentInfo = (CMSDataContentInfo)digContentInfo;

3. 保護されるデータの整合性を確認するために、次のようにダイジェストを検証します。

digData.verify();

4.3.3.4.3 デタッチされたdigested-dataオブジェクトの操作

デタッチされたオブジェクトを扱う場合、ダイジェストされたオブジェクトは、結果として生成されるCMS digested-data構造体には含まれません。デタッチされたオブジェクトを生成するには、writeDetached (true | false)メソッドをコールします。次に例を示します。

dig.writeDetached(true);

前述のとおり、デタッチされたCMS digested-dataオブジェクトを読み取ることはできますが、ダイジェストされた元のオブジェクトが存在しないため、ダイジェストの検証は失敗します。これを解決するためには、次のようにsetEnclosed (CMScontentInfo)メソッドをコールしてdigestedContentを設定します。

digdata.setEnclosed(CMScontentInfo object);

この後で、次のようにダイジェストの検証をします。

digdata.verify();

4.3.3.5 CMSSignedDataContentInfoクラス

クラスCMSSignedDataContentInfoは、定数CMS.id_signedDataで定義されるタイプid-signedDataのオブジェクトを表します。

Oracle CMSでは、SignerIdentifierとして使用するためにIssuerAndSerialNoまたはSubjectKeyIdentifierの選択がサポートされます。ただし、PKCS #7およびS/MIMEとの相互運用性を保つためには、IssuerAndSerialNoをSignerIdentifierとして使用する必要があります。

表4-6に、このクラスの有用なメソッドの一部を示します。

表4-6 CMSSignedDataContentInfoの有用なメソッド

メソッド

説明

void addCertificate(X509Certificate cert)

このsigned-dataオブジェクトに含める証明書のリストに所定の証明書を追加します。

void addCRL(CRL crl)

このsigned-dataオブジェクトに含めるCRLのリストに所定のCRLを追加します。

void addSignature(AttributeSet authenticatedAttributes, PrivateKey signerKey, X509Certificate signerCert, AlgorithmIdentifier digestAlgID, AlgorithmIdentifier digestEncryptionAlgID, AttributeSet unauthenticatedAttributes)

IssuerAndSerialNumber(つまりVersion1 CMSSignerInfo)をSignerIdentifierとして使用し、署名を追加します。

void addSignature(AttributeSet authenticatedAttributes, PrivateKey signerKey, X509Certificate signerCert, AlgorithmIdentifier digestAlgID, AlgorithmIdentifier digestEncryptionAlgID, AttributeSet unauthenticatedAttributes, boolean useSPKI64)

SubjectKeyIdentifier(つまりVersion3 CMSSignerInfo)をSignerIdentifierとして使用し、署名を追加します。

void addSignerInfo(X509Certificate signerCert, CMSSignerInfo signerInfo)

CMSSignerInfoを署名者のリストに追加します。

Vector getCertificates()

このsigned-dataオブジェクトに含まれる証明書のリストを返します。

Vector getCRLs()

このsigned-dataオブジェクトに含まれるCRLのリストを返します。

CMSContentInfo getEnclosed()

署名付き文書を返します。

ASN1ObjectID getEnclosedContentType()

署名付き文書のコンテンツ・タイプを返します。

CMSSignerInfo getSignerInfo(signerCert)

証明書に対応するCMSSignerInfoを返します。

ASN1Integer getVersion()

このオブジェクトのバージョン番号を返します。

boolean isDegenerate()

これがデジェネレートのCMSSignedDataContentInfoオブジェクト(つまりSignerInfo構造体がない)かどうかを示します。

boolean isDetached()

これがデタッチされたオブジェクトかどうかを示します。

boolean isExternalSignature()

外部署名の存在をチェックします。

void setEnclosed(CMSContentInfo content)

署名付きコンテンツを設定します。

Enumeration signers()

このsigned-dataオブジェクトの署名を列挙の形式で返します。列挙の各要素はCMSSignerInfoのインスタンスです。

void verify(CertificateTrustPolicy trustPolicy)

所定の信頼ポリシーに従い、このCMS signed dataオブジェクトに少なくとも1つの有効な署名が含まれるかどうかを返します。

void verify(CertificateTrustPolicy   trustPolicy,CMSContentInfo contentInfo)

所定の信頼ポリシーに従い、このsigned-dataオブジェクトに少なくとも1つの有効な署名が含まれるかどうかを返します。

void verifySignature(X509Certificate signerCert)

このsigned-dataオブジェクトに、所定の証明書で検証される署名が含まれるかどうかを返します。

void verifySignature(X509Certificate signerCert,   CMSContentInfo contentInfo)

このsigned-dataオブジェクトに、所定の証明書とデータで検証される署名が含まれるかどうかを返します。

void writeExternalSignature(boolean createExternalSignature)

外部署名を作成する必要があるかどうかを示します。

RSAおよびDSA署名アルゴリズムを使用する場合は、プロバイダがOracle CMS実装でプラガブルになることに注意してください。

4.3.3.5.1 CMS signed-dataオブジェクトの構成

CMS signed-dataオブジェクトを作成する手順を次に示します。

1. CMSSignedDataContentInfoのインスタンスを作成します。たとえば、CMSSignedDataContentInfoオブジェクトを作成するには、contentInfoオブジェクト(署名の対象になるデータ)を次のように渡します。

CMSSignedDataContentInfo sig =
new CMSSignedDataContentInfo(contentInfo);

2. 署名を追加します。

CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate envCert =  (X509Certificate)cf.generateCertificate(new FileInputStream("name1"));
PrivateKey signerKey =
...;

a. 次のように、IssuerAndSerialNoをSignerIdentifierとして使用し、MD5ダイジェストおよびRSA署名アルゴリズムを使用して、署名を追加します。

sig.addSignature(null, signerKey, signerCert, CMS.md5,
CMS.rsaEncryption, null);

b. 次のように、64ビットSubjectKeyIdentifierをSignerIdentifierとして使用し、SHA-1ダイジェストおよびDSS署名アルゴリズムを使用して、署名を追加します。

sig.addSignature(null, signerKey, signerCert, CMS.sha_1,
CMS.dsaWithSHA, null, true);

c. 次のように、160ビットSubjectKeyIdentifierをSignerIdentifierとして使用し、SHA-1ダイジェストおよびRSA署名アルゴリズムを使用して、署名を追加します。

sig.addSignature(null, signerKey, signerCert, CMS.sha_1,
CMS.rsaEncryption, null, false);

3. 証明書とCRLを追加します。

sig.addCertificate (....)
sig.addCRL (...)

4. CMS signed-dataオブジェクトをファイル(たとえばdata.p7m)に書き込みます。

sig.output(new FileOutputStream("data.p7m"));

4.3.3.5.2 CMS signed-dataオブジェクトの読取り

CMS signed-dataオブジェクトの読取り手順は、オブジェクトのコンテンツ・タイプがわかっているかどうかによって異なります。

1. FileInputStreamを使用してファイルdata.p7mとの接続を開きます。

ファイルに格納されているオブジェクトのコンテンツ・タイプがid-signedDataであるとわかっている場合は、次のようにします。

CMSSignedDataContentInfo sigdata =
new CMSSignedDataContentInfo(new FileInputStream("data.p7m"));

事前にコンテンツ・タイプがわからない場合は、次のようにします。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof CMSSignedDataContentInfo)
{
CMSSignedDataContentInfo sigdata =
(CMSSignedDataContentInfo) cmsdata;
// .....
}

2. 次のようにCMS signed-dataオブジェクトに格納されている情報にアクセスします。

int version = sigdata.getVersion().intValue();
CMSContentInfo sigContentInfo = sigData.getEnclosed()
Vector certs = sigdata.getCertificates();
Vector crls = sigData.getCRLs();
Enumeration e = sigData.signers();
CMSContentInfo sigContentInfo = sigData.getEnclosed();
if (sigData.getEnclosedContentType().equals(CMS.id_data))
CMSDataContentInfo contentInfo = (CMSDataContentInfo)sigContentInfo;

3. 署名者の公開鍵証明書を使用して署名を検証します。

sigData.verifySignature(signerCert);

4. 次のように署名者の詳細を取得します。

CMSSignerInfo sigInfo = sigdata.getSignerInfo(signerCert);
byte[] signatureValue = sigInfo.getEncryptedDigest();
AlgorithmIdentifier digest = sigInfo.getDigestAlgID();
AlgorithmIdentifier signature = sigInfo.getDigestEncryptionAlgID();
AttributeSet signedAttributes = sigInfo.getAuthenticatedAttributes();
AttributeSet unsignedAttributes = sigInfo.getUnauthenticatedAttributes();

4.3.3.5.3 外部署名(デタッチ・オブジェクト)の操作

デタッチされたオブジェクトの場合、結果として生成されるCMS signed-data構造体に署名付きオブジェクトは含まれません。デタッチされたオブジェクトを生成するには、writeExternalSignature()メソッドをコールします。

sig.writeExternalSignature(true);

「CMS signed-dataオブジェクトの読取り」で説明したとおり、デタッチされたCMS signed-dataオブジェクトを読み取ることはできますが、署名付きの元のオブジェクトが存在しないため、署名の検証は失敗します。これに対処するには、次のようにsetEnclosed(..)メソッドを最初にコールして、署名付きコンテンツを設定します。

sigdata.setEnclosed(contentInfo);

この後で、次のように署名の検証をします。

sigdata.verifySignature(signerCert);

4.3.3.5.4 証明書またはCRL専用オブジェクトの操作

これらは、基本的には、証明書またはCRL(あるいはその両方)が添付され、署名がないCMSSignedDataContentInfoオブジェクトです。次のように証明書またはCRL専用オブジェクトを生成します。

CMSSignedDataContentInfo sigdata =
new CMSSignedDataContentInfo(new CMSDataContentInfo(new byte[0]));
sigData.addCertificate (...);
sigData.addCRL( ...);
sigData.output(..);

証明書またはCRL専用signed-dataオブジェクトの読取りは、「CMS signed-dataオブジェクトの読取り」と同様に行うことができます。

4.3.3.6 CMSEncryptedDataContentInfoクラスの使用方法

クラスCMSEncryptedDataContentInfoは、定数CMS.id_encryptedDataで定義されるタイプid-encryptedDataのオブジェクトを表します。

表4-7に、このクラスの有用なメソッドの一部を示します。

表4-7 CMSEncryptedDataContentInfoの有用なメソッド

メソッド

説明

AlgorithmIdentifier getContentEncryptionAlgID()

コンテンツ暗号化アルゴリズムを返します。

CMSContentInfo getEnclosed(SecreKey decryptionKey)

復号化されたコンテンツを返します。

ASN1ObjectID getEnclosedContentType()

暗号化されたコンテンツのコンテンツ・タイプを返します。

byte[] getEncryptedContent()

暗号化されたコンテンツを返します。

AttributeSet getUnprotectedAttributes()

保護されていない属性のセットを返します。

ASN1Integer getVersion()

バージョン番号を返します。

boolean isDetached()

これがデタッチされたCMSオブジェクトかどうかを示します。

void setUnprotectedAttributes   (oracle.security.crypto.cert.AttributeSet unprotectedAttributes)

保護されない属性を設定します。

void writeDetached   (boolean writeDetachedObject)

このオブジェクトの出力エンコーディングにおいて、encryptedContentをEncryptedContentInfo構造体に含めるかどうかを示します。

RC2、DES、Triple-DES、AESなどの暗号化操作を使用する場合は、暗号プロバイダがOracle Security Engine実装でプラガブルになることに注意してください。

4.3.3.6.1 CMS encrypted-dataオブジェクトの構成

次のようにencrypted-dataオブジェクトを作成します。

1. CMSEncryptedDataContentInfoのインスタンスを作成します。たとえば、contentInfoがCMSDataContentInfoオブジェクト、暗号がCBCモードのTriple-DESの場合は、次のようになります。

SecretKey contentEncryptionKey =    KeyGenerator.getInstance("DESede").generateKey();

CMSEncryptedDataContentInfo enc =
new CMSEncryptedDataContentInfo(contentInfo, contentEncryptionKey,
CMS.des_ede3_cbc);

2. encrypted-dataオブジェクトをファイル(たとえばdata.p7m)に書き込みます。

enc.output(new FileOutputStream("data.p7m"));

4.3.3.6.2 CMS encrypted-dataオブジェクトの読取り

encrypted-dataオブジェクトの読取り手順は、オブジェクトのコンテンツ・タイプがわかっているかどうかによって異なります。

1. FileInputStreamを使用してファイルdata.p7mとの接続を開きます。

ファイルdata.p7mに格納されているオブジェクトのコンテンツ・タイプがid-encryptedDataであるとわかっている場合は、次のようにします。

CMSEncryptedDataContentInfo encdata =
new CMSEncryptedDataContentInfo(new FileInputStream("data.p7m"));

事前にコンテンツ・タイプがわからない場合は、次のようにします。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof CMSEncryptedDataContentInfo)
{
CMSEncryptedDataContentInfo encdata =
(CMSEncryptedDataContentInfo) cmsdata;
// .....
}

2. 次のようにCMS encrypted-dataオブジェクトに格納されている情報にアクセスします。

int version = encdata.getVersion().intValue();
AlgorithmIdentifier encAlgID = encdata.getContentEncryptionAlgID();
byte[] encValue = encdata.getEncryptedContent();
CMSContentInfo encContentInfo =
encdata.getEnclosed(ContentEncryptionKey);  //Decrypt the Content
if (encData.getEnclosedContentType().equals(CMS.id_data))
CMSDataContentInfo contentInfo = (CMSDataContentInfo)encContentInfo;

4.3.3.6.3 デタッチされた暗号化データCMSオブジェクトの生成

デタッチされたオブジェクトの場合、結果として生成されるCMS encrypted-data構造体に暗号化されたオブジェクトは含まれません。デタッチされたオブジェクトを生成するには、writeDetached(..)メソッドをコールします。

encData.writeDetached(true);

「CMS encrypted-dataオブジェクトの読取り」で説明したとおり、デタッチされたCMS encrypted-dataオブジェクトを読み取ることはできますが、暗号化された元のオブジェクトが存在しないため、コンテンツの復号化は失敗します。setEnclosed (..)メソッドをコールして、encryptedContentを設定します。

encData.setEnclosed(encryptedcontent());

この後で、次のようにコンテンツを復号化します。

encdata.getEnclosed(ContentEncryptionKey);

4.3.3.7 CMSEnvelopedDataContentInfoクラスの理解および使用方法

クラスCMSEnvelopedDataContentInfoは、定数CMS.id_envelopedDataで定義されるタイプid-envelopedDataのオブジェクトを表します。

表4-8に、このクラスの有用なメソッドの一部を示します。

表4-8 CMSEnvelopedDataContentInfoの有用なメソッド

メソッド

説明

void addRecipient(AlgorithmIdentifier keyEncryptionAlgID,       SecretKey keyEncryptionKey, byte[] keyIdentifier, Date keyDate, ASN1Sequence otherKeyAttribute)

鍵暗号化(ラップ)鍵交換メカニズムを使用する受信者を追加します。

void addRecipient(CMSRecipientInfoSpec ris)

鍵交換メカニズム仕様を使用する受信者を追加します。

void addRecipient(X509Certificate recipientCert, AlgorithmIdentifier keyEncryptionAlgID)

鍵転送(IssuerAndSerialNo)鍵交換メカニズムを使用する受信者を追加します。

void addRecipient(X509Certificate recipientCert, AlgorithmIdentifier keyEncryptionAlgID, boolean useSPKI64)

鍵転送(SubjectKeyIdentifier)鍵交換メカニズムを使用する受信者を追加します。

AlgorithmIdentifier getContentEncryptionAlgID()

コンテンツ暗号化アルゴリズムを返します。

CMSContentInfo getEnclosed(PrivateKey privateKey, X509Certificate recipientCert)

鍵転送のRecipientInfoを使用して復号化した後に、エンクローズされたコンテンツを返します。

CMSContentInfo getEnclosed(SecretKey symmetricKey, byte[] keyIdentifier)

鍵暗号化のRecipientInfoを使用して復号化した後に、エンクローズされたコンテンツを返します。

CMSContentInfo getEnclosed(SecretKey symmetricKey, byte[] keyIdentifier,Date keyDate)

復号化した後にエンクローズされたコンテンツを返します。

ASN1ObjectID getEnclosedContentType()

暗号化されたコンテンツのコンテンツ・タイプを返します。

byte[] getEncryptedContent()

暗号化されエンクローズされたコンテンツを返します。

OriginatorInfo getOriginatorInfo()

OriginatorInfoを返します

AttributeSet getUnprotectedAttribs()

保護されない属性を返します。

ASN1Integer getVersion()

バージョン番号を返します。

boolean isDetached()

暗号化されたコンテンツが存在しないかどうかを示します。

Enumeration recipients()

メッセージ受信者のリストを返します。

void setEnclosed(byte[] encryptedContent)

暗号化されたコンテンツを設定します。

void setOriginatorInfo(OriginatorInfo   origInfo)

OriginatorInfoを設定します

void setUnprotectedAttribs   (oracle.security.crypto.cert.AttributeSet unprotectedAttributes)

保護されない属性を設定します。

void writeDetached(boolean writeDetached)

このオブジェクトの出力エンコーディングから暗号化されたコンテンツを省略する必要があるかどうかを示します。

4.3.3.7.1 CMS enveloped-dataオブジェクトの構成

enveloped-dataオブジェクトを作成する手順を次に示します。

1. CMSEnvelopedDataContentInfoのインスタンスを作成します。たとえば、contentInfoがCMSDataContentInfoオブジェクト、暗号がCBCモードのTriple-DESの場合は、次のようになります。

CMSEnvelopedDataContentInfo env =
new CMSEnvelopedDataContentInfo(contentInfo, CMS.des_ede3_cbc);

2. 受信者の鍵管理方法を考慮して、受信者を追加します。

- 受信者が鍵暗号化(ラップ)鍵管理メカニズムを使用する場合:

env.addRecipient(keyEncryptionAlgID, keyEncryptionKey,
keyIdentifier, keyDate, otherKeyAttribute);

- 受信者の鍵交換メカニズムがCMSRecipientInfoSpecオブジェクトを使用して指定された場合:

env.addRecipient(ris)

- 受信者が鍵転送(IssuerAndSerialNo受信者識別子)鍵管理メカニズムを使用する場合:

env.addRecipient(recipientCert, CMS.rsaEncryption);

- 受信者が鍵転送(64ビットSubjectKeyIdentifier受信者識別子)鍵管理メカニズムを使用する場合:

env.addRecipient(recipientCert, CMS.rsaEncryption, true)

- 受信者が鍵転送(160ビットSubjectKeyIdentifier受信者識別子)鍵管理メカニズムを使用する場合:

env.addRecipient(recipientCert, CMS.rsaEncryption, false)

3. オプションの引数を設定します。

env.setOriginatorInfo(originatorInfo);
env.setUnprotectedAttribs(unprotectedAttributes);

4. CMS enveloped-dataオブジェクトをファイル(たとえばdata.p7m)に書き込みます。

enc.output(new FileOutputStream("data.p7m"));

4.3.3.7.2 CMS enveloped-dataオブジェクトの読取り

オブジェクトの読取り手順は、オブジェクトのコンテンツ・タイプがわかっているかどうかによって異なります。

1. FileInputStreamを使用してファイルdata.p7mとの接続を開きます。ファイルに格納されているオブジェクトのコンテンツ・タイプがid-envelopedDataであるとわかっている場合は、次のように接続を開きます。

CMSEnvelopedDataContentInfo envdata =
new CMSEnvelopedDataContentInfo(new FileInputStream("data.p7m"));

事前にコンテンツ・タイプがわからない場合は、次のように接続を開きます。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof CMSEnvelopedDataContentInfo)
{
CMSEnvelopedDataContentInfo envdata =
(CMSEnvelopedDataContentInfo) cmsdata;
//
.....
}

2. 次のようにenveloped-dataオブジェクトに格納されている情報にアクセスします。

int version = envdata.getVersion().intValue();
AlgorithmIdentifier encAlgID = envdata.getContentEncryptionAlgID();
ASN1ObjectID contentType = envdata.getEnclosedContentType();
byte[] encryptedContent = envdata.getEncryptedContent();
OriginatorInfo origInfo = envdata.getOriginatorInfo();
AttributeSet unprotected = envdata.getUnprotectedAttribs();

3. 次のように、受信者の情報に応じてコンテンツを復号化します。

CMSContentInfo envContentInfo =
env.getEnclosed(privateKey, recipientCert);

または

CMSContentInfo envContentInfo =
env.getEnclosed(symmetricKey, keyIdentifier);

または

CMSContentInfo envContentInfo =
env.getEnclosed(symmetricKey, keyIdentifier, keyDate)
if (envContentInfo instanceof CMSDataContentInfo)
{
CMSDataContentInfo contentInfo = (CMSDataContentInfo) envContentInfo;
// ...
}

4.3.3.7.3 鍵転送鍵交換メカニズムについて

このメカニズムでは、受信者識別子としてIssuerAndSerialNoまたはSubjectKeyIdentifierがサポートされます。

4.3.3.7.4 鍵合意鍵交換メカニズムについて

このメカニズムは現在サポートされていません。

4.3.3.7.5 鍵暗号化(ラップ)鍵交換メカニズムについて

Oracle CMSでは、CMS3DESWrapおよびCMSRC2Wrapアルゴリズムがサポートされます。混在モードのラップはサポートされません。たとえば、3DESの鍵をRC2でラップすることはできません。

注意:

OtherKeyAttributeを使用すると、相互運用性の問題が発生する場合があります。

4.3.3.7.6 デタッチされたCMS enveloped-dataオブジェクトの使用方法

デタッチされたオブジェクトを扱う場合、結果として生成されるCMS enveloped-data構造体にエンベロープ・オブジェクトは含まれません。デタッチされたオブジェクトを生成するには、writeDetached(..)メソッドをコールします。

envdata.writeDetached(true);

「CMS enveloped-dataオブジェクトの読取り」で説明したとおり、デタッチされたenveloped-dataオブジェクトを読み取ることはできますが、元のエンベロープ・オブジェクトが存在しないため、コンテンツの復号化は失敗します。setEnclosed(..)メソッドをコールして、エンベロープ・コンテンツを設定します。

envdata.setEnclosed(env.getEncryptedContent());

この後で、次のようにコンテンツを復号化します。

envdata.getEnclosed(............);

4.3.3.8 CMSAuthenticatedDataContentInfoクラスの使用方法

クラスCMSAuthenticatedDataContentInfoは、定数CMS.id_ct_authDataで定義されるid-ct-authDataタイプのオブジェクトを表します。

注意:

Oracle CMSでは、HMAC-SHA1メッセージ認証コード(MAC)アルゴリズムがサポートされます。

表4-9に、このクラスの有用なメソッドの一部を示します。

表4-9 CMSAuthenticatedDataContentInfoの有用なメソッド

メソッド

説明

void addRecipient(AlgorithmIdentifier keyEncryptionAlgID,     SecretKey keyEncryptionKey, byte[] keyIdentifier, java.util.Date keyDate, ASN1Sequence otherKeyAttribute)

鍵ラップ鍵交換メカニズムを使用する受信者を追加します。

void addRecipient(CMSRecipientInfoSpec ris)

指定した鍵交換メカニズムを使用する受信者を追加します。

void addRecipient(X509Certificate recipientCert, AlgorithmIdentifier keyEncryptionAlgID)

受信者識別子としてIssuerAndSerialNoを使用した鍵転送鍵交換メカニズムを使用する受信者を追加します。

void addRecipient(X509Certificate recipientCert, AlgorithmIdentifier keyEncryptionAlgID, boolean useSPKI64)

受信者識別子としてSubjectKeyIdentifierを使用した鍵転送鍵交換メカニズムを使用する受信者を追加します。

AttributeSet getAuthenticatedAttributes()

認証された属性を返します。

AlgorithmIdentifier getDigestAlgID()

ダイジェスト・アルゴリズムを返します。

CMSContentInfo getEnclosed()

認証されたコンテンツを返します。

ASN1ObjectID getEnclosedContentType()

エンクローズされたコンテンツのコンテンツ・タイプを返します。

byte[] getMAC()

メッセージ認証コードを返します。

AlgorithmIdentifier getMACAlgID()

認証に使用されたMACアルゴリズムを返します。

OriginatorInfo getOriginatorInfo()

発信元の情報を返します。

AttributeSet getUnauthenticatedAttributes()

認証されなかった属性を返します。

ASN1Integer getVersion()

バージョン番号を返します。

boolean isDetached()

このオブジェクトがデタッチされているかどうかを示します。

java.util.Enumeration recipients()

メッセージ受信者のリストを返します。

void setAuthenticatedAttributes(AttributeSet authenticatedAttributes, AlgorithmIdentifier digestAlgorithm)

認証された属性を設定します。

void setEnclosed(CMSContentInfo content)

認証されたコンテンツを設定します。

void setOriginatorInfo(OriginatorInfo originatorInfo)

OriginatorInfoを設定します。

void setUnauthenticatedAttributes(AttributeSet unauthenticatedAttributes)

認証されなかった属性を設定します。

void verifyMAC(PrivateKey privateKey, X509Certificate recipientCert)

復号化した後にエンクローズされたコンテンツを返します。

void verifyMAC(SecretKey symmetricKey, byte[] keyIdentifier)

復号化した後にエンクローズされたコンテンツを返します。

void verifyMAC(SecretKey symmetricKey, byte[] keyIdentifier, Date keyDate)

復号化した後にエンクローズされたコンテンツを返します。

void verifyMAC(SecretKey symmetricKey, byte[] keyIdentifier, Date keyDate, ASN1Sequence otherKeyAttribute)

復号化した後にエンクローズされたコンテンツを返します。

void writeDetached(boolean writeDetachedObject)

このオブジェクトの出力エンコーディングから認証されたコンテンツを省略する必要があるかどうかを示します。

4.3.3.8.1 CMS authenticated-dataオブジェクトの構成

authenticated-dataオブジェクトの使用の開始点はCMSAuthenticatedDataContentInfoクラスです。

authenticated-dataオブジェクトを作成する手順を次に示します。

1. CMSAuthenticatedDataContentInfoのインスタンスを作成します。次の例では、contentInfoがCMSDataContentInfoオブジェクト、鍵がTriple-DES HMAC、アルゴリズムがHMAC-SHA1になります。

SecretKey contentEncryptionKey =
KeyGenerator.getInstance("DESede").generateKey();
CMSAuthenticatedDataContentInfo auth =
new CMSAuthenticatedDataContentInfo(contentInfo,
contentEncryptionKey, CMS.hmac_SHA_1);

2. 受信者の鍵管理方法を考慮して、受信者を追加します。

- 受信者が鍵暗号化(ラップ)鍵管理メカニズムを使用する場合:

auth.addRecipient(keyEncryptionAlgID, keyEncryptionKey, keyIdentifier,
keyDate, otherKeyAttribute);

- 受信者の鍵交換メカニズムがCMSRecipientInfoSpecオブジェクトを使用して指定された場合:

auth.addRecipient(ris)

- 受信者が鍵転送(IssuerAndSerialNo受信者識別子)鍵管理メカニズムを使用する場合:

auth.addRecipient(recipientCert, CMS.rsaEncryption);

- 受信者が鍵転送(64ビットSubjectKeyIdentifier受信者識別子)鍵管理メカニズムを使用する場合:

auth.addRecipient(recipientCert, CMS.rsaEncryption, true)

- 受信者が鍵転送(160ビットSubjectKeyIdentifier受信者識別子)鍵管理メカニズムを使用する場合:

auth.addRecipient(recipientCert, CMS.rsaEncryption, false)

3. オプションの引数を設定します。

auth.setAuthenticatedAttributes(authenticatedAttributes, CMS.md5);
auth.setOriginatorInfo(originatorInfo);
auth.setUnauthenticatedAttributes(unauthenticatedAttributes);

4. CMS authenticated-dataオブジェクトをファイル(たとえばdata.p7m)に書き込みます。

auth.output(new FileOutputStream("data.p7m"));

4.3.3.8.2 CMS authenticated-dataオブジェクトの読取り

オブジェクトの読取り手順は、オブジェクトのコンテンツ・タイプがわかっているかどうかによって異なります。

オブジェクトの読取りの手順は次のとおりです。

1. FileInputStreamを使用してファイルdata.p7mとの接続を開きます。ファイルに格納されているオブジェクトのコンテンツ・タイプがid-ct-authDataであるとわかっている場合は、次のようにします。

CMSAuthenticatedDataContentInfo authdata =
new CMSAuthenticatedDataContentInfo(new FileInputStream("data.p7m"));

事前にコンテンツ・タイプがわからない場合は、次のようにします。

CMSContentInfo cmsdata =
CMSContentInfo.inputInstance(new FileInputStream("data.p7m"));
if (cmsdata instanceof  CMSAuthenticatedDataContentInfo)
{
CMSAuthenticatedDataContentInfo authdata =
(CMSAuthenticatedDataContentInfo) cmsdata;
// .....
}

2. 次のようにCMS authenticated-dataオブジェクトに格納されている情報にアクセスします。

int version = authdata.getVersion().intValue();
AlgorithmIdentifier macAlgID = authdata.getMACAlgID();
byte[] macValue = authdata.getMAC();
CMSContentInfo authContentInfo = authdata.getEnclosed();
if (authData.getEnclosedContentType().equals(CMS.id_data))
CMSDataContentInfo contentInfo = (CMSDataContentInfo)authContentInfo;

3. 次のように、受信者の情報に応じてMACを検証します。

authdata.verifyMAC(recipientPrivateKey, recipientCert);

または

authdata.verifyMAC(symmetricKey, keyIdentifier)

または

authdata.verifyMAC(symmetricKey, keyIdentifier, keyDate)

または

authdata.verifyMAC(symmetricKey, keyIdentifier, keyDate,
otherKeyAttribute)

4.3.3.8.3 デタッチされたCMS authenticated-dataオブジェクトの操作

前述のとおり、デタッチされたauthenticated-dataオブジェクトを読み取ることはできますが、認証された元のオブジェクトが存在しないため、MACの検証は失敗します。これを解決するためには、次のようにsetEnclosed(..)メソッドをコールして認証されたコンテンツを設定します。

authdata.setEnclosed(contentInfo);

この後で、適切な鍵交換メカニズムを使用して、次のようにMACを検証します。

authdata.verifyMAC(...)

4.3.3.9 3回以上ラップされたCMSContentInfoオブジェクトの操作

CMSContentInfoオブジェクトを別のCMSContentInfoオブジェクトでラップするには、コンストラクタを介して、初期化したCMSContentInfoオブジェクトを外側のCMSContentInfoオブジェクトに渡します。一番外側のCMSContentInfoオブジェクトのoutput(..)メソッドをコールして、ネストしたオブジェクトを生成します。

4.3.3.9.1 ネスト(ラップ)したCMSオブジェクトの読取り

ネストしたオブジェクトの読取り方法は、事前に一番外側のコンテンツ・タイプがわかっているかどうかによって異なります。

一番外側のコンテンツ・タイプが事前にわからない場合は、次のように静的なメソッドをコールします。

CMSContentInfo.inputInstance( ... )

一番外側のコンテンツ・タイプが事前にわかっている場合は、次のように適切なコンストラクタをコールします。

new CMS***DataContentInfo( .... )

その後、getEnclosed(..)メソッドを再帰コールし、内側のオブジェクトを1つずつ抽出します。

4.3.4 CMS***StreamおよびCMS***Connectorクラスを使用したCMSオブジェクト

CMS**DataContentInfoクラスにより、CMS***Streamクラスと同じ機能が提供されます。CMS**DataContentInfoクラスに対するCMS***Streamクラスの最大の利点は、1つのパスでCMSオブジェクトの作成または読取りが可能であり、すべての入力データを累積する必要がないことです。ネストされたCMSオブジェクトの読取り時に、CMSInputStreamのかわりにCMSInputConnectorが使用されます。

表4-10に、CMS***Streamクラスのコンテンツ・タイプを示します。

表4-10 CMS***Streamクラス

クラス

コンテンツ・タイプ

CMSDigestedDataInputStream, CMSDigestedDataOutputStream

CMS.id_digestedData

CMSSignedDataInputStream, CMSSignedDataOutputStream

CMS.id_signedData

CMSEncryptedDataInputStream, CMSEncryptedDataOutputStream

CMS.id_encryptedData

CMSEnvelopedDataInputStream, CMSEnvelopedDataOutputStream

CMS.id_envelopedData

CMSAuthenticatedDataInputStream、CMSAuthenticatedDataOutputStream

CMS.id_ct_authData

表4-11に、CMS***Connectorクラスのコンテンツ・タイプを示します。

表4-11 CMS***Connectorクラス

クラス

コンテンツ・タイプ

CMSDigestedDataInputConnector、CMSDigestedDataOutputConnector

CMS.id_digestedData

CMSSignedDataInputConnector、CMSSignedDataOutputConnector

CMS.id_signedData

CMSEncryptedDataInputConnector、CMSEncryptedDataOutputConnector

CMS.id_encryptedData

CMSEnvelopedDataInputConnector、CMSEnvelopedDataOutputConnector

CMS.id_envelopedData

CMSAuthenticatedDataInputConnector、CMSAuthenticatedDataOutputConnector

CMS.id_ct_authData

4.3.4.1 CMS***StreamおよびCMS***Connectorクラスの制限

オブジェクトを処理する場合、CMS***StreamクラスおよびCMS***Connectorクラスには次の制限があります。

1. デタッチされたCMS id-digestedDataオブジェクトのダイジェストを検証できません。

2. デタッチされたCMS id-signedDataオブジェクトの署名を検証できません。

3. デタッチされたCMS id-ct-authDataオブジェクトのMACを検証できません。

注意:

デタッチされたオブジェクトを処理する場合は、常にCMS**DataContentInfoクラスを使用してください。

4.3.4.2 CMS***StreamとCMS***Connectorクラスの違い

CMS***OutputStreamクラスは、CMS (RFC-2630) ContentInfo構造体内でそのクラスに書き込まれるデータをラップする出力ストリーム・フィルタで、その後、そのBERエンコーディングが、基礎となる出力ストリームに書き込まれます。CMS***OutputConnectorクラスは、同様に、CMS (RFC-2630) ContentInfo構造体内でそのクラスに書き込まれるデータをラップする出力ストリーム・フィルタですが、基礎となる出力ストリームに書き込まれるのは、ContentInfo構造体のContentフィールドの8ビット値(明示的な[0]タグを省いたもの)のみです。

CMS***InputStreamクラスは、基礎となる出力ストリームからCMS (RFC 2630)ContentInfo構造体のBERエンコーディングを読み取る入力ストリーム・フィルタです。CMS***InputConnectorクラスは入力ストリーム・フィルタであり、基礎となる入力ストリームがContentInfo構造体のContentフィールドの8ビット値の開始位置(明示的な[0]タグの後)にあることを前提としています。

CMS***Connectorは、ネストしたオブジェクトの作成と読取りを行う場合に便利です。

4.3.4.3 CMS***OutputStreamおよびCMS***InputStreamクラスの使用

CMS***InputStreamにはCMSオブジェクトを読み取るためのメソッドが含まれます。CMS***OutputStreamはCMSオブジェクトを出力ストリームに書き込みます。

オブジェクトを構成する手順を次に示します。

1. 適切なコンテンツ・タイプのCMS***OutputStreamクラスを作成します。関連するすべてのパラメータはコンストラクタを介して渡されます。

2. ステップ1で作成したCMS***OutputStreamに、保護するデータを書き込みます。

3. すべてのデータを書き込んだら、ステップ1で作成したCMS***OutputStreamを閉じます。

オブジェクトを読み取る手順を次に示します。

1. 基礎となる入力ストリームをコンストラクタを介して渡し、適切なコンテンツ・タイプのCMS***InputStreamクラスを作成します。

2. read()およびread (byte[],...)メソッドを使用して、ステップ1で作成したCMS***InputStreamから、保護されているデータを読み取ります。

3. ステップ1で作成したCMS***InputStreamからのデータの読取りが終了したら、terminate()を呼び出します。これで、オブジェクトの読取りが完了します。

4. 適切なメソッドを呼び出して、保護されているデータが安全であることを確認します。

4.3.4.3.1 CMS id-dataオブジェクトの操作

getData()メソッドから返されるデータは、CMS***OutputStreamまたはCMS***OutputConnectorに書き込むことができます。

4.3.4.3.2 CMS id-ct-receiptオブジェクトの操作

getReceiptData()メソッドから返されるエンコード済receiptは、CMS***OutputStreamまたはCMS***OutputConnectorに書き込むことができます。

次のように入力ストリームからESSReceiptデータを読み取ります。

byte[] rcptData = in.read(...);
ESSReceipt er = new ESSReceipt();
er.inputContent(rcptData);

4.3.4.3.3 CMS id-digestedDataオブジェクトの操作

デタッチされたdigested-dataオブジェクトのダイジェストを検証することはできません。CMSDigestedDataOutputStreamコンストラクタのブール値のパラメータwriteEContentInfoをfalseに設定すると、デタッチされたdigested-dataオブジェクトを作成できるようになります。

4.3.4.3.4 CMS id-signedDataオブジェクトの操作

デタッチされたsigned-dataオブジェクトの署名を検証することはできません。

CMSSignerInfoSpecクラスには署名者固有の情報が格納されます。追加する署名ごとに、対応するCMSSignerInfoSpecオブジェクトを作成して、コンストラクタに渡す必要があります。

CMSSignedDataOutputStreamコンストラクタのブール値のパラメータcreateExternalSignaturesをtrueに設定すると、デタッチされたsigned-dataオブジェクトすなわち外部署名を作成できるようになります。

証明書またはCRL専用オブジェクトを作成する場合は、署名者情報をCMSDSignedDataOutputStreamコンストラクタに渡さないでください。

4.3.4.3.5 CMS id-encryptedDataオブジェクトの操作

CMSEncryptedDataOutputStreamコンストラクタのブール値のパラメータwriteEncryptedOutputをfalseに設定すると、デタッチされたencrypted-dataオブジェクトを作成できるようになります。

4.3.4.3.6 CMS id-envelopedDataオブジェクトの操作

CMSRecipientInfoSpecクラスには受信者固有の情報が格納されます。追加する受信者ごとに、対応するCMSRecipientInfoSpecオブジェクトを作成して、コンストラクタに渡す必要があります。

CMSEnvelopedDataOutputStreamコンストラクタのブール値のパラメータwriteContentをfalseに設定すると、デタッチされたenveloped-dataオブジェクトを作成できるようになります。

受信者は交換メカニズムにより分類されます。次の表で、様々なメカニズムを定義します。

交換メカニズム

使用方法

鍵転送鍵交換メカニズム

CMSKeyTransRecipientInfoSpecクラスを使用して、鍵転送鍵管理メカニズムを使用する受信者情報を格納します。

鍵合意鍵交換メカニズム

このメカニズムは現在サポートされていません。

鍵暗号化(ラップ)鍵交換メカニズム

CMSKEKRecipientInfoSpecクラスを使用して、鍵ラップ鍵管理メカニズムを使用する受信者情報を格納します。

4.3.4.3.7 CMS id-ct-authDataオブジェクトについて

デタッチされたauthenticated-dataオブジェクトのMACを検証することはできません。

CMSAuthenticatedDataOutputStreamコンストラクタのブール値のパラメータdetachEncapContentをtrueに設定すると、デタッチされたauthenticated-dataオブジェクトを作成できるようになります。

4.3.4.4 CMS***Connectorオブジェクトの3回以上のラップ

CMS***OutputConnectorを使用して、ネストしたオブジェクトを作成します。

次のコードを使用して、signed-data、enveloped-data、digested-dataおよびencrypted-dataを作成し、ファイルnested.p7mに書き込みます。

// nested.p7m <--- FileOutputStream <--- CMSSignedDataOutputConnector
//     <--- CMSEnvelopedDataOutputConnector <---
//         <----  CMSDigestedDataOutputConnector <---
//             <----  CMSEncryptedDataOutputConnector <---
//                 <---- write the data (byte[] data)

FileOutputStream fos = new FileOutputStream("nested.p7m");
CMSSignedDataOutputConnector conn1 =
new CMSSignedDataOutputConnector(fos, .....);
CMSEnvelopedDataOutputConnector conn2 =
new CMSEnvelopedDataOutputConnector(conn1, ...);
CMSDigestedDataOutputConnector conn3 =
new CMSDigestedDataOutputConnector(conn2, ...);
CMSEncryptedDataOutputConnector conn4 =
new CMSEncryptedDataOutputConnector(conn3, ...);
OutputStream os = conn4.getOutputStream();
os.write(data);
os.close();

次のコードを使用して、ファイルnested.p7mに格納されているsigned-data、enveloped-data、digested-dataおよびencrypted-dataを読み取ります。

// nested.p7m ---> FileInputStream ---> CMSSignedDataInputConnector -
//     ---> CMSEnvelopedDataInputConnector ---
//         -----> CMSDigestedDataInputConnector ---
//             ----> CMSEncryptedDataInputConnector ---
//                 ---> read the data (byte[] data)

FileInputStream fos = new FileInputStream("nested.p7m");
CMSSignedDataInputConnector conn1 =
new CMSSignedDataInputConnector(fos, .....);
CMSEnvelopedDataInputConnector conn2 =
new CMSEnvelopedDataInputConnector(conn1, ...);
CMSDigestedDataInputConnector conn3 =
new CMSDigestedDataInputConnector(conn2, ...);
CMSEncryptedDataInputConnector conn4 =
new CMSEncryptedDataInputConnector(conn3, ...);
InputStream is = conn4.getInputStream();
is.read(data);

4.4 Oracle CMSのJava APIリファレンス

Oracle CMSのクラスとメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

5 Oracle S/MIME

Oracle S/MIME APIは、S/MIMEオブジェクトを使用するためのクラス、インタフェースおよびメソッドを含むJavaソリューションです。

Oracle S/MIMEのクラスおよび機能の概要について説明します。

- Oracle S/MIMEの機能と利点

- Oracle S/MIMEの環境設定

- Oracle S/MIMEでのアプリケーションの開発

- Oracle S/MIMEのJava APIリファレンス

5.1 Oracle S/MIMEの機能と利点

Oracle S/MIME APIは、X.509証明書と秘密鍵暗号化をサポートするJavaソリューションです。

次の機能があります。

- 拡張領域付きX.509バージョン3証明書の全面的なサポート(証明書の解析と検証などを含む)。

- PKCS 7およびPKCS 12形式のX.509証明連鎖のサポート。

- PKCS 5、PKCS 8およびPKCS 12を使用する秘密鍵暗号化。

- ASN.1 DER/BER形式でのデータの入出力のための統合ASN.1ライブラリ。

5.2 Oracle S/MIMEの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。Oracle S/MIMEを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

Oracle S/MIMEでは次の実装も必要です。

- JavaBeans Activation Framework (JAF)の実装。Oracleの次の場所から無償で入手できます。
http://www.oracle.com/technetwork/java/jaf11-139815.html

- JavaMail APIの実装。Oracleの次の場所から無償で入手できます。
http://www.oracle.com/technetwork/java/index-138643.html

POPまたはIMAPを使用する場合は、OracleのPOP3(またはIMAP)プロバイダをJavaMailページからダウンロードしてください。

次の項目をCLASSPATHに指定します。

- osdt_core.jarファイル

- osdt_cert.jarファイル

- osdt_cms.jarファイル

- osdt_smime.jarファイル

- Java Activation Framework (JAF)、JavaMailおよびPOP3プロバイダのインストール・ディレクトリ

注意:

Java Activation FrameworkはJDK 1.6に含まれています。

例:

setenv CLASSPATH $CLASSPATH:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cert.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cms.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_smime.jar:
/usr/lib/jaf-1.1/activation.jar:
/usr/lib/javamail-1.4.1/mail.jar

Oracle S/MIMEのAPIを使用するアプリケーションでは、必要なすべてのMIMEタイプをコマンド・マップに登録する必要があります。

一部のアプリケーション、特にS/MIMEエントリをFileDataSourceから読み取るアプリケーションでは、S/MIMEファイル・タイプを登録する必要があります。

5.3 Oracle S/MIMEでのアプリケーションの開発

Oracle S/MIME APIのコア・クラスとインタフェース、サポート・クラスとインタフェースおよびそれらのメソッドを使用して、アプリケーションを開発できます。

この項では、Oracle S/MIMEのAPIで選択されたインタフェースとクラスについて説明し、使用方法を示します。次のトピックが含まれます:

- Oracle S/MIMEのコア・クラスとインタフェース

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

- Oracle S/MIMEクラスの使用

選択されたメソッドは必要に応じて説明します。

5.3.1 Oracle S/MIMEのコア・クラスとインタフェース

Oracle S/MIME APIは、複数のコア・クラスとインタフェースで構成されます。

この項では、Oracle S/MIMEのAPIのコア・クラスとインタフェースについて説明し、S/MIMEオブジェクト作成および解析の方法を示します。

コア・クラスとインタフェースは、次のとおりです。

- oracle.security.crypto.smime.SmimeObjectインタフェースの使用方法

- oracle.security.crypto.smime.SmimeSignedObjectインタフェースの使用方法

- oracle.security.crypto.smime.SmimeSignedクラスの使用方法

- oracle.security.crypto.smime.SmimeEnvelopedクラスの使用方法

- oracle.security.crypto.smime.SmimeMultipartSignedクラスの使用方法

- oracle.security.crypto.smime.SmimeSignedReceiptクラスの使用方法

- oracle.security.crypto.smime.SmimeCompressedクラスの使用方法

5.3.1.1 oracle.security.crypto.smime.SmimeObjectインタフェースの使用方法

oracle.security.crypto.smime.SmimeObjectインタフェースはS/MIMEオブジェクトを表します。

このインタフェースを実装するクラスを次に示します。

- SmimeSigned

- SmimeEnveloped

- SmimeMultipartSigned

- SmimeSignedReceipt

- SmimeCompressed

このインタフェースのメソッドを次に示します。

String generateContentType ()

このS/MIMEオブジェクトのコンテンツ・タイプ文字列を返します。次に例を示します。

"application/pkcs7-mime; smime-type=signed-data"

String generateContentType (boolean useStandardContentTypes)

引数がtrueの場合は、generateContentType()と同じ値が返されます。falseの場合は、古い形式(Netscape)のコンテンツ・タイプ文字列が返されます。たとえば、application/x-pkcs7-mime; smime-type=signed-dataのようになります。

void writeTo (java.io.OutputStream os, java.lang.String mimeType)

このオブジェクトを指定した出力ストリームに出力します。

5.3.1.2 oracle.security.crypto.smime.SmimeSignedObjectインタフェースの使用方法

oracle.security.crypto.smime.SmimeSignedObjectインタフェースはSmimeObjectを拡張したものであり、SmimeSignedやSmimeMultipartSignedなど、すべてのS/MIME署名付きオブジェクトに共通のメソッドが指定されます。

このインタフェースのメソッドを次に示します。

Vector getCertificates ()

このS/MIMEオブジェクトの署名付きコンテンツに含まれる証明書のリストを返します。

Vector getCRLs ()

S/MIMEオブジェクトの署名付きコンテンツに含まれる証明書失効リストを返します。

javax.mail.internet.MimeBodyPart getEnclosedBodyPart ()

署名付き文書を返します。

oracle.security.crypto.smime.ess.EquivalentLabels getEquivalentLabels
(java.security.cert.X509Certificate signerCert)

存在する場合はEquivalentLabels、存在しない場合はnullを返します。

oracle.security.crypto.smime.ess.ESSSecurityLabel getESSSecurityLabel
(java.security.cert.X509Certificate signerCert)

存在する場合はESSSecurityLabel、存在しない場合はnullを返します。

oracle.security.crypto.smime.ess.MLExpansionHistory getMLExpansionHistory(
java.security.cert.X509Certificate signerCert)

存在する場合はMLExpansionHistory属性、存在しない場合はnullを返します。

oracle.security.crypto.smime.ess.ReceiptRequest getReceiptRequest(
java.security.cert.X509Certificate signerCert)

存在する場合はReceiptRequest属性、存在しない場合はnullを返します。

oracle.security.crypto.smime.ess.SigningCertificate getSigningCertificate(
java.security.cert.X509Certificate signerCert)

SigningCertificateを返します。

void verify (oracle.security.crypto.cert.CertificateTrustPolicy trustPolicy)

正常な場合は、指定された信頼ポリシーに従うと署名付きコンテンツに少なくとも1つの有効な署名が含まれるかどうかを返します。それ以外の場合は、AuthenticationExceptionをスローします。

void verifySignature (java.security.cert.X509Certificate signerCert)

正常な場合は、所定の証明書で検証できる署名が署名付きコンテンツに含まれるかどうかを返します。それ以外の場合は、AuthenticationExceptionをスローします。

所定の証明書に対応する署名が存在しない場合は、メソッドでSignatureExceptionをスローできます。

5.3.1.3 oracle.security.crypto.smime.SmimeSignedクラスの使用方法

oracle.security.crypto.smime.SmimeSignedクラスは、S/MIME署名付きメッセージ(SmimeSignedObjectを実装)を表します。このクラスを使用して、新しいメッセージの構築や既存のメッセージの解析を行うことができます。

コンストラクタとメソッドを次に示します。

SmimeSigned (javax.mail.internet.MimeBodyPart content)

署名するコンテンツについて指定されたMIMEボディ部を使用して、新しいSmimeSignedオブジェクトを作成します。

SmimeSigned ()

空の新しいSmimeSignedオブジェクトを作成します。証明書専用のS/MIMEメッセージを構築する際に、このオブジェクトを使用します。

SmimeSigned (InputStream is)

指定した入力ストリームからエンコーディングを読み取ることで、新しいSmimeSignedオブジェクトを作成します。

void addSignature (java.security.PrivateKey signerKey,
java.security.cert.X509Certificate signerCert,
oracle.security.crypto.core.AlgorithmIdentifier digestAlgID)

指定された秘密鍵、証明書およびメッセージ・ダイジェスト・アルゴリズムを使用して、署名をメッセージに追加します。

void addSignature (java.security.PrivateKey signerKey,
java.security.cert.X509Certificate signerCert,
oracle.security.crypto.core.AlgorithmIdentifier digestAlgID,
java.util.Date timeStamp)

タイムスタンプを含め、署名をメッセージに追加します。

void addSignature (java.security.PrivateKey signerKey,
java.security.cert.X509Certificate signerCert,
oracle.security.crypto.core.AlgorithmIdentifier digestAlgID,
SmimeCapabilities smimeCaps)

S/MIME機能を含め、署名をメッセージに追加します。

javax.mail.internet.MimeBodyPart getEnclosedBodyPart ()

署名付きMIMEボディ部を返します。

新しいメッセージを構築するには、次の3つのコンストラクタのいずれかを使用します。

// Create a new S/MIME Signed Message
SmimeSigned sig = new SmimeSigned();

//         -OR-
// Create a new S/MIME Signed Message with a specified MIME body part
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Hello from SendSignedMsg!");
SmimeSigned sig1 = new SmimeSigned(bp);

//         -OR-
// Create a new S/MIME Signed Message with a specified MIME body part
// and a flag switching compression on or off
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Hello from SendSignedMsg!");
boolean useCompression = true;
SmimeSigned sig2 = new SmimeSigned(bp, useCompression);

メッセージを解析するには、java.io.InputStreamをとるコンストラクタを使用します。

InputStream is = Input stream containing message to be parsed
SmimeSigned sig = new SmimeSigned(is);

5.3.1.4 oracle.security.crypto.smime.SmimeEnvelopedクラスの使用方法

oracle.security.crypto.smime.SmimeEnvelopedクラスは、S/MIMEエンベロープ・メッセージ(SmimeObjectを実装)を表します。新しいメッセージの構築や既存のメッセージの解析に使用できます。

コンストラクタとメソッドを次に示します。

SmimeEnveloped (javax.mail.internet.MimeBodyPart content,
oracle.security.crypto.core.AlgorithmIdentifier contentEncryptionAlgID)

指定されたコンテンツ暗号化アルゴリズムを使用し、指定したMIMEボディ部から新しいSmimeEnvelopedオブジェクトを作成します。

SmimeEnveloped (InputStream is)

指定した入力ストリームからエンコーディングを読み取ることで、新しいSmimeEnvelopedオブジェクトを作成します。

void addRecipient (java.security.cert.X509Certificate cert)

所定の公開鍵証明書を使用して受信者へのメッセージを暗号化します。

byte[] getEncryptedContent ()

復号化せずにコンテンツを返します。

javax.mail.internet.MimeBodyPart getEnclosedBodyPart (
java.security.PrivateKey recipientKey,
java.security.cert.X509Certificate recipientCert)

所定の受信者秘密鍵を使用して復号化した後に、recipientCertで指定された受信者のMIMEボディ部を返します。

次のコードを使用して新しいメッセージを構築します。

// Create a new S/MIME Enveloped Message with a specified MIME body part and a specified content
// encryption algorithm
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Hello from SendSignedMsg!");
AlgorithmIdentifier algId = AlgID.aes256_CBC;
SmimeEnveloped env = new SmimeEnveloped(bp, algId);

メッセージを解析するには、java.io.InputStreamをとるコンストラクタを使用します。

InputStream is = Input stream containing message to be parsed
SmimeEnveloped env = new SmimeEnveloped(is);

5.3.1.5 oracle.security.crypto.smime.SmimeMultipartSignedクラスの使用方法

oracle.security.crypto.smime.SmimeMultipartSignedクラスはS/MIMEマルチパート署名付きメッセージを表します。マルチパート署名付きメッセージは、MIMEに対応しない電子メール・クライアント向けです。このクラスは、新しいメッセージの構築や既存のメッセージの解析に使用できます。

コンストラクタとメソッドを次に示します。

SmimeMultipartSigned (javax.mail.internet.MimeBodyPart bodyPart,
oracle.security.crypto.core.AlgorithmIdentifier digestAlgID)

指定したMIMEボディ部とメッセージ・ダイジェスト・アルゴリズムを使用して新しいSmimeMultipartSignedメッセージを作成します。

void addBodyPart (javax.mail.BodyPart part)

javax.mail.Multipartから継承して、指定したボディ部をこのSmimeMultipartSignedオブジェクトに追加します。(詳細は、http://www.oracle.com/technetwork/java/index-138643.htmlにあるjavax.mail APIドキュメントを参照してください。)

void addSignature (java.security.PrivateKey signerKey,
java.security.cert.X509Certificate signerCert)

指定した秘密鍵および証明書を使用して、署名をメッセージに追加します。

void addSignature (java.security.PrivateKey signerKey,
java.security.cert.X509Certificate signerCert, java.util.Date timeStamp)

指定した秘密鍵、証明書およびタイムスタンプを使用して、署名をメッセージに追加します。

void addSignature (java.security.PrivateKey signerKey,
java.security.cert.X509Certificate signerCert, java.util.Date timeStamp,
SmimeCapabilities smimeCaps)

指定した秘密鍵、証明書およびS/MIME機能を使用して、署名をメッセージに追加します。

javax.mail.internet.MimeBodyPart getEnclosedBodyPart ()

署名付きMIMEボディ部を返します。

次のコードを使用して新しいメッセージを構築します。

// Create a new S/MIME Multipart Signed Message with a specified
// MIME body part and a specified digest algorithm
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Hello from SendSignedMsg!");
AlgorithmIdentifier algId = AlgID.sha1;
SmimeMutlipartSigned sig = new SmimeMultipartSigned(bp, algId);

メッセージを解析するには、javax.activation.DataSourceをとるコンストラクタを使用します。

DataSource ds = Data source containing message to be parsed
SmimeMultipartSigned sig = new SmimeMultipartSigned(ds);

5.3.1.6 oracle.security.crypto.smime.SmimeSignedReceiptクラスの使用方法

oracle.security.crypto.smime.SmimeSignedReceiptクラスは、S/MIMEのラップされた署名付き通知を表します。このクラスを使用して、新しいメッセージの構築や既存のメッセージの解析を行うことができます。

新しいメッセージを構築するには、次の4つのコンストラクタのいずれかを使用します。

// Create a new S/MIME wrapped and signed receipt with the specified receipt,
// the specified digest of the message's signed attributes
// and the addresses of the receipt recipients
ESSReceipt receipt = ESS receipt to include in message
byte [] msgSigDigest = Digest of signed attributes to be included in message
Address [] addresses = Addresses of receipt recipients
SmimeSignedReceipt sig = new SmimeSigned(receipt, msgSigDigest, addresses);

//         -OR-
// Create a new S/MIME wrapped and signed receipt
// with a specified S/MIME Signed Message containing the receipt
SmimeSignedObject sso = S/MIME signed message containing receipt
SmimeSignedReceipt sig1 = new SmimeSignedReceipt(sso);

//         -OR-
// Create a new S/MIME wrapped and signed receipt with a
// specified S/MIME Signed Message containing the receipt,
// the signer's certificate and the addresses of the receipt recipients
SmimeSignedObject sso1 = S/MIME signed message containing receipt
X509Certificate signerCert = The message signer's certificate
Address [] addresses1 = Addresses of receipt recipients
SmimeSignedReceipt sig2 = new SmimeSignedReceipt(sso1, signerCert, addresses1);

//         -OR-

// Create a new S/MIME wrapped and signed receipt with a
// specified S/MIME Signed Message containing the receipt,
// the signer's certificate, the addresses of the receipt recipients and
// a specified MLExpansionHistory attribute.
SmimeSignedObject sso1 = S/MIME signed message containing receipt
X509Certificate signerCert = The message signer's certificate
Address [] addresses1 = Addresses of receipt recipients
MLExpansionHistory mlExpansionHistory = The MLExpansionHistory attribute
SmimeSignedReceipt sig2 =
new SmimeSignedReceipt(sso1, signerCert, addresses1, mlExpansionHistory);

メッセージを解析するには、java.io.InputStreamをとるコンストラクタを使用します。

InputStream is = Input stream containing message to be parsed
SmimeSignedReceipt sig = new SmimeSignedReceipt(is);

5.3.1.7 oracle.security.crypto.smime.SmimeCompressedクラスの使用方法

oracle.security.crypto.smime.SmimeCompressedクラスは、RFC 3274に定義されているS/MIME圧縮メッセージを表します。このクラスは、新しいメッセージの構築や既存のメッセージの解析に使用できます。

注意:

RFC 3274へのリンクは、「リファレンス」を参照してください。

次のコードを使用して新しいメッセージを構築します。

// Create a new S/MIME Compressed Message with a specified MIME body part
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Hello from SendSignedMsg!");
SmimeCompressed comp = new SmimeCompressed(bp);

//           -OR-
// Create a new S/MIME Compressed Message with a specified MIME body part
// and a specified compression algorithm
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Hello from SendSignedMsg!");
AlgorithmIdentifier algId = Smime.id_alg_zlibCompress;
SmimeCompressed comp = new SmimeCompressed(bp, algId);

メッセージを解析するには、java.io.InputStreamをとるコンストラクタを使用します。

InputStream is = Input stream containing message to be parsed
SmimeCompressed comp1 = new SmimeCompressed(is);

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

Oracle S/MIMEには、アルゴリズム識別子、コンテンツ・タイプ識別子、属性識別子などの定数を定義するサポート・インタフェースが含まれています。静的なユーティリティ・メソッドを備え、署名付きS/MIMEオブジェクトの署名を検証し、S/MIMEオブジェクトの機能をカプセル化するサポート・クラスが含まれています。

この項では、Oracle S/MIMEのサポート・クラスとインタフェースについて説明します。

5.3.2.1 oracle.security.crypto.smime.Smimeインタフェースの使用方法

oracle.security.crypto.smime.Smimeインタフェースでは、アルゴリズム識別子、コンテンツ・タイプ識別子および属性識別子などの定数が定義されます。

5.3.2.2 oracle.security.crypto.smime.SmimeUtilsクラスの使用方法

oracle.security.crypto.smime.SmimeUtilsクラスには、静的なユーティリティ・メソッドが含まれます。

このクラスのメソッドを次に示します。

public static FileDataSource createFileDataSource (File file,
String contentTypeHeader)
public static FileDataSource createFileDataSource (String name,
String contentTypeHeader)

マルチパートまたはマルチパート署名付きS/MIMEタイプを透過的に処理するには、javax.activation.FileDataSourceを直接インスタンス化するかわりに、これらのメソッドを使用します。

注意:

JAF 1.0.1に含まれるデフォルトのjavax.activation.FileDataSourceは、Javamail 1.1.xと一緒に使用すると、マルチパートMIME境界を処理しません。

5.3.2.3 oracle.security.crypto.smime.MailTrustPolicyクラスの使用方法

oracle.security.crypto.smime.MailTrustPolicyクラスは、署名付きS/MIMEオブジェクトの署名を検証するために使用される証明書信頼ポリシー(oracle.security.crypto.cert.CertificateTrustPolicy)を実装します。

5.3.2.4 oracle.security.crypto.smime.SmimeCapabilitiesクラスの使用方法

oracle.security.crypto.smime.SmimeCapabilitiesクラスは、サポートされる暗号化アルゴリズムなど、S/MIMEオブジェクトの一連の機能をカプセル化します。

このクラスの有用なメソッドを次に示します。

void addCapability(oracle.security.crypto.asn1.ASN1ObjectID capabilityID)

指定したオブジェクトIDの機能を、このS/MIME機能のセットに追加します。

5.3.2.5 oracle.security.crypto.smime.SmimeDataContentHandlerクラスの使用方法

oracle.security.crypto.smime.SmimeDataContentHandlerクラスは、S/MIMEコンテンツ・タイプにDataContentHandlerを提供します。これはjavax.activation.DataContentHandlerを実装します。

5.3.2.6 oracle.security.crypto.smime.essパッケージの使用方法

oracle.security.crypto.smime.essパッケージには、次のクラスが含まれます。

表5-1 oracle.security.crypto.smime.essパッケージのクラス

クラス

説明

ContentHints

コンテンツのヒント

ContentReference

コンテンツのリファレンス

EquivalentLabels

ESSのEquivalentLabels

ESSSecurityLabel

ESSのセキュリティ・ラベル

MLData

MLExpansionHistory属性で使用されるMLData要素を表します。

MLExpansionHistory

メーリング・リスト拡張履歴

ReceiptRequest

ESSの通知リクエスト

ReceiptRequest.AllOrFirstTier

AllOrFirstTierは、ReceiptRequestのReceiptsFromフィールドの一部です。

SigningCertificate

ESSの署名証明書。

5.3.3 Oracle S/MIMEクラスの使用

Oracle S/MIME SDKを使用して、マルチパート署名付きメッセージの操作、メッセージの署名と署名付きメッセージの認証、デジタル・エンベロープの作成とオープン、および拡張セキュリティ・サービス(ESS)の実装を行うことができます。

内容は次のとおりです。

- 抽象クラスSmimeObjectの使用

- メッセージの署名

- マルチパート署名付きエンティティの作成

- デジタル・エンベロープの作成

- 証明書専用メッセージの作成

- メッセージの読取り

- 署名付きメッセージの認証

- デジタル・エンベロープ(暗号化されたメッセージ)のオープン

- 拡張セキュリティ・サービス(ESS)の追加

5.3.3.1 抽象クラスSmimeObjectの使用

SmimeObjectは、基本的なS/MIMEメッセージ・コンテンツ・エンティティを表す抽象クラスです。SmimeObjectのサブクラスに含まれるのは、次のとおりです。

- SmimeSigned

- SmimeEnveloped

- SmimeMultipartSigned

- SmimeSignedReceipt, and

- SmimeCompressed

SmimeObject実装の特徴の1つは、自身のMIMEタイプがわかることです。つまり、これによりgenerateContentTypeメソッドが実装されます。したがって、MIMEメッセージまたはボディ部の中にこのオブジェクトを配置する方法は、SmimeSignedの例で説明した方法と同様です。

1. オブジェクトを作成します。

2. そのオブジェクトでgenerateContentTypeを呼び出して、MIMEタイプを取得します。

3. 生成されたコンテンツ・タイプとオブジェクトを一緒に、MimeMessageオブジェクトまたはMimeBodyPartオブジェクトのsetContentメソッドに渡します。

SmimeObjectクラスでは、ブール値のパラメータをとる、別のバージョンのgenerateContentTypeメソッドが提供されます。パラメータとしてtrueを指定すると、generateContentTypeの動作は引数がない場合とまったく同じになります。パラメータとしてfalseを指定すると、generateContentTypeは、特定のメール・クライアント(Netscape Communicator 4.0.4など)で必要な古いMIMEタイプを返します。具体的には、次のようになります。

- application/pkcs7-mimeはapplication/x-pkcs7-mimeになります。

- application/pkcs7-signatureはapplication/x-pkcs7-signatureになります。

5.3.3.2 メッセージの署名

次の手順を実行して、署名付きメッセージまたは署名付きMIMEボディ部を作成します。

1. 署名するコンテンツを含むMimeBodyPartのインスタンスを準備します。このボディ部には、必要に応じて任意のコンテンツ・タイプを使用できます。次の例では、text/plainのボディ部を作成します。

MimeBodyPart doc = new MimeBodyPart();
doc.setText("Example signed message.");

2. 前に作成したMimeBodyPartを引数とするコンストラクタを使用して、SmimeSignedのインスタンスを作成します。

SmimeSigned sig = new SmimeSigned (doc);

3. 必要なすべての署名を追加します。署名ごとに、秘密鍵、対応する公開鍵の証明書、およびメッセージ・ダイジェスト・アルゴリズムを指定する必要があります。次に例を示します。

sig.addSignature (signatureKey, signatureCert, AlgID.sha1);

この例では、SHA-1メッセージ・ダイジェスト・アルゴリズムを指定しました。かわりに、引数としてAlgID.md5を渡してMD5アルゴリズムを指定することもできます。

4. 状況に応じてMimeMessageまたはMimeBodyPartにSmimeSignedObjectを配置します。次に例を示します。

MimeMessage m = new MimeMessage();
m.setContent (sig, sig.generateContentType());

または

MimeBodyPart bp = new MimeBodyPart();
bp.setContent (sig, sig.generateContentType());

これらの例で使用されるgenerateContentTypeメソッドは、オブジェクトの適切なMIMEタイプを特定する文字列を返します。この場合は、次のようになります。

application/pkcs7-mime; smime-type=signed-data

このようにシンプルな手順を実行することで、MIMEメッセージの転送、S/MIMEコンテンツを含むボディ部のMIMEマルチパート・オブジェクトへの配置、またはこれらのオブジェクトに対応するその他の操作が可能になります。詳細は、JavaMail APIを参照してください。

5.3.3.3 マルチパート署名付きエンティティの作成

SmimeMultipartSignedクラスは、署名付きメッセージを作成するもう1つの方法を提供します。このようなメッセージでは、application/pkcs7-mimeではなく、multipart/signed MIMEタイプが使用されます。利点は、結果として生成されるメッセージのコンテンツを、MIMEに対応しないメール・クライアントで読み取れることですが、そのようなクライアントでは署名の検証はできません。

マルチパート署名付きメッセージの作成は、署名付きメッセージの作成とは少し異なります。たとえば、マルチパート署名付きテキスト・メッセージを送信するには、次のようにします。

// create the content text as a MIME body part
MimeBodyPart bp = new MimeBodyPart();
bp.setText("Example multipart/signed message.");
// the constructor takes the signature algorithm
SmimeMultipartSigned sig = new SmimeMultipartSigned(bp, AlgID.sha1);
// sign the content
sig.addSignature(signerKey, signerCert);
// place the content in a MIME message
MimeMessage msg = new MimeMessage();
msg.setContent(sig, sig.generateContentType());

SmimeMultipartSignedコンストラクタにメッセージ・ダイジェストを指定する理由は、application/pkcs7-mime署名付きデータ・オブジェクトの場合とは異なり、マルチパート署名付きメッセージではすべての署名が同じメッセージ・ダイジェスト・アルゴリズムを使用する必要があるためです。

generateContentTypeメソッドは次の文字列を返します。

multipart/signed; protocol="application/pkcs7-signature"

5.3.3.4 デジタル・エンベロープの作成

S/MIMEデジタル・エンベロープ(暗号化されたメッセージ)は、SmimeEnvelopedクラスによって表されます。これは、対称暗号化アルゴリズム(Triple-DesやRC2など)とランダムに生成されたセッション鍵でMIMEボディ部を暗号化し、対象の各メッセージ受信者ごとにセッション鍵をRSA公開鍵で暗号化することで形成される、MIMEエンティティです。

次の例では、docは、SmimeEnvelopedのインスタンスにラップされるMimeBodyPartのインスタンスです。recipientCertは受信者の証明書です。

SmimeEnveloped env = new SmimeEnveloped(doc, Smime.dES_EDE3_CBC);
env.addRecipient (recipientCert);

addRecipientを繰り返してコールすることで、任意の数のエンベロープ受信者を追加できます。

5.3.3.5 証明書専用メッセージの作成

コンテンツも署名も含まず、証明書またはCRL(あるいはその両方)のみを含むS/MIME署名付きデータ・オブジェクトを作成できます。このようなエンティティは、証明書転送メカニズムとして使用できます。次のように特殊なコンテンツ・タイプが使用されます。

application/pkcs7-mime; smime-type=certs-only

次の例に、signed-dataオブジェクトの作成方法を示します。

X509Certificate cert1, cert2;
SmimeSigned certBag = new SmimeSigned();
certBag.addCertificate(cert1);
certBag.addCertificate(cert2);

これで、certBagを適切なsetContentメソッドに渡すことができます。generateContentTypeがcertBagで呼び出されると、smime-typeパラメータに正しいcerts-only値を含むコンテンツ・タイプを自動的に返します。

5.3.3.6 メッセージの読取り

JavaオブジェクトをMIMEエンティティから抽出するためのJavaMail APIの基本的な方法は、MimePartのインスタンスでgetContent()メソッドを呼び出すことであり、MimePartは、MIMEエンティティをモデルとするインタフェースで、MimeMesageクラスおよびMimeBodyPartクラスによって実装されます。

getContentメソッドは、現在インストールされているデフォルトのコマンド・マップ(JavaBeans Activities Frameworkに含まれる)を調べて、所定のMIMEタイプに対応するデータ・コンテンツ・ハンドラを検索します。このハンドラで、MIMEエンティティのコンテンツが適切なクラスのJavaオブジェクトに変換されます。

ディストリビューションで提供されているmailcapファイルを使用すると、SmimeDataContentHandlerクラスをインストールすることができます。これは、次のタイプのデータ・コンテンツ・ハンドラとして利用できます。

コンテンツ・タイプ

返されるインスタンス

application/pkcs7-mime

SmimeSignedまたはSmime Enveloped

application/pkcs7-signature

SmimeSigned

application/pkcs10

oracle.security.crypto.cert.CertificateRequest

multipart/signed

SmimeMultipartSigned

5.3.3.7 署名付きメッセージの認証

SmimeSignedまたはSmimeMutlipartSignedのインスタンスをgetContent()から取得すると、添付された署名を検証することになります。署名の検証に使用できるオプションを示すためには、S/MIME署名付きメッセージの構造を説明する必要があります。

署名付きS/MIMEメッセージのコンテンツは、SignedDataタイプのCMSオブジェクトです。このようなオブジェクトには、コンテンツ(署名の適用対象の文書)があり、これは、MIMEエンティティのテキスト・エンコーディングです。また、0個以上の署名を含み、さらにオプションで一連の証明書またはCRL (あるいはその両方)を含みます。受信側は署名を検証するためにこれらを使用できます。

SmimeSignedクラスおよびSmimeMultipartSignedクラスは、この情報のすべてをカプセル化します。verifyingSignatureとverifyという2つの認証方式が提供されます。

署名者が添付した証明書またはCRLを無視し、すでに所有している証明書を使用して特定の署名を検証するには、verifySignatureを使用します。次に例を示します。

SmimeSignedObject sig =
(SmimeSignedObject)msg.getContent(); // msg is a Message
sig.verifySignature(cert, msg.getFrom()); // cert is an X509Certificate object

検証が失敗すると、verifySignatureメソッドはSignatureExceptionまたはAuthenticationExceptionをスローします。それ以外の場合は正常に値を返します。

コンテンツに少なくとも1つの有効な署名が含まれること、すなわち有効な証明連鎖(信頼できるルートCAから始まり、署名を生成した秘密鍵の証明書で終了する)が存在することを検証するにはverifyを使用します。このメソッドは、証明連鎖に従うために添付された証明書およびCRLを活用します。

たとえば、信頼できる認証局(CA)の証明書がすでにある場合は、次のようにします。

TrustedCAPolicy trusts = new TrustedCAPolicy();
// if true, need CRL for each cert in chain
trusts.setRequireCRLs(false);
// caCert is an X509Certificate object with CA cert
trusts.addTrustedCA(caCert);
SmimeSignedObject sig = (SmimeSignedObject)msg.getContent();
sig.verify(trusts, msg.getFrom());

署名が検証できない場合は、verifySignatureと同様に、verifyはAuthenticationExceptionをスローし、それ以外の場合は正常に値を返します。どちらの場合も、次のようにgetEnclosedBodyPart()を呼び出して、署名付き文書(MIMEエンティティ)を復元できます。

MimeBodyPart doc = sig.getEnclosedBodyPart();

5.3.3.8 デジタル・エンベロープ(暗号化されたメッセージ)のオープン

S/MIMEデジタル・エンベロープの構成内容は次のとおりです。

- 保護されているMIMEボディ部。対称鍵アルゴリズム(DESまたはRC2など)で暗号化されています。

- ランダムに生成されたコンテンツ暗号鍵。

- 1名以上の受信者がコンテンツを復号化するための情報。

各受信者ごとに、この情報はコンテンツ暗号鍵で構成されます。この鍵は受信者の公開鍵で暗号化されています。

SmimeEnvelopedオブジェクトから暗号化されたコンテンツを取得するには、受信者の秘密鍵とそれに対応する証明書が必要です。証明書は、エンベロープのデータ構造体に含まれる受信者情報表の索引として使用されます。

次に例を示します。

SmimeEnveloped env = (SmimeEnveloped)msg.getContent();
MimeBodyPart mbp = env.getEnclosedBodyPart(privKey, cert)
// privKey is a PrivateKey object
// cert is an X509Certificate object

秘密鍵と証明書をgetEnclosedBodyPartメソッドに渡すと、復号化されたコンテンツがMimeBodyPartのインスタンスとして返されます。

ここで、getContentメソッドをMimeBodyPartオブジェクトで呼び出して、(復号化された)コンテンツを取り出すことができます。このコンテンツは、String(暗号化されたテキスト・メッセージの場合)またはSmimeSignedなどその他のオブジェクトです。

5.3.3.9 拡張セキュリティ・サービス(ESS)の追加

ESSサービスのReceiptRequests、SecurityLabelsおよびSigningCertificatesをS/MIME署名付きメッセージに追加する場合は、それらを署名のsignedAttributesに追加します。

// Create a Signed Message
SmimeSigned sig = new SmimeSigned();
AttributeSet signedAttributes = new AttributeSet();

5.3.3.9.1 ESSを使用した署名付き通知のリクエスト

oracle.security.crypto.smime.ess.ReceiptRequestは通知リクエスト・サービスをサポートします。

メッセージの受信者から署名付き通知をリクエストするには、署名を追加する際にreceiptRequest属性をsignedAttributesフィールドに追加します。

ReceiptRequest rr = new ReceiptRequest();
.........
signedAttributes.addAttribute(Smime.id_aa_receiptRequest, rr);

5.3.3.9.2 ESSを使用したセキュリティ・ラベルの添付

oracle.security.crypto.smime.ess.ESSSecurityLabelはセキュリティ・ラベル・サービスを提供します。

メッセージにセキュリティ・ラベルを添付するには、署名を追加する際にESSSecurityLabel属性をsignedAttributesフィールドに追加します。

ESSSecurityLabel sl = new ESSSecurityLabel();
.........
signedAttributes.addAttribute(Smime.id_aa_securityLabel, sl);

5.3.3.9.3 ESSを使用した署名証明書の添付

oracle.security.crypto.smime.ess.SigningCertificateを使用して署名証明書を添付できます。

メッセージに署名証明書を添付するには、署名を追加する際にSigningCertificate属性をsignedAttributesフィールドに追加します。

SigningCertificate sc = new SigningCertificate();
.........
signedAttributes.addAttribute(Smime.id_aa_signingCertificate, sc);

署名を追加する際にsignedAttributesを使用します。

sig.addSignature(signerKey, signerCert, digestAlgID, signedAttributes);

ESS署名付き通知は、oracle.security.crypto.smimeパッケージのSmimeSignedReceiptクラスを使用して生成されます。これは、SmimeSignedクラスを使用する方法と似ていますが、署名されるコンテンツがoracle.security.crypto.cms.ESSReceiptオブジェクトである点が異なります。

5.3.3.10 拡張セキュリティ・サービス(ESS)の処理

S/MIME署名付き通知により、データ・コンテンツ・ハンドラが通知を認識できるよう、コンテンツ・タイプ・パラメータが正しく設定されています。コンテンツ・タイプ・パラメータがない場合、署名付き通知は署名付きメッセージとして処理されます。

5.4 Oracle S/MIMEのJava APIリファレンス

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

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

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

6 Oracle PKI SDK

公開鍵インフラストラクチャ(PKI)は、インターネット上で情報を交換する場合に信頼レベルを向上させるためのセキュリティ・アーキテクチャです。Oracle PKI SDKは、PKI対応アプリケーションを開発するためのPKI、LDAPおよびtimestamp関数のパッケージを提供します。

PKI機能およびOracle PKIの様々なサブパッケージについて説明します。

- Oracle PKI CMP SDK

- Oracle PKI OCSP SDK

- Oracle PKI TSP SDK

- Oracle PKI LDAP SDK

6.1 Oracle PKI CMP SDK

Certificate Management Protocol (CMP)に対応するOracle公開鍵インフラストラクチャ(PKI)のSoftware Development Kit (SDK)を使用できます。Java開発者は、Oracle PKI CMP SDKを使用して、証明書の発行や更新、CRLの作成や公開、鍵リカバリ機能の提供といった証明書管理機能を迅速に実装できます。

- Oracle PKI CMP SDKの機能と利点

- Oracle PKI CMP SDKの環境設定

- Oracle PKI CMP SDKのJava APIリファレンス

6.1.1 Oracle PKI CMP SDKの機能と利点

Oracle PKI CMP SDKは、RFC 2510に指定されているCertificate Management Protocol (CMP)と、RFC 2511に指定されている証明書要求メッセージ・フォーマット(CRMF)を実装するパッケージを提供します。

Oracle PKI CMP SDKの特徴と機能は次のとおりです。

- Oracle PKI CMP SDKはRFC 2510に準拠し、このCertificate Management Protocol(CMP)仕様に準拠する他の製品と互換性があります。RFC 2510では、証明書の作成と管理のあらゆる処理に対してプロトコル・メッセージが定義されています。

- また、Oracle PKI CMP SDKは、RFC 2511にも準拠し、この証明書要求メッセージ・フォーマット(CRMF)仕様に準拠する他の製品と互換性があります。RFC 2511では、X.509証明書リクエストを認証局(CA)に伝えるために使用される証明書要求メッセージ・フォーマット(CRMF)が指定されています。

Oracle PKI CMP SDKのツールキットには、次のパッケージが含まれます。

- oracle.security.crypto.cmpパッケージは、RFC 2510に指定されているCertificate Management Protocol (CMP)と、RFC 2511に指定されている証明書要求メッセージ・フォーマット(CRMF)を実装するクラスを提供します。

- oracle.security.crypto.cmp.attributeパッケージは、登録の管理、登録情報および一般情報のための属性クラスを提供します。このパッケージには、次のクラスとサブクラスが含まれます。

- RegistrationControl

- RegistrationInfo

- InfoTypeAndValue(oracle.security.crypto.cert.AttributeTypeAndValueを拡張します)

- oracle.security.crypto.cmp.transportパッケージは、CMPおよびCRMF転送プロトコルのためのクラスを提供します。TCPMessageクラスとそれ固有のメッセージタイプ・サブクラスが含まれます。

6.1.2 Oracle PKI CMP SDKの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。Oracle PKI CMP SDKを使用するには、システムにJava Development Kit(JDK)バージョン1.6以上が必要です。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

- osdt_cms.jar

- osdt_cmp.jar

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

%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cms.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cmp.jar

関連項目:

CLASSPATH環境変数の設定

6.1.3 Oracle PKI CMP SDKのJava APIリファレンス

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

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

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

6.2 Oracle PKI OCSP SDK

Java開発者は、Oracle PKI OCSP SDKを使用して、RFC 2560仕様に準拠するオンライン証明書ステータス・プロトコル(OCSP)対応クライアント・アプリケーションおよびOCSPレスポンダを迅速に開発できます。

この項では、次の項目について説明します。

- Oracle PKI OCSP SDKの機能と利点

- Oracle PKI OCSP SDKの環境設定

- Oracle PKI OCSP SDKのJava APIリファレンス

6.2.1 Oracle PKI OCSP SDKの機能と利点

Oracle PKI OCSP SDKはRFC 2560仕様に準拠します。OCSPリクエスト・メッセージとレスポンスを構成するためのクラスとメソッド、およびOCSPサーバー実装が提供されます。

Oracle PKI OCSP SDKの特徴と機能は次のとおりです。

- Oracle PKI OCSP SDKは、RFC 2560に準拠し、この仕様に準拠する他の製品(Valicert社のValidation Authorityなど)と互換性があります。RFC 2560では、CRLを必要とせずにデジタル証明書の現在のステータスを判別できるプロトコルが指定されます。

- Oracle PKI OCSP SDK APIでは、OCSPリクエスト・メッセージを構成するためのクラスとメソッドが提供されます。このメッセージは、HTTPを介してRFC 2560に準拠する任意の検証局に送信できます。

- Oracle PKI OCSP SDK APIでは、OCSPリクエスト・メッセージのレスポンスを構成するためのクラスとメソッドが提供されます。また、発行した証明書の有効性をチェックするための独自のOCSPサーバーを開発する基礎として使用可能なOCSPサーバー実装が提供されます。

6.2.2 Oracle PKI OCSP SDKの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。Oracle PKI OCSP SDKを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。また、PATH環境変数にJava binディレクトリが指定されていることを確認してください。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

- osdt_ocsp.jar

次に例を示します。

setenv CLASSPATH $CLASSPATH:$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar:
$ORACLE_HOMEmodules/oracle.osdt_11.1.1/osdt_cert.jar:
$ORACLE_HOMEmodules/oracle.osdt_11.1.1/osdt_ocsp.jar

関連項目:

CLASSPATH環境変数の設定

6.2.3 Oracle PKI OCSP SDKのJava APIリファレンス

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

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

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

6.3 Oracle PKI TSP SDK

Java開発者は、Oracle PKI TSP SDKを使用して、公開鍵インフラストラクチャ(PKI)フレームワークにタイムスタンプ機能を迅速に実装できます。

この項では、次の項目について説明します。

- Oracle PKI TSP SDKの機能と利点

- Oracle PKI TSP SDKの環境設定

- Oracle PKI TSP SDKのJava APIリファレンス

6.3.1 Oracle PKI TSP SDKの機能と利点

Oracle PKI TSP SDKはRFC 3161に準拠し、このタイムスタンプ・プロトコル(TSP)仕様に準拠する他の製品と互換性があります。TSPリクエスト・メッセージをテストするため、または独自のタイムスタンプ・サービスを開発する基礎として使用できるTSAサーバーのサンプル実装が提供されます。

Oracle PKI TSP SDKには、次のクラスとインタフェースが含まれます。

表6-1 Oracle PKI TSP SDKのクラスとインタフェース

クラス名またはインタフェース名

説明

TSPインタフェース

タイムスタンプ・プロトコル(TSP)に関連する様々な定数の定義。

HttpTSPRequestクラス

HTTPでのTSPリクエスト・メッセージの実装。

HttpTSPResponseクラス

HTTPでのTSPレスポンス・メッセージの実装。

MessageImprintクラス

このクラスは、RFC 3161に定義されているMessageImprintオブジェクトを表します。

TSAPolicyIDクラス

このクラスは、RFC 3161に定義されているTSAPolicyIDオブジェクトを表します。

TSPContentHandlerFactoryクラス

HTTPでのTSPのコンテンツ・ハンドラ。

TSPMessageクラス

TSPメッセージ。

TSPTimeStampReqクラス

RFC 3161で定義されているタイプTimeStampReqのTSPメッセージ。

TSPTimeStampRespクラス

RFC 3161で定義されているタイプTimeStampRespのTSPメッセージ。

TSPUtilsクラス

oracle.security.crypto.tspパッケージの様々なユーティリティ・メソッドの定義。

6.3.2 Oracle PKI TSP SDKの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。Oracle PKI TSP SDKを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。また、PATH環境変数にJava binディレクトリが指定されていることを確認してください。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

- osdt_cms.jar

- osdt_cmp.jar

- osdt_tsp.jar

次に例を示します。

setenv CLASSPATH $CLASSPATH:$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cert.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cms.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cmp.jar;
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_tsp.jar

関連項目:

CLASSPATH環境変数の設定

6.3.3 Oracle PKI TSP SDKのJava APIリファレンス

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

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

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

6.4 Oracle PKI LDAP SDK

Java開発者は、Oracle PKI LDAP SDKを使用して、ディレクトリ・サーバーでのデジタル証明書の公開と取得に関連する操作を迅速に実装できます。

この項では、次の項目について説明します。

- Oracle PKI LDAP SDKの機能と利点

- Oracle PKI LDAP SDKの環境設定

- Oracle PKI LDAP SDKのJava APIリファレンス

6.4.1 Oracle PKI LDAP SDKの機能と利点

Oracle PKI LDAP SDKでは、LDAPディレクトリ内のデジタル証明書のアクセス、検証および管理を行うためのクラスとメソッドが提供されます。

Oracle PKI LDAP SDKでは、LDAPディレクトリ内のデジタル証明書にアクセスする機能が提供されます。Oracle PKI LDAP SDKを使用して実行できるタスクの一部を次に示します。

- LDAPディレクトリにあるユーザーの証明書の検証

- LDAPディレクトリへの証明書の追加

- LDAPディレクトリからの証明書の取出し

- LDAPディレクトリからの証明書の削除

oracle.security.crypto.LDAPパッケージには、次の2つのクラスが含まれます。

- LDAPCertificateValidatorは、ユーザーの証明書がサブジェクトのLDAPディレクトリ・エントリにあるかどうかを確認することで、証明書の検証を行います。

- LDAPUtilsは、サブジェクトのLDAPディレクトリ・エントリでの証明書の追加、取得および削除を行うメソッドのコレクションです。

6.4.2 Oracle PKI LDAP SDKの環境設定

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOMEにインストールされます。システムにJava Development Kit (JDK)バージョン1.6以上とOracleのJava Naming and Directory Interface (JNDI)バージョン1.2.1以上が必要です。CLASSPATH環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。

Oracle PKI LDAP SDKを使用するためには、システムに次のソフトウェアが必要です。

- Java Development Kit (JDK)バージョン1.6以上。PATH環境変数にJava binディレクトリが追加されていることも確認してください。

- OracleのJava Naming and Directory Interface (JNDI)バージョン1.2.1以上。すべてのJNDI jarファイルをCLASSPATHに追加する必要があります。

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

- osdt_ldap.jar

- jndi.jar、ldapbp.jar、ldap.jar、jaas.jarおよびproviderutil.jar (OracleのJava Naming and Directory Interface (JNDI))

次に例を示します。

%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_ldap.jar;

関連項目:

CLASSPATH環境変数の設定

6.4.3 Oracle PKI LDAP SDKのJava APIリファレンス

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

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

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

7 Oracle XML Security

XMLセキュリティとは、XML文書の標準セキュリティ要件(機密保持、整合性、メッセージの認証、否認防止など)を意味します。環境を設定してOracle XML Securityを使用することにより、XMLドキュメントのこのようなセキュリティ要件を満たすことができます。

XML文書のためのデジタル署名と暗号化の規格のニーズが高まったため、W3Cは、XML署名規格およびXML暗号化規格を提唱しています。

Oracle XML Securityの機能と実装するコード例を扱います。

- Oracle XML Securityの機能と利点

- Oracle XML Securityの環境設定

- Oracle XML Securityを使用したデータの署名

- XMLデータの検証

- データの暗号化方法の理解

- Oracle XML Securityを使用したデータの復号化の理解

- OSDT XML APIでの要素ラッパーの理解および使用方法

- Oracle XML Security APIを使用したデータの署名

- Oracle XML Security APIを使用した署名の検証

- Oracle XML Security APIを使用したデータの暗号化

- Oracle XML Security APIを使用したデータの復号化

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

- Oracle XML Securityのベスト・プラクティス

- Oracle XML SecurityのJava APIリファレンス

関連項目:

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

- XML署名のW3C勧告

- XML暗号化のW3C勧告

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

7.1 Oracle XML Securityの機能と利点

Oracleセキュリティ開発ツールでは、XML Signature仕様およびXML Encryption仕様の完全な実装が提供され、署名アルゴリズム、ダイジェスト・アルゴリズム、データ暗号化アルゴリズム、鍵暗号化アルゴリズムと鍵ラップ・アルゴリズムおよび変換がサポートされています。

サポートされているアルゴリズムは次のとおりです。

署名アルゴリズム

- DSA-SHA1

- RSA-SHA1

- HMAC-SHA1

ダイジェスト・アルゴリズム

- MD5

- SHA1

- SHA256

- SHA512

変換

- Canonicalization - Canonical XML 1.0、Canonical XML 1.1、Exclusive Canonical XML 1.0(すべての形式はコメントありおよびコメントなしでサポートされます)

- XSLT

- XPath Filter

- XPath Filter 2.0

- Base64 Decode

- Enveloped Signature

- Decrypt Transform

データ暗号化アルゴリズム

- AES-128 (CBCモード)

- AES-192 (CBCモード)

- AES-256 (CBCモード)

- DES EDE (CBCモード)

鍵暗号化アルゴリズムと鍵ラップ・アルゴリズム

- MGF1使用のRSAES-OAEP-ENCRYPT

- RSAES-PKCS1-v1_5

- AES-128鍵ラップ

- AES-192鍵ラップ

- AES-256鍵ラップ

- DES-EDE鍵ラップ

7.2 Oracle XML Securityの環境設定

Oracle XML Securityの環境を設定するには、Oracleセキュリティ開発ツールとJDKをインストールし、jarファイルのCLASSPATH変数を設定します。

Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOME/modules/oracle.osdt_11.1.1にインストールされます。

システム要件

Oracle XML Securityを使用するには、JDK 5以上が必要です。

CLASSPATH環境変数

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar(すべてのOracle XML Securityクラスを含むメインjar)

- org.jaxen_1.1.1.jar($ORACLE_HOME/modules/に存在)
Oracle XML Securityは、XPathの処理のためにJaxen XPathエンジンを利用します。

関連項目:

CLASSPATH環境変数の設定

7.3 Oracle XML Securityを使用したデータの署名

Oracleセキュリティ開発ツールのOracle XML Security APIを使用すると、XML文書、XML文書のフラグメントまたは一部のバイナリ・データに署名できます。

この項では、データ署名の概念について説明します。

基本手順は次のとおりです。

1. 署名対象と署名の配置場所を識別します。

2. 署名鍵を決定します。

関連項目:

Oracle XML Security APIを使用したデータ署名の詳細は、「Oracle XML Security APIを使用したデータの署名」から「Oracle XML Security APIを使用したデータの復号化」を参照してください。

7.3.1 署名対象の識別

最初の手順として、署名が必要なデータと署名の配置場所を識別する必要があります。これを行うには、情報要素にxml:id属性を追加します。署名では、この属性を使用して要素が参照されます。

署名の最も一般的な例は、文書の一部に署名している場合で、署名も同じ文書内に配置されます。この場合は、該当の部分を参照する方法を決定する必要があります。最も簡単な方法は、たとえば次のようにIDを使用することです。

<myDoc>
<importantInfo  xml:id="foo1">
...
</importantInfo>
<dsig:Signature>
...
<dsig:Reference URI="#foo1">
...
</dsig:Signature>
</myDoc>

この例では、myDocが文書全体で、その中の<importantInfo>要素のみに署名し、署名は<importantInfo>要素の直後に配置されます。<importantInfo>には、xml:id属性があり、Signatureはこの部分を使用して参照します。

xml:idは、汎用の識別メカニズムです。

この属性を<importantInfo>要素に追加することがスキーマで許可されていない場合は、かわりにXpathを使用して参照できます。

7.3.1.1 署名エンベロープの決定

この例では、署名と署名対象の要素が完全に別個である非結合署名を使用します。

署名には、次の2つ正反対の方法があります。

- エンベロープされる(署名要素が署名対象の要素の子/子孫)

- エンベロープする(署名要素が署名対象の要素の親/祖先)

エンベロープされる署名の例を示します。

<myDoc>
<importantInfo  xml:id="foo1">
...
<dsig:Signature>
...
<dsig:Reference URI="#foo1">
...
<Transform Algorithm="...enveloped-signature">
...
</dsig:Reference>
...
</dsig:Signature>
...
</importantInfo>
</myDoc>

エンベロープされる署名を使用する場合は、EnvelopedSignatureTransformを使用して、署名の計算から署名自身を除外する必要があります。除外しないと、署名を生成する処理によってimporttantInfo要素の内容が変更され、検証が失敗します。

7.3.1.2 バイナリ・データの署名方法の決定

バイナリ・データに署名することもできます。この場合は、バイナリ・データをURIで参照できるようにする必要があります。Oracle XML Securityでは、http:、file:およびzip:のURIなど、JDKで解決できるものであればどのようなURIでも使用できます。

Signature要素を含む別のXML文書を作成する必要があります。この署名は、このURIを使用してバイナリ・データを参照します。

URIでXMLデータにアクセスできる場合は、このメカニズムを使用してXMLデータに署名することができます。ただし、XMLの場合は、バイナリ・データとして処理してバイナリ・データのまま署名するか、正規化を適用してXMLとして署名するかを決定します。正規化を適用するには、正規化変換を追加する必要があります。

バイナリ・データが、base64でエンコードされた文字列としてXML文書に存在する場合は、IDベースまたはXpathベースの参照を使用できます。データのデコードとバイナリの署名にはBase64DecodeTransformを使用できます。

<myDoc>
<importantBinaryData  xml:id="foo1">
XJELGHKLasNDE12KL=
</importantBinaryData>
<dsig:Signature>
...
<dsig:Reference URI="#foo1">
...
<Transform Algorithm="...base64">
...
</dsig:Reference>
...
</dsig:Signature>
</myDoc>

注意:

外部URI間接参照は、安全性が非常に低下する場合があります。たとえば、Oracleセキュリティ開発ツールのコードをサーバー内で実行しており、受信メッセージを検証するとします。このメッセージに外部URI参照が含まれていると、サーバーは基本的にファイルまたは外部のWebサイトから読み取ることになります。これは、サービス拒否攻撃やクロスサイト・スクリプティングにつながる場合があります。

デフォルトで外部URI間接参照が無効になっているのはこのためです。外部URI間接参照を許可するには、JVMプロパティosdt.allow.externalReferences(またはosdt.allow.all)を設定する必要があります。

7.3.1.3 1つの署名での複数XMLフラグメントの署名

同じ署名に複数のXMLフラグメントを含めることができます。たとえば、IDベースの参照が2つある場合に、両方の参照を同じ署名に含めることができます。また、複数のサブツリーに解決されるXpath式を使用することもできます。

ローカルIDベースの参照とリモートのURI参照を混在して一致させ、すべての参照を同じ署名に含めることもできます。

実際は、複数の部分を同じ署名に含め、暗号的に一緒にバインドするすることをお薦めします。たとえば、XML署名を使用して発注書の承認に署名する場合は、購入対象の品目、承認したユーザー、承認時刻をすべて同じ署名に含める必要があります。ユーザーを含めることを忘れると、第三者がこのメッセージを盗んでユーザー名を変更し、再送信することが可能になり、この場合も署名は検証されます。

7.3.1.4 署名からの要素の除外

サブツリー全体に署名するのではなく、一部のサブツリーを除外して署名する必要がある場合は、Xpath式を使用する必要があります。

7.3.2 署名鍵の決定

署名対象と参照方法を決定したら、署名鍵を決定します。X509Certificate、対象鍵、またはDSA、RSA、DH鍵などのRAW非対称署名鍵を使用できます。

オプションは次のとおりです。

- X509Certificateを使用します。
これは最も一般的なメカニズムです。秘密鍵を使用して署名し、対応する公開鍵を持つユーザーはその鍵で検証できます。

- DSA、RSA、DH鍵などのRAW非対称署名鍵を使用します。
X509certificateを使用して署名している場合は、実際は証明書に関連付けられたDSA/RSA/DH署名鍵で署名していることになります。証明書に関連付けられていないDSA/RSA/DH署名鍵を使用することもできますが、このような処理には意味がありません。

- 対称鍵を使用します。
対象鍵を使用してHMAC署名を行うこともできます。これは、署名した側と検証する側で対称鍵をすでに共有している場合に有効で、この場合、パスワードから導出された鍵や、対称鍵を使用するKerberosシステムから導出された鍵にすることができます。Oracleセキュリティ開発ツールのWS Security APIには、パスワードベースの鍵用とKerberos鍵用に明示的なAPIが用意されています。

7.3.2.1 鍵交換の設定

鍵交換は帯域外で処理する必要があります。たとえば、証明書を使用して署名している場合は、受信者側で証明書を検証できるように、トラスト・ポイントを使用して受信者が設定されている必要があります。また、対称鍵を使用して署名している場合は、受信者側でこの対称鍵を把握している必要があります。XML Signature仕様では、このような最初の鍵交換のメカニズムについては定義していません。

7.3.2.2 受信者ヒントの提供

署名の検証方法を把握できるように、受信者にヒントを提供する必要もあります。これは、<dsig:Signature>内の<dsig:KeyInfo>タグにあります。ヒントの提供は、次の方法で可能です。

- ヒントを提供しないこともできます。鍵を受信者にすでに渡してある場合は、この方法でもまったく問題がなく、受信者側では、すべての署名がこの鍵で署名されることを前提としています。ただし、このような状況はあまりありません。

- X509Certificateを使用して署名する場合は、次の中から1つ以上を提供できます。

- X509Certificate全体。これが最も一般的な用法です。

- 証明書のSubject DN。これは、受信者側でLDAPディレクトリにアクセスできる場合に有効で、受信者はDNに基づいて証明書を検索できます。

- SubjectKeyIdentifierまたはIssuerDN/Serial番号ペア。これは、受信者側で証明書のセットから1つの署名を要求するだけの場合に有効です。受信者は、署名を検証する必要があるたびに、すべての証明書をループ処理して、一致するSKIまたはIssuerSerialを持つ証明書を検索できます。

- RAW非対称鍵を使用して署名する場合は、RSA/DSA/DH公開鍵の実際の値を提供できます。これは、受信者側で鍵を検証できないためお薦めしませんが、かわりに、証明書を含んでいる場合は、受信者側でPKIX処理を実行して検証できます。つまり、受信者は証明書の妥当性をチェックしてOCSPまたはCRLと照合できます。

- 対称鍵を使用して署名する場合は、鍵名を提供できます。これは、受信者側で対称鍵の取得/構成に使用できる情報を伝える文字列にすぎません。

7.4 XMLデータの検証

XMLデータを検証するには、署名要素を検索し、検証鍵をフェッチします。

この項では、データ検証の概念について説明します。

署名の作成方法について理解したら、同様の手順を使用して署名を検証できます。基本手順は次のとおりです。

1. 署名要素を検索し、署名された部分をチェック

XML文書で署名要素を最初に検索します。この署名に含まれている要素をリスト表示するためのメソッド(リンクを挿入)がOracle XML Securityで提供されます。これらが署名対象の要素であることを確認します。

2. 検証鍵をフェッチ

次に、署名に使用された鍵を識別します。この場合は、<dsig:KeyInfo>を確認し、検証に使用する証明書、RAW公開鍵または対称鍵を識別します。

関連項目:

Oracle XML Security APIを使用したデータ検証の詳細は、次を参照してください

7.5 データの暗号化方法の理解

暗号化鍵を適用することにより、XML文書、XML文書のフラグメントまたは一部のバイナリ・データを暗号化できます。

この項では、データの暗号化の概念について説明します。

基本手順は次のとおりです。

- 暗号化対象の識別

- 暗号化鍵の決定

関連項目:

Oracle XML Security APIを使用したデータ暗号化の詳細は、「Oracle XML Security APIを使用したデータの暗号化」を参照してください。

7.5.1 暗号化対象の識別

最も一般的な暗号化のシナリオは、暗号化と置換です。文書の一部を暗号化する場合は、暗号化したバイトで文書を置換します。

次に例を示します。

<myDoc>
<importantInfo>
...
</importantInfo>
</myDoc>

importantInfo要素を暗号化すると、次のようになります。

<myDoc>
<xenc:EncryptedData>
...
</xenc:EncryptedData>
</myDoc>

この場合は、<importantInfo>全体およびすべての内容が、EncryptedData要素によって置き換えられます。この要素は、基本的に暗号化された<importantInfo>要素のbase64エンコーディングであるbase64の大きな文字列を含みます。

このモードでは、<importantInfo>要素は完全に非表示になっており、受信者は復号化されるまで内容を知ることはできません。

7.5.1.1 コンテンツのみの暗号化モードの使用

コンテンツのみの暗号化モードもあります。このモードでは、要素タグ自身は暗号化されませんが、すべての内容が暗号化されます。

<myDoc>
<importantInfo>
<xenc:EncryptedData>
...
</xenc:EncryptedData>
</importantInfo>
</myDoc>

コンテンツのみのモードを使用するのは、全員が<importantInfo>の存在を知っていることが適切な場合です。<importantInfo>要素の内容の復号化および確認方法を知るのは対象の相手のみになります。

7.5.1.2 バイナリ・データの暗号化

base64エンコード文字列として存在するバイナリ・データを暗号化する場合は、正規のXMLデータであるかのように暗号化できます。

ただし、外部のバイナリ・データ(XML文書の外部にあるデータ)を暗号化する場合は、暗号化したデータの格納場所に応じてオプションが異なります。

データは暗号化されたデータ要素の外または内側に格納できます。

1つのオプションは、暗号化したデータを外部にも格納する方法です。SOAP添付ファイルの場合は、添付ファイルの暗号化メカニズムと、暗号化したデータを添付ファイルとして格納するメカニズムについて指定している、WS Security SOAP Attachments (リンクを挿入)を参照してください。

暗号化したデータを外部に格納するには、xencEncryptedDataのサブ要素であるxenc:CipherReferenceを使用し、暗号化したバイトをURIを使用して参照するする必要があります。

もう1つのオプションは、インプレースのXML暗号化と同様に、暗号化したバイトをEncryptedData内に格納する方法です。

7.5.2 暗号化鍵の決定

ランダムの対象鍵を選択して、データを暗号化できます。その後、この対称鍵を非対称鍵で暗号化できます。

この方法は、非対称鍵を使用して直接暗号化を行わない点を除いて、署名鍵を決定するタスク(項「署名鍵の決定」を参照)と非常に似ています。通常は次のようにします。

1. ランダムの対称鍵を選択します。

2. この鍵でデータを暗号化します。

3. 非対称鍵でランダムの対称鍵を暗号化します。

4. 暗号化したデータと暗号化した鍵の両方を受信者に送信します。

対称鍵を使用した場合も、次の方法を選択できます。

1. ランダムの対称鍵を生成します。

2. 対称鍵でランダムの対称鍵を暗号化します。

3. 暗号化したデータ鍵と暗号化した鍵の両方を受信者に送信します。

このような暗号化した鍵のメカニズムを使用するには、xenc:EncryptedKeyを文書内のどこに配置するかを決定する必要があります。

- encryptedData要素が1つしかない場合は、EncryptedKeyをEncryptedDataのKeyInfoに配置します。

- それ以外の場合は個別に配置し、一方がもう一方を参照するようにします。

EncryptedKeyの復号化に使用できる証明書、非対称鍵または鍵名を参照するには、EncryptedKey内で<dsig:KeyInfo>を使用します。

7.6 Oracle XML Securityを使用したデータの復号化の理解

データの復号化では、データの暗号化と同じプロセスに従いますが、処理手順が逆です。ランダムの対称鍵を復号化し、その鍵を使用してデータを復号化する必要があります。

基本手順は次のとおりです。

適切な位置に配置した単純な暗号化を使用してデータが暗号化されている場合は、EncryptedData要素を検索し、そのKeyInfoを参照します。

既知の対称鍵で直接暗号化されている場合は、その部分を復号化します。

ランダムの対称鍵で暗号化されている場合は、次のようにします。

1. 対応するEncryptedKeyを検索します。

2. その部分を最初に復号化します。

3. 復号化したランダムの対称鍵を使用し、EncryptedDataを復号化します。

関連項目:

Oracle XML Security APIを使用したデータ復号化の詳細は、次を参照してください

7.7 OSDT XML APIでの要素ラッパーの理解および使用方法

Oracle XML SecurityやOracle Web Services SecurityなどのXMLベースのOracleセキュリティ開発ツールAPIは、すべてラッパーの概念を使用しています。各XML要素には、それぞれ対応するJavaラッパー・クラスがあります。

たとえば、<dsig:Signature> XML要素はXSSignatureクラスに対応します。これらのラッパー・クラスはすべてXMLElementから継承され、対応するDOM要素のポインタであるデータ・メンバーを1つだけ含みます。

この項では、Oracleセキュリティ開発ツールAPIでラッパー・オブジェクトを処理する方法について説明します。内容は次のとおりです。

- ラッパー・オブジェクトの構成

- ラッパー・オブジェクトからのDOM要素の取得

- 複合要素の解析

- 複合要素の構成

7.7.1 ラッパー・オブジェクトの構成

コンストラクタを呼び出して、DOM要素からラッパー・オブジェクトを構成できます。DOM要素が存在しない場合は、DOM要素を作成してからコンストラクタを使用するか、newInstanceメソッドを使用します。

DOM要素からラッパー・オブジェクトを構成するには、コンストラクタを起動するだけです。

次に例を示します。

Element sigElem =
(Element)doc.getElementsByTagNameNS(XMLURI.ns_dsig, "Signature").item(0);
XSSignature sig = new XSSignature(sigElem);

DOM要素が存在しない場合にラッパー・オブジェクトを構成するには、次のいずれかを実行します。

- DOM要素を作成し、前述のメソッドを使用します。

- newInstanceメソッドを使用します。

XSSignature sig = XSSignature.newInstance(doc, null);

これにより、内部的には同じ結果になり、つまり、<dsig:Signature> DOM要素がどこにも追加されずに作成され、ラッパー・オブジェクトが要素の上に作成されます。この要素は、文書の任意の場所に追加する必要があります。

一部のラッパー・クラスでは、newInstanceメソッドがないため、文書オブジェクトを取得するコンストラクタをコールする必要があります。

XSSignedInfo sigInfo =  new XSSignedInfo(doc, null);

要素からラッパー・オブジェクトを作成するには、XMLUtils.getInstanceメソッドをコールする方法もあります。

XSSignature sig = (XSSignature)XMLUtils.getInstance(sigElem);

Oracleセキュリティ開発ツールAPIでは、要素名をラッパー・クラス名に関連付ける表が内部に保持されます。XMLUtils.getInstanceは、この表を使用して適切なコンストラクタを起動し、ラッパー・クラスのインスタンスを返します。

7.7.2 ラッパー・オブジェクトからのDOM要素の取得

XMLElement.getElement()メソッドを使用して、ラッパー・オブジェクトから基礎となるDOM要素を取得できます。

基礎となるDOM要素は、すぐに利用できます。すべてのラッパー・クラスは、基礎となるDOM要素を取得できるように、メソッドXMLElement.getElement()を提供するXMLElementから拡張されています。

7.7.3 複合要素の解析

サブ要素の階層を含む複合要素については、同等のラッパー・オブジェクトの階層が存在します。

たとえば、次のように署名を含む文書を受信するとします。

<dsig:Signature>
<dsig:SignedInfo>
<dsig:CanonicalizationMethod ... />
...
<dsig:SignedInfo>
<dsig:SignatureValue>..</dsig:SignatureValue>
...
</dsig:Signature>

これらの要素の大部分には、対応するラッパー・クラス(dsig:Signature -> XSSignature、dsig:SignedInfo -> XSSignedInfo、dsig:SignatureValue -> XSSignatureValueなど)があります。

ただし、dsig:Signature DOM要素からXSSignedInfoオブジェクトを構成すると、子オブジェクトは構成されないため、子要素を見ることもありません。新しいXSSignature(sigElem)は、sigElemを指すデータ・メンバーでオブジェクトを作成するだけのクイック・コールです。子オブジェクトは毎回作成されます。このため、XSSignature.getSignedInfo()をコールすると、dsig:Signatureの子要素を検索してdsig:SignedInfo要素が特定され、その要素に対してラッパー・オブジェクトが構成されて返されます。

このラッパー・オブジェクトはどこにも格納されません。したがって、XSSignature.getSignedInfo()を再度起動しても同じ処理が実行され、SignedInfoオブジェクトの異なるインスタンスが返されますが、これらのオブジェクトは両方とも同じDOM要素を指すため、インスタンスが異なる場合でもまったく同じように動作します。

注意:

DOMは真のソースですが、ラッパー・オブジェクトは棄却型オブジェクトであることを忘れないでください。getメソッドでは、常に新しいラッパー・オブジェクトが作成されますが、基礎となるDOMを変更すると、ラッパー・オブジェクトには常に最新の変更が反映されます。

7.7.4 複合要素の構成

複合要素を構成するには、個別のラッパー・オブジェクトを作成し、setメソッドを使用してアセンブルします。

ここでは、前述と同じ例を検討しますが、受信文書に存在する署名ではなく、署名を含む文書を作成し、この文書を第三者に送信します。

<dsig:Signature>
<dsig:SignedInfo>
...
<dsig:SignedInfo>
...
</dsig:Signature>

このような複合要素を構成するには、個別のラッパー・オブジェクトを作成し、setメソッドを使用してアセンブルする必要があります。

次に例を示します。

XSSignature sig = XSSignature.newInstance(doc, null);
XSSignedInfo sigInfo = new XSSignedInfo(doc, null);
sig.setSignedInfo(sigInfo);

DOMは常に真のソースであることを忘れないでください。setメソッドでは、渡されたラッパー・オブジェクトの格納やコピーは実行されません。基礎となるDOMを変更するだけです。

この場合、setSignedInfoはdsig:SignedInfo要素を取得し、dsig:Signature要素の子にします。したがって、setSignedInfo(sigInfo)を起動した後に、sigInfo = nullを実行しても、影響を受けるものはありません。

最後に、最上位レベルのオブジェクトをDOMの任意の場所に挿入する必要があります。

elem.appendChild(sig.getElement());

7.8 Oracle XML Security APIを使用したデータの署名

Oracle XML Security APIを使用して、XMLデータ要素の署名を作成できます。

この項では、Oracle XML Security APIでデータに署名する技術について説明します。

内容は次のとおりです。

- デタッチされた署名の作成、基本手順

- 基本的な署名手順に対するバリエーションの使用方法

7.8.1 デタッチされた署名の作成、基本手順

デタッチされた署名を作成するには、識別されたXML要素、要素に追加されたID属性および署名鍵と証明書を使用します。

デタッチされた署名を作成するには、次のようにします。

<myDoc>
<importantInfo  xml:id="foo1">
...
</importantInfo>
<dsig:Signature>
...
<dsig:Reference URI="#foo1">
...
</dsig:Signature>
</myDoc>

次を実行する必要があります。

// assume you have your data set up in doc
Document doc = ...
Element impElem = ...

// Now put an ID on the importantInfo element
impElem.setAttributeNS(XMLURI.ns_xml, "xml:id", "foo1");

// Then get the signing key and certificate from
// somewhere – e.g. you can load them from a keystore
PrivateKey signKey = ...
X509Certificate signCert = ...

// Create the Signature object
XSSignature sig = XSSignature.newInstance(doc, null);

// Create the SignedInfo object
// Normally you should use exclusive canonicalization
//    alg_exclusiveC14N
// Depending on the type of your private key DSA or RSA
//    use dsaWithSHA1 or rsaWithSHA1
XSSignedInfo sigInfo = sig.createSignedInfo(
XMLURI.alg_exclusiveC14N, XMLURI.alg_rsaWithSHA1, null)
sig.setSignedInfo(sigInfo);

// Create a Reference object to the importantInfo element
// You need to specify the id which you set up earlier,
//  and also a digestMethod
XSReference ref = sig.createReference(null, "#foo1", null,
XMLURI.alg_sha1);
sigInfo.addReference(ref);
// Create an exclusive c14n Transform object
// If you do not add this transform object, it will use
// inclusive by default
XSAlgorithmIdentifier transform =
new XSAlgorithmIdentifier(doc, "Transform",
XMLURI.alg_exclusiveC14n);
ref.addTransform(transform);

// Create a KeyInfo object
XSKeyInfo keyInfo = sig.createKeyInfo();
sig.setKeyInfo(keyInfo);

// Create an X509Data element for your signingCert, inside
//  this keyingo
X509Data x509 = keyInfo.createX509Data(signingCert);
keyInfo.addKeyInfoData(x509);

// Everything is setup, now do the actual signing
// This will actually do all the canonicalization,
// digesting, signing etc
sig.sign(signKey, null);

// Finally insert the signature somewhere in your document
doc.getDocumentElement().appendChild(sig.getElement());

注意:

子のラッパー・オブジェクトを作成したら、setメソッドまたはaddメソッドをコールして親に配置する必要があります。最上位レベルのSignatureオブジェクトを文書に挿入することも忘れないでください。

7.8.2 基本的な署名手順に対するバリエーションの使用方法

署名の作成時に、複数の参照、エンベロープされた署名、XPath式、証明書ヒントおよびHMAC鍵署名を含めることができます。

次の各トピックで、さらに詳しく説明します。

- 複数の参照の挿入

- エンベロープされた署名の使用方法

- XPath式の使用方法

- 証明書ヒントの使用方法

- HMAC鍵を使用した書名

7.8.2.1 複数の参照の挿入

署名に複数の参照を含めるには、XSReferenceオブジェクトをXSSignedInfoオブジェクトに追加するだけです。各XSReferenceオブジェクトには、独自の変換リストが必要です。

7.8.2.2 エンベロープされた署名の使用方法

エンベロープされた署名を使用するには、エンベロープされた署名変換を参照に追加します。つまり、排他変換を追加するコードの直前に次のコードを挿入します。

XSAlgorithmIdentifier transform1 =
new XSAlgorithmIdentifier(doc, "Transform",
XMLURI.alg_envelopedSignature);
ref.addTransform(transform1);

7.8.2.3 XPath式の使用方法

IDベースの参照のかわりにXPath式を使用するには、createReferenceのURIパラメータに、#foo1ではなく空の文字列を渡し、最初の変換としてXPath変換をReferenceに追加します。

String xpathExpr = "ancestor-or-self:importantInfo";
Element xpathElem = doc.createElementNS(XMLURI.ns_dsig,
"dsig:XPath");
xpathElem.appendChild(doc.createTextNode(xpathExpr);
XSAlgorithmIdentifier transform2 =
new XSAlgorithmIdentifier(doc, "Transform",
XMLURI.alg_xpath);
transform2.addParameter(xpathElem);
ref.addTransform(transform2);

7.8.2.4 証明書ヒントの使用方法

鍵情報に証明書全体を含めず、証明書のヒントのみを含める場合は、引数なしの形式のXSKeyInfo.createX509Data()を使用し、メソッドX509Data.addIssuerSerial、addSubjectNameまたはaddSubjectKeyIDのいずれかをコールします。

7.8.2.5 HMAC鍵を使用した書名

RSAまたはDSAの秘密鍵ではなく、HMAC鍵を使用して署名するには、XSSignature.sign(byte[] secret, String sigValueId)メソッドを使用し、最初の引数としてHMAC鍵を渡します。

また、XSKeyInfo.createKeyNameをコールすることにより、KeyNameなどの異なる種類のKeyInfoを使用します。

7.9 Oracle XML Security APIを使用した署名の検証

Oracle XML Security APIを使用して、署名対象を検索し、署名のKeyInfoをフェッチし、署名を検証できます。

署名の検証のトピックには次が含まれます。

- 署名対象の確認、基本手順

- コールバックの設定

- カスタムの鍵取得機能の記述

- 署名対象のチェック

- 署名の検証

7.9.1 署名対象の確認、基本手順

署名を検証するには、最初に文書内の<dsig:Signature>要素を検索し、この要素を使用してXSSignatureラッパー・オブジェクトを構成してから、署名のKeyInfoをフェッチします。

Element sigElem = …
XSSignature sig = new XSSignature(sigElem);

次に、署名のKeyInfoをフェッチし、鍵を調べて署名者が信頼できるかどうかを判断します。KeyInfoを処理するには、次のような様々な方法があります。

- 非常に単純な場合は、検証鍵が事前にわかっている場合があるため、KeyInfoを確認する必要はありません。

- これに対し、ほとんどの場合では、KeyInfoを確認する必要があります。1つの方法はコールバックを設定することであるため、XSSignature.verify()をコールする場合は、検証鍵なしてコールします。内部的に、Oracleセキュリティ開発ツールでは、KeyInfoを確認し、コールバックを起動して鍵をフェッチするかどうかを判断します。

- その他のオプションには、KeyInfoを事前に確認して、鍵を自身で判断する方法があります。

7.9.2 コールバックの設定

KeyInfoに署名証明書が含まれている場合は、証明書バリデータのコールバックを設定します。KeyInfoにヒントが含まれている場合は、KeyRetrieverを記述して証明書ストアから証明書をフェッチします。

KeyInfoに署名証明書が含まれている場合

KeyInfoに署名証明書が含まれていることが想定される場合で、この証明書をまだ取得しておらず、トラスト・ポイントを設定している場合は、証明書バリデータのコールバックを設定するだけで済みます。

// Create your certificate validator
CertificateValidator myValidator
= new CertificateValidator() {
public void validateCert(CertPath cp) {
// Code to validate the certificate
}
};
KeyRetriever.setCertificateValidator(myValidator);

Oracleセキュリティ開発ツールAPIでは、証明書をKeyInfoから取得して、コールバックを起動します。コールバックがtrueを返す場合は、その証明書で検証されます。

KeyInfoにヒントが含まれている場合

KeyInfoに署名証明書のヒント(subjectDN、発行者のSerialまたはサブジェクト・キー識別子)しか含まれていないことが想定される場合は、KeyRetrieverを記述して、このヒントに指定された証明書ストアから証明書をフェッチします。

証明書ストアがキーストア、PKCS12ウォレットまたはPKCS8ファイルの場合は、これらのタイプの組込みの取得機能のいずれかを使用します。これらの取得機能では、キーストアまたはOracleウォレット内のすべての証明書を反復処理し、指定したsubjectDN/issuerSerialまたはSubjectKeyに一致する証明書を検索します。

注意:

KeyInfoに証明書全体が含まれている場合、このメカニズムを使用することもできます。この場合は、鍵の取得機能で証明書全体を一致させるだけです。

// Load your keystore
KeyStore ks =
// Set up a callback against this KeyStore
KeyRetriever.addKeyRetriever(
new KeyStoreKeyRetriever(ks, passwd));

7.9.3 カスタムの鍵取得機能の記述

これらの組込みの取得機能が適切でない場合は、カスタムのKeyRetrieverをKeyRetrieverクラスから導出して記述できます。

これは、たとえばKeyInfoにsubjectDNが含まれていることが想定され、LDAPディレクトリを参照してそのDNの証明書を検索する場合に可能です。

KeyRetriever myRetriever = new KeyRetriever() {
X509Certificate retrieveCertificate (KeyInfoData keyInfo) {
// write code to fetch the certificate from
// the certificate store based on keyInfo
}

PublicKey retrieveCertificate (KeyInfoData keyInfo) {
// write code to fetch the PublicKey from
// the certificate store based on keyInfo
}
};
KeyRetriever.addKeyRetriever(myRetriever);

署名で対称鍵が使用されており、その鍵の名前がKeyInfoに含まれている場合は、この鍵名に基づいて対称鍵をフェッチできるカスタムの鍵取得機能を記述します。

7.9.4 署名対象のチェック

署名によって署名対象が実際に署名されるかどうかをチェックできます。Oracleセキュリティ開発ツールAPIには、この情報を返すメソッドが用意されています。

// XSSignature has be created as mentioned before
XSSignature sig = ...

// at first locate the element that are expecting
// to be signed
Element impElem = ...

// Now check if the signature really signs this
List signedObjects = XMLUtils.resolveReferences(sig);
if (signedObjects.size() != 1 ||
signedObjects.get(0) != impElem {
// something is wrong – impElem is not signed by
// this signature
}

7.9.5 署名の検証

sig.verify()メソッドを使用して署名を検証し、署名形式が正しいかどうかを確認できます。失敗した署名をデバッグすることもできます。

最後の手順では、署名を実際に検証します。コール・プロトコルはコールバックが設定されているかどうかによって異なります。

7.9.5.1 コールバックが設定されている場合の検証

コールバックを設定したら、次のようにコールを実行します。

boolean result = sig.verify();

次のように、失敗した結果と例外の両方をチェックする必要があります。

- 署名形式が正しいが参照ダイジェストのいずれかが一致していない場合や、署名が検証されない場合、sig.verify()はfalseを返します。

- 署名の構成に問題がある場合、たとえば、アルゴリズム名に問題がある場合や署名のバイトが正しいサイズでない場合、sig.verify()は例外をスローします。

7.9.5.2 コールバックが設定されていない場合の検証

コールバックを設定しておらず、鍵を自身で判断した場合は、次をコールする必要があります。

- sig.verify(byte[])(HMAC鍵の場合)

- sig.verify(PublicKey)(DSA/RSA鍵の場合)

7.9.5.3 検証のデバッグ

特定の署名が検証されない理由を特定できない場合は、デバッグし、JVMプロパティ–Dxml.debug.verify=1を設定する必要があります。このフラグは、Oracleセキュリティ開発ツールに、失敗した署名のstderrに診断結果を出力するように指示します。

7.10 Oracle XML Security APIを使用したデータの暗号化

共有対象鍵またはランダムの対象鍵を使用してデータを暗号化できます。

次の各トピックで、さらに詳しく説明します。

- 共有対称鍵を使用した暗号化

- ランダムの対称鍵を使用した暗号化

7.10.1 共有対称鍵を使用した暗号化

新しいXEEncryptedDataインスタンスを作成して、暗号化方法を指定できます。次に、対象鍵のヒントを含むKeyInfoを作成します。XEncUtils.encryptElementユーティリティ・メソッドを使用して、これらの手順をすべて実行できます。

次の<importantInfo>要素を暗号化して置き換えるには、次のようにします。

<myDoc>
<importantInfo>
...
</importantInfo>
</myDoc>

次の手順に従う必要があります。

// Assuming there is a shared symmetric key
SecretKey dataEncKey = ...

// Create a new XEEncryptedData instance
// use either obj_Element or obj_Content depending
// on whether you want to encrypt the whole element
// or content only
XEEncryptedData ed = XEEncryptedData
.newInstance(doc, null, XMLURI.obj_Element);

// Specify the data encryption method
XEEncryptionMethod em =
ed.createEncryptionMethod(XMLURI.alg_aes128_CBC);
ed.setEncryptionMethod(em);

// Create a Keyinfo with a hint to the symmetric key
XEKeyInfo ki= ed.createKeyInfo();
ki.addKeyInfoData(ki.createKeyName("MyKey"));
ed.setKeyInfo(ki);

// Locate the importantInfo element
Element impElem = ...

// Encrypt the importantInfo element and replace
// it with the EncryptedData element
XEEncrytedData.encryptAndReplace(impElem, dataEncKey,
null, ed);

次のすべての手順を実行するユーティリティ・メソッドが用意されています。

XEncUtils.encryptElement(
impElem,  // element to be encrypted
false,    // true = contentOnly, false = entire element
XMLURI.alg_aes128_CBC, // data encryption alg
"MyKey" // hint to data key
);

7.10.2 ランダムの対称鍵を使用した暗号化

通常は、ランダムの対称鍵を生成してその鍵でデータを暗号化し、このランダムの対称鍵を受信者の公開鍵で暗号化する必要があります。XEncUtils.encryptElementメソッドによって、これらの手順がすべて実行されます。

この方法は次のとおりです。

// Load up the encryption certificate of the reciever
X509Certificate encCert = ...

// Get the reciever's public key from the cert
PublicKey keyEncKey = encCert.getPublicKey();

// Then generate a random symmetric key
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey dataEncKey = keyGen.generateKey();

// Now create an EncryptedKey object
XEEncryptedKey = new XEEncryptedKey(doc);

// set up the key encryption algorithm
XEEncryptionMethod em =
ek.createEncryptionMethod(XMLURI.alg_rsaOAEP_MGF1);
em.setDigestMethod(XMLURI.alg_sha1);
ek.setEncryptionMethod(em);

// encrypt the random symmetric key with public key
byte[] cipherValue = ek.encrypt(dataEncKey, keyEncKey);

// store this cipherValue into ek
XECipherData cd = ek.createCipherData();
cd.setCipherValue(cipherValue);
ek.setCipherData(cd);

// decide on how you would let the receiver know the
// the key encryption key. We are putting in the
// entire reciever's certificate
XEKeyInfo kki = ek.createKeyInfo();
kki.addKeyInfoData(kki.createX509Data(encCert);

// Now the encrypted key has been set up, let us
// do the data encryption as before
XEncUtils.encryptElement(
impElem,  // element to be encrypted
false,    // true = contentOnly, false = entire element
XMLURI.alg_aes128_CBC, // data encryption alg
null // No hint to data key
);

// Finally we need to put the EncryptedKey inside the
// KeyInfo of the EncryptedData
ed.addKeyInfoData(ek);

次のすべての手順を実行するユーティリティ・メソッドが用意されています。

XEncUtils.encryptElement (
impElem,  // element to be encrypted
false,    // true = contentOnly, false = entire element
XMLURI.alg_aes128_CBC, // data encryption alg
dataEncKey, // the random symmetric key that we generated
XMLURI.alg_rsaOAEP_MGF1, // key encryption alg
KeyEncKey, // public key that we got from cert
"RecieverCert" // A hint to the certificate
);

このユーティリティ・メソッドでは、KeyNameをEncryptedKeyのKeyInfoに配置する点に注意してください。このかわりにX509Dataを渡す場合は、keyEncKeyNameにnullを渡し、X509Dataを手動で追加します。

// use utility method to create EncrytedData
XEEncryptedData ed = XEncUtils...

// no extract EncryptedKey from it
XEEncryptedKey ek = (XEEncryptedKey)ed.getKeyInfo()
.getEncryptedKeys().elementAt(0);

// Set the keyInfo of the ek
XEKeyInfo kki = ek.createKeyInfo();
kki.addKeyInfoData(kki.createX509Data(encCert);

7.11 Oracle XML Security APIを使用したデータの復号化

Oracle XML Security APIでは、共有対称鍵とランダムの対象鍵のどちらを使用したかによって、データの復号化方法が異なります。

この項の各トピックで、さらに詳しく説明します。

7.11.1 共有対称鍵を使用した復号化

暗号化されたデータ要素を検索し、XEEncrytedData.decryptAndReplaceメソッドを使用してデータを復号化できます。

共有対称鍵がある場合は、次のようにします。

// search for the EncryptedData element
Element edElem = ...

// decrypt the data
SecretKey dataDecKey = ...
XEEncrytedData.decryptAndReplace(dataDecKey, edElem, true);

7.11.2 ランダムの対称鍵を使用した復号化

ランダムの対象鍵の場合は、XEEncUtils.decryptElementメソッドを使用してデータを復号化できます。

ランダムの対称鍵を使用する場合は、次のようにします。

// search for the EncryptedData element
Element edElem = ...

// decrypt the data
PrivateKey keyDecKey = ...
XEEncUtils.decryptElement(edElem, keyDecKey);

7.12 サポート・クラスとインタフェースについて

Oracle XML Security APIには、サポート・クラスとインタフェースが含まれています。oracle.security.xmlsec.util.XMLURIインタフェースには、アルゴリズム、ネームスペースおよびオブジェクトのURI文字列定数が定義されています。oracle.security.xmlsec.util.XMLUtilsクラスには、XMLおよびXML-DSIGの静的ユーティリティ・メソッドが含まれています。

この項の内容は、次のとおりです。

- oracle.security.xmlsec.util.XMLURIインタフェースについて

- oracle.security.xmlsec.util.XMLUtilsクラスについて

7.12.1 oracle.security.xmlsec.util.XMLURIインタフェースについて

oracle.security.xmlsec.util.XMLURIインタフェースには、アルゴリズム、ネームスペースおよびオブジェクトのURI文字列定数が定義されています。

次のネーミング規則が使用されます。

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

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

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

7.12.2 oracle.security.xmlsec.util.XMLUtilsクラスについて

oracle.security.xmlsec.util.XMLUtilsクラスには、XMLおよびXML-DSIGの静的ユーティリティ・メソッドが含まれています。

アプリケーションで頻繁に使用されるメソッドには、createDocBuilder()、createDocument()、toBytesXML()およびtoStringXML()メソッドがあります。

7.13 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オブジェクトを解析してコンポーネント部に分ける必要があります。

7.14 Oracle XML Securityのベスト・プラクティス

XML署名仕様の実装者およびユーザーのベスト・プラクティスに関する説明を参照できます。

次のベスト・プラクティスを参照してください。

http://www.w3.org/TR/xmldsig-bestpractices/

7.15 Oracle XML SecurityのJava APIリファレンス

Oracle XML Security APIで使用されるクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

8 Oracle SAML

Java開発者は、Oracle SAMLを使用して、SAML 1.0/1.1およびSAML 2.0仕様に準拠する、クロスドメイン・シングル・サインオンおよびフェデレーテッド・アクセス制御を実装したソリューションを開発できます。

この章のトピックは、次のとおりです:

- Oracle SAMLの機能と利点

- Oracle SAML 1.0/1.1

- Oracle SAML 2.0

8.1 Oracle SAMLの機能と利点

Oracle SAML SDKでは、SAML準拠のJavaセキュリティ・サービスの開発を支援する、サポート・ツール、ドキュメントおよびサンプル・プログラムを含むJava APIが提供されます。Oracle SAMLは、アプレット、アプリケーション、EJB、サーブレット、JSPなどの既存のJavaソリューションに統合できます。

Oracle SAMLでは次の機能が提供されます。

- SAML 1.0/1.1および2.0仕様のサポート

- SAMLベースのシングル・サインオン(SSO)、属性、メタデータ、拡張クライアント・プロキシ、およびフェデレーテッド・アイデンティティ・プロファイルのサポート

関連項目:

これらの仕様や関連ドキュメントの詳細およびリンクは、「リファレンス」を参照してください。

8.2 Oracle SAML 1.0/1.1

Oracle SAML 1.0/1.1は、SAML 1.0/1.1仕様に準拠しています。Oracle SAML 1.0/1.1ツールキットの環境を設定して、そのクラスとインタフェースを使用できます。

次の項目が含まれます。

- Oracle SAML 1.0/1.1のパッケージ

- Oracle SAML 1.0/1.1の環境設定

- Oracle SAML 1.xのクラスおよびインタフェース

- Oracle SAML 1.0/1.1のJava APIリファレンス

8.2.1 Oracle SAML 1.0/1.1のパッケージ

Oracle SAML Java APIには、SAML 1.0/1.1準拠のJavaアプリケーションを作成するためのパッケージであるoracle.security.xmlsec.samlとoracle.security.xmlsec.samlpが含まれています。

oracle.security.xmlsec.saml

このパッケージには、SAMLアサーションをサポートするクラスが含まれます。

oracle.security.xmlsec.samlp

このパッケージには、SAMLのリクエストおよびレスポンスのプロトコル(SAMLP)をサポートするクラスが含まれます。

8.2.2 Oracle SAML 1.0/1.1の環境設定

Oracle SAMLの環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルおよびclassファイルへのCLASSPATH変数を設定します。

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

Oracle SAMLを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。

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

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar

- osdt_saml.jar

- org.jaxen_1.1.1.jarファイル(Oracle XML Securityディストリビューションに含まれるJaxen XPathエンジン)

構成の詳細は、「CLASSPATH環境変数の設定」を参照してください。

8.2.3 Oracle SAML 1.xのクラスおよびインタフェース

Oracle SAML 1.0/1/1には、SAMLアサーション、リクエストおよびレスポンスを作成するための複数のコア・クラスが含まれています。アルゴリズム、ネームスペースおよびオブジェクトのURI文字列定数を定義するサポート・インタフェースが含まれています。また、すべてのSAMLおよびSAML拡張メッセージのベース・クラスであるサポート・クラスも含まれています。

この項では、Oracle SAML 1.0/1.1のクラスとインタフェースの使用について説明し、コード例を示します。この項の内容は、次のとおりです。

- Oracle SAML 1.xのコア・クラス

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

8.2.3.1 Oracle SAML 1.xのコア・クラス

SAMLアサーション、リクエストおよびレスポンスはOracle SAML APIを使用して作成されます。

この項では、SAMLおよびSAMLP 1.0/1.1のコア・クラスの概要をコード例と一緒に説明します。

内容は次のとおりです。

- oracle.security.xmlsec.saml.SAMLInitializerクラスの使用方法

- oracle.security.xmlsec.saml.Assertionクラスの使用方法

- oracle.security.xmlsec.samlp.Requestクラスの使用方法

- oracle.security.xmlsec.samlp.Responseクラスの使用方法

8.2.3.1.1 oracle.security.xmlsec.saml.SAMLInitializerクラスの使用方法

このクラスはOracle SAMLのツールキットを初期化します。デフォルトでは、Oracle SAMLはSAML v1.0に対応するように初期化されます。特定のバージョンのSAML仕様に合せてOracle SAMLを初期化することもできます。特定のバージョンに対してinitializeメソッドをコールしても、以前に初期化されたバージョンはそのままになります。

次の例に、SAMLのツールキットをSAML v1.0とSAML v1.1に対して初期化する方法を示します。

// initializes for SAML v1.1
SAMLInitializer.initialize(1, 1);
// initializes for SAML v1.0, done by default
SAMLInitializer.initialize(1, 0);

8.2.3.1.2 oracle.security.xmlsec.saml.Assertionクラスの使用方法

このクラスは、SAMLアサーション・スキーマのAssertion要素を表します。

次の例に、新しいAssertion要素を作成して既存のXML文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Assertion assertion = new Assertion(doc);
doc.getDocumentElement().appendChild(assertion);

次の例に、Assertion要素をXML文書から取得する方法を示します。

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

// Get a list of all Assertion elements in the document

NodeList assrtList =
doc.getElementsByTagNameNS(SAMLURI.ns_saml, "Assertion");
if (assrtList.getLength() == 0)
System.err.println("No Assertion elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.saml.Assertion object and process

for (int s = 0, n = assrtList.getLength(); s < n; ++s)
{
Assertion assertion = new Assertion((Element)assrtList.item(s));
// Process Assertion element
...
}

8.2.3.1.3 oracle.security.xmlsec.samlp.Requestクラスの使用方法

このクラスは、SAMLプロトコル・スキーマのRequest要素を表します。

次の例に、新しいRequest要素を作成して既存のXML文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Request request = new Request(doc);
doc.getDocumentElement().appendChild(request);

次の例に、Request要素を既存のXML文書から取得する方法を示します。

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

// Get a list of all Request elements in the document

NodeList reqList =
doc.getElementsByTagNameNS(SAMLURI.ns_samlp, "Request");
if (reqList.getLength() == 0)
System.err.println("No Request elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.samlp.Request object and process

for (int s = 0, n = reqList.getLength(); s < n; ++s)
{
Request request = new Request((Element)reqList.item(s));
// Process Request element
...
}

8.2.3.1.4 oracle.security.xmlsec.samlp.Responseクラスの使用方法

このクラスは、SAMLプロトコル・スキーマのResponse要素を表します。

次の例に、Response要素を作成して既存のXML文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Response response = new Response(doc);
doc.getDocumentElement().appendChild(response);

次の例に、Response要素を既存のXML文書から取得する方法を示します。

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

// Get a list of all Response elements in the document

NodeList respList =
doc.getElementsByTagNameNS(SAMLURI.ns_samlp, "Response");
if (respList.getLength() == 0)
System.err.println("No Response elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.samlp.Response object and process

for (int s = 0, n = respList.getLength(); s < n; ++s)
{
Response response = new Response((Element)respList.item(s));
// Process Response element
...
}

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

この項では、Oracle SAML 1.0/1.1のサポート・クラスとインタフェースの概要を説明します。

- oracle.security.xmlsec.saml.SAMLURIインタフェースの使用方法

- oracle.security.xmlsec.saml.SAMLMessageクラスの使用方法

8.2.3.2.1 oracle.security.xmlsec.saml.SAMLURIインタフェースの使用方法

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

- SAML 1.0仕様に定義されているアクションのネームスペースURIは、action_で始まります。

- SAML 1.0仕様に定義されている認証メソッドのネームスペースURIは、authentication_method_で始まります。

- SAML 1.0仕様に定義されている確認メソッドのネームスペースURIは、confirmation_method_で始まります。

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

8.2.3.2.2 oracle.security.xmlsec.saml.SAMLMessageクラスの使用方法

このクラスは、すべてのSAMLおよびSAML拡張メッセージのベース・クラスです。署名することができ、XML-DSIG(デジタル署名)構造体を含むことが可能です。

8.2.4 Oracle SAML 1.0/1.1のJava APIリファレンス

Oracle SAML 1.0/1.1 APIで利用可能なクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

8.3 Oracle SAML 2.0

Oracle SAML 2.0は、SAML 2.0仕様に準拠しています。Oracle SAML 2.0ツールキットの環境を設定して、そのクラスとインタフェースを使用できます。

次の項目が含まれます。

- Oracle SAML 2.0のパッケージ

- Oracle SAML 2.0の環境設定

- Oracle SAML 2.0のクラスおよびインタフェース

- Oracle SAML 2.0のJava APIリファレンス

8.3.1 Oracle SAML 2.0のパッケージ

Oracle SAML 2.0 APIには、SAMLアサーション、SAMLのリクエストとレスポンスのプロトコル(SAMLP)、およびSAML認証をサポートするクラスを含むパッケージが含まれています。

Oracle SAMLのJava APIには、SAML 2.0準拠のJavaアプリケーションを開発するために次のパッケージが含まれます。

oracle.security.xmlsec.saml2.core

このパッケージには、SAMLアサーションをサポートするクラスが含まれます。

oracle.security.xmlsec.saml2.protocol

このパッケージには、SAMLのリクエストおよびレスポンスのプロトコル(SAMLP)をサポートするクラスが含まれます。

oracle.security.xmlsec.saml2.ac

このパッケージには、SAML認証コンテキストの基本タイプをサポートするクラスが含まれます。

oracle.security.xmlsec.saml2.ac.classes

このパッケージには、SAML認証コンテキストの各種クラスをサポートするクラスが含まれます。

oracle.security.xmlsec.saml2.metadata

このパッケージには、SAMLメタデータをサポートするクラスが含まれます。

oracle.security.xmlsec.saml2.profiles.attributes

このパッケージには、各種のSAML属性プロファイルをサポートするクラスが含まれます。

oracle.security.xmlsec.saml2.profiles.sso.ecp

このパッケージには、SAML ECP SSOプロファイルをサポートするクラスが含まれます。

8.3.2 Oracle SAML 2.0の環境設定

Oracle SAMLの環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルおよびclassファイルへのCLASSPATH変数を設定します。

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

Oracle SAMLを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。

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

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar

- osdt_saml.jar

- org.jaxen_1.1.1.jarファイル(Oracle XML Securityディストリビューションに含まれるJaxen XPathエンジン)

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

%CLASSPATH%;%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_xmlsec.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_saml.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_saml2.jar;
%ORACLE_HOME%\modules\org.jaxen_1.1.1.jar;

構成の詳細は、「CLASSPATH環境変数の設定」を参照してください。

8.3.3 Oracle SAML 2.0のクラスおよびインタフェース

Oracle SAML 2.0には、SAMLアサーション、リクエストおよびレスポンスを作成するための複数のコア・クラスが含まれています。アルゴリズム、ネームスペースおよびオブジェクトのURI文字列定数を定義するサポート・インタフェースが含まれています。

この項では、Oracle SAML 2.0のクラスとインタフェースの使用について説明し、コード例を示します。これらの項目が含まれます。

- Oracle SAML 2.0のコア・クラス

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

8.3.3.1 Oracle SAML 2.0のコア・クラス

Oracle SAML 2.0 APIのコア・クラスにより、アサーション、リクエストおよびレスポンスを作成することができます。

この項では、SAMLおよびSAMLPのコア・クラスの概要をコード例と一緒に説明します。内容は次のとおりです。

- oracle.security.xmlsec.saml2.core.Assertionクラスの使用方法

- oracle.security.xmlsec.saml2.protocol.AuthnRequestクラスの使用方法

- oracle.security.xmlsec.saml2.protocol.StatusResponseTypeクラスの使用方法

8.3.3.1.1 oracle.security.xmlsec.saml2.core.Assertionクラスの使用方法

このクラスは、SAMLアサーション・スキーマのAssertion要素を表します。

次の例に、新しいAssertion要素を作成して既存のXML文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Assertion assertion = new Assertion(doc);
doc.getDocumentElement().appendChild(assertion);

次の例に、Assertion要素をXML文書から取得する方法を示します。

// Get a list of all Assertion elements in the document

NodeList assrtList =
doc.getElementsByTagNameNS(SAML2URI.ns_saml, "Assertion");
if (assrtList.getLength() == 0)
System.err.println("No Assertion elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.saml2.core.Assertion object and process

for (int s = 0, n = assrtList.getLength(); s < n; ++s)
{
Assertion assertion = new Assertion((Element)assrtList.item(s));
// Process Assertion element
...
}

8.3.3.1.2 oracle.security.xmlsec.saml2.protocol.AuthnRequestクラスの使用方法

このクラスは、SAMLプロトコル・スキーマのAuthnRequest要素を表します。

次の例に、新しいAuthnRequest要素を作成して既存のXML文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
AuthnRequest request = new AuthnRequest(doc);
doc.getDocumentElement().appendChild(response);

次の例に、AuthnRequest要素を既存のXML文書から取得する方法を示します。

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

// Get a list of all AuthnRequest elements in the document

NodeList reqList =
doc.getElementsByTagNameNS(SAML2URI.ns_samlp, "AuthnRequest");
if (reqList.getLength() == 0)
System.err.println("No Request elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.saml2.protocol.AuthnRequest
// object and process

for (int s = 0, n = reqList.getLength(); s < n; ++s)
{
AuthnRequest request = new AuthnRequest((Element)reqList.item(s));
// Process Request element
...
}

8.3.3.1.3 oracle.security.xmlsec.saml2.protocol.StatusResponseTypeクラスの使用方法

このクラスは、SAMLプロトコル・スキーマのResponse要素を表します。

samlp:StatusResponseType要素は、SAML 2.0プロトコルの拡張ポイントを表すベース型です。SAML 2.0仕様で定義される各種のプロトコルでは、samlp:Responseやsamlp:LogoutResponseなどのサブタイプを使用します。

次の例に、Response要素を作成して既存のXML文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Response response = new Response(doc);
doc.getDocumentElement().appendChild(response);

次の例に、Response要素を既存のXML文書から取得する方法を示します。

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

// Get a list of all Response elements in the document

NodeList respList =
doc.getElementsByTagNameNS(SAML2URI.ns_samlp, "Response");
if (respList.getLength() == 0)
System.err.println("No Response elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.saml2.protocol.Response object and process

for (int s = 0, n = respList.getLength(); s < n; ++s)
{
Response response = new Response((Element)respList.item(s));
// Process Response element
...
}

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

この項では、Oracle SAML 2.0のサポート・クラスとインタフェースの概要を説明します。内容は次のとおりです。

- oracle.security.xmlsec.saml2.util.SAML2URIインタフェースの使用方法

8.3.3.2.1 oracle.security.xmlsec.saml2.util.SAML2URIインタフェースの使用方法

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

- SAML 1.0/1.1/2.0仕様に定義されているアクションのネームスペースURIは、action_ で始まります。

- SAML 1.0/1.1/2.0仕様に定義されている認証メソッドのネームスペースURIは、authentication_method_で始まります。

- SAML 1.0/1.1/2.0仕様に定義されている確認メソッドのネームスペースURIは、confirmation_method_で始まります。

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

8.3.4 Oracle SAML 2.0のJava APIリファレンス

Oracle SAML 2.0 APIで利用可能なクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

Oracle SAMLのJava APIリファレンス(Javadoc)は次のドキュメントで参照できます。

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

9 Oracle Web Services Security

Oracle Web Services Securityでは、OASIS WS Security 1.1規格の完全な実装が提供されます。メッセージの署名および暗号化のメカニズムと、送信者のアイデンティティを確定するためのセキュリティ・トークンが提供されます。

この章では、SDKのインストールおよび使用方法について説明します。この章には次のトピックが含まれます:

- Oracle Web Services Securityの環境設定

- Oracle Web Services Securityのクラスおよびインタフェース

- Oracle Web Services SecurityのJava APIリファレンス

9.1 Oracle Web Services Securityの環境設定

Oracle Web Services Securityの環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルへのCLASSPATH変数を設定します。

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

Oracle Web Services Securityを使用するには、Development Kit (JDK)バージョン1.6以上が必要です。

次の項目をCLASSPATHに指定します。

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar - Oracle XML Security jarです。

- osdt_saml.jar - Oracle SAML 1.0および1.1 jarです。

- osdt_saml2.jar - Oracle SAML 2.0 jarです。

- org.jaxen_1.1.1.jar: $ORACLE_HOME/modules/に含まれます。

- osdt_wss.jar - Oracle Web Services Securityを含むメインjarです。

- saaj-api.jar - 標準のSAAJ APIでJDK6に含まれます。以前のJDKの場合、JavaEEコンテナから取得できます。

- mail.jar、activation.jar - これらのjarはJavaEEコンテナから取得できます。

関連項目:

CLASSPATH環境変数の設定

9.2 Oracle Web Services Securityのクラスおよびインタフェース

Oracle Web Services Securityは、メッセージを署名して暗号化するためのクラス、インタフェースおよびメソッドと、送信者のアイデンティティを確定するためのセキュリティ・トークンを提供します。

注意:

続行する前に、Oracle XML Securityを確認してください。

この項では、Oracle Web Services SecurityのAPIのクラスおよびインタフェースについて説明します。この項の内容は、次のとおりです。

- Oracle Web Services Securityの要素ラッパー

- <wsse:Security>ヘッダー

- Oracle Web Services Securityのセキュリティ・トークン(ST)

- セキュリティ・トークン参照(STR)

- 署名と検証

- 暗号化と復号化

9.2.1 Oracle Web Services Securityの要素ラッパー

Oracle Web Services Securityでは、すべてのXML要素に対して要素ラッパーが提供されます。

関連項目:

OSDT XML APIでの要素ラッパーの理解および使用方法

表9-1に、Oracle Web Services Securityで提供される要素ラッパーを示します。

表9-1 Oracle Web Services Securityの要素ラッパー

XMLタグ名

Javaクラス名

<wsse:Security>

oracle.security.xmlsec.wss.WSSecurity

<wsse:BinarySecurityToken>

oracle.security.xmlsec.wss.WSSBinarySecurityTokenまたは導出されたクラス(valueType属性に応じてoracle.security.xmlsec.wss.x509.X509BinarySecurityTokenまたはoracle.security.xmlsec.wss.kerberos.KerberosBinarySecurityToken)

<wsse: SecurityTokenReference>

oracle.security.xmlsec.wss.WSSecurityTokenReference

<wsse: Embedded>

oracle.security.xmlsec.wss.WSSEmbedded

<wsse11:EncryptedHeader>

oracle.security.xmlsec.wss.WSSEncryptedHeader

<wsse11:SignatureConfirmation>

oracle.security.xmlsec.wss.WSSignatureConfirmation

<wsse:KeyIdentifier>

oracle.security.xmlsec.wss.WSSKeyIdentifierまたは導出されたクラス(valueType属性に応じて、oracle.security.xmlsec.wss.x509.X509KeyIdentifier、oracle.security.xmlsec.wss.saml.SAMLAssertionKeyIdentifier、oracle.security.xmlsec.wss.saml2.SAML2AssertionKeyIdentifier、oracle.security.xmlsec.wss.kerberos.KerberosKeyIdentifierまたはoracle.security.xmlsec.wss.WSSEncryptedKeyIdentifier)

<wsse:Reference>

oracle.security.xmlsec.wss.WSSReference

<wsu:Created>

oracle.security.xmlsec.wss.WSUCreated

<wsu:Expires>

oracle.security.xmlsec.wss.WSUExpires

<wsu:Timestamp>

oracle.security.xmlsec.wss.WSUTimestamp

<wsse:UsernameToken>

oracle.security.xmlsec.wss.username.UsernameToken、oracle.security.xmlsec.wss、oracle.security.xmlsec.wss、oracle.security.xmlsec.wss、oracle.security.xmlsec.wss、oracle.security.xmlsec.wss、oracle.security.xmlsec.wss

「OSDT XML APIでの要素ラッパーの理解および使用方法」で説明しているように、Javaクラスは棄却型ラッパーにすぎませんが、DOM要素は真のソースです。これらのラッパー・クラスは、DOM要素を取り込む適切なコンストラクタを使用して作成できます。基礎となるDOM要素はgetElementメソッドを使用して取得できます。

9.2.2 <wsse:Security>ヘッダー

WS Security仕様では、<wsse:Security>と呼ばれる新しいSOAPヘッダーが定義されています。セキュリティ・トークン、タイムスタンプ、署名、EncryptedKey、ReferenceListなど、すべてのセキュリティ情報がこのヘッダー内に格納されます。

- セキュリティ・トークン - ユーザー名トークン、証明書、SAMLアサーションなどを格納します(次の項を参照)。

- タイムスタンプ - 現在のタイムスタンプは、多くの場合セキュリティ・ヘッダーに含まれ、リプレイ攻撃を防ぐために、通常は署名に含まれます。

- 署名 - すべての署名はヘッダー内に格納されます。署名がSecurityヘッダーにある場合でも、署名対象は多くの場合ヘッダーの外部になり、たとえば、1つの署名でSOAP本文、複数のSOAP添付ファイル、Securityヘッダー内のUserNameトークン、およびSecurityヘッダー内のTimestampトークンに署名できます。

- EncryptedKey - 暗号化されたすべてのセッション鍵はここに格納されます。

- ReferenceList - すべてのEncryptedDataセクションのリストを格納します。

9.2.2.1 送信メッセージの処理

送信メッセージの場合は、新しい<wsse:Security>ヘッダーを作成して、セキュリティ・トークンを追加し、文書の一部を暗号化または署名(あるいはその両方を実行)する必要があります。このタスクを実行する方法は、次のとおりです。

// Assuming we the outgoing message has already been constructed into
// a SOAPMessage object (part of SAAJ API)
SOAPMessage msg = ...

// Now create a new <wsse:Security> Header
// newInstance will internally use SOAPHeader.addHeaderElement
SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
WSSecurity ws = WSSecurity.newInstance(env);

// Add required prefixes to this SOAP header

// Now add some security tokens (refer to the next section on
// how to create security tokens)
UsernameToken ut = ...
ws.addUsernameToken(ut);

// Create some security token references to this token
// (refer to following sections)
ws.createSTR...

// Now sign or encrypt some data (refer to following sections)
// These should use the above STRs
ws.sign(...);
ws.encryptWithEncKey(...);
ws.encryptNoEncKey(...);

9.2.2.2 受信メッセージの処理

受信メッセージの場合は、特定の<wsse:Security>ヘッダーを検索してその内容を調べ、文書の一部を検証または復号化する必要があります。このタスクを実行するには、次のようにします。

// Assuming we the incoming message has already been constructed into
// a SOAPMessage object (part of SAAJ API)
SOAPMessage msg = ...

9.2.3 Oracle Web Services Securityのセキュリティ・トークン(ST)

セキュリティ・トークンは、証明書、Kerberosチケット、パスワード付きのユーザー名、シングル・サインオンのトークンなどのアーティファクトを表します。Oracle Web Services Securityには、ユーザー名トークン、X509証明書、Kerberosチケット、SAMLアサーションなど、様々なタイプのセキュリティ・トークンが含まれています。また、これらのセキュリティ・トークンには複数のバリエーションがあります。

通常、鍵はこのトークンから導出および抽出され、メッセージの一部の暗号化、復号化、署名および検証に使用されます。これに対し、セキュリティ・トークンはデータ・オブジェクトと同じように使用することもできます。

表9-2 Oracle Web Services Securityのセキュリティ・トークン

トークンのタイプ(Javaクラス)

バリエーション

キー

ユーザー名トークン oracle.security.xmlsec.wss.usernameUsernameToken

- パスワードなし

- パスワードのSHA1ダイジェストを使用

- 実際のパスワードまたは異なる種類のダイジェスト/導出されたパスワードを使用

ユーザーのパスワードでKeyDerivationを実行して取得した対称鍵

X509証明書 oracle.security.xmlsec.wss.x509X509BinarySecurityToken

- 単一のバージョン3証明書

- PKIPath形式の証明連鎖

- PKCS7形式の証明連鎖

- 証明書内の公開鍵

- 証明書に関連付けられている秘密鍵

Kerberosチケット oracle.security.xmlsec.wss.kerberosKerberosBinarySecurityToken

- AP_REQ packet

- GSSでラップされたAP_REQパケット

チケットに存在するセッション鍵、またはサブキー。

SAMLアサーション1.1 oracle.security.xmlsec.wss.saml.SAMLAssertionToken

SAMLアサーション2.0 oracle.security.xmlsec.wss.saml2SAML2AssertionToken

- holder_of_key

- sender_vouchers

- ベアラー

holder_of_keyの場合は、サブジェクトの鍵(<saml:Assertion>内にある<saml:SubjectConfirmation>内の鍵)が使用されます。

sender_vouchesの場合は、証明元のエンティティの鍵が使用されます。

鍵はbearerトークンからは抽出されません。

9.2.3.1 WSSユーザー名トークンの作成

最初に、UsernameTokenを作成し、WSSecurityヘッダー内に配置します。UsernameToken内の唯一の必須フィールドは、次のようにユーザー名です。

// create a Username token
WSSecurity ws = ...
UsernameToken ut = new UsernameToken(doc);
ut.setUserName("Zoe");

// remember to put this inside your WSSecurity header.
// addUserNameToken puts it at the beginning, you can also
// use a regular DOM method appendChild or insertChild to put it in.
ws.addUsernameToken(ut);

// optionally add an wsu:Id, so you can refer to it
ut.setWsuId("MyUser");

次に、このトークンにパスワードを配置する方法を決定します。次のように複数の方法を選択できます。

1. クリア・テキスト・パスワードを追加します。この方法は、メッセージ全体がSSLなどのセキュアなチャネルで送信されている場合にのみ考慮します。

2. パスワードのダイジェストまたはその他の種類の導出されたパスワードのダイジェストを追加します。ダイジェストは、nonceと時間によって保護されないかぎりリプレイすることもできるため、クリア・テキスト・パスワードよりも必ずしも安全とはかぎりません。

3. WS Security仕様で指定されているダイジェスト・メカニズムを使用してパスワードのダイジェストを追加します。この方法では、nonceとcreatedDateを使用します。

4. パスワードまたはそのダイジェストをまったく追加しません。鍵を知っていることを示すには、かわりにパスワードから鍵を導出し、その鍵をメッセージの署名に使用します。

// For options 1 and 2, use the setPassword method
ut.setPassword("IloveDogs");

// With this mechanism, the reciever should simply call
// UsernameToken.getPassword to check if the password is as expected.

// For option 3, use the setPasswordDigest method, but before doing
// thatfor that you have to  at first set a nonce and a created date.
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte nonce[] = new byte[20];
random.nextBytes(nonce); // compute a 20 byte random nonce
ut.setNonce(nonce);
ut.setCreatedDate(new Date()); // Set the date to now
ut.setPasswordDigest("IloveDogs"); // will compute the digest from
// this clear text password using
// nonce and createdDate

// For this mechanism, the reciever should use the following
byte nonce[] = ut.getNonce();
.. check against the used nonces, to make sure this is a new nonce
Date createdDate = ut.getCreated();
.. check that this createdDate is within an expected clock skew
boolean valid = ut.isValid(userName, passwd),
// above call will recompute the digest from the passwd
// and the nonce and created date, and check if this digest matches
// the digest in the username token

// For option 4, set the salt and iteration count
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte salt[] = new byte[15];
random.nextBytes(salt); // compute a 15 byte random salt

ut.setSalt(1, salt);
ut.setIteration(1000);
SecretKey key = ut.deriveKey("IloveDogs");

これで、この秘密鍵を使用してデータを署名または暗号化できます。

9.2.3.2 X509トークンの作成

次のように、X509BinarySecurityTokenコンストラクタの後にsetTokenメソッドを使用するか、または同等のヘルパー・メソッドWSSecurity.createBST_X509を使用できます。

WSSecurity ws = ...
X509Certificate cert = ...
X509BinarySecurityToken x509token = WSSecurity.createBST_X509(cert);

// remember to put this inside your WSSecurity header.
// addX509CertificateToken puts it at the beginning, you can also
// use a regular DOM method appendChild or insertChild to put it in.
ws.addX509CertificateToken(x509Token);

// optionally add an wsu:Id, so you can refer to it
x509Token.setWsuId("MyCert");

証明連鎖全体を含める場合は、CertPathオブジェクトからX509BinarySecurityTokenを作成することもできます。

この証明書でデータを暗号化する場合は、cert.getPublicKey()を使用して取得できる公開鍵が必要です。これに対し署名の場合は、キーストアに保持する必要がある秘密鍵が必要です。

9.2.3.3 クライアント側Kerberosトークンの作成

一般的に、KerberosトークンはJava GSS-APIと組み合せて使用します。

次の例に、クライアント側トークンの作成方法を示します。

//Use JAAS Authentication with Kerberos Login Module

// Set up the config files and then call  login()
// to login using this module. This will cause the client to contact
// the Kerberos Authentication-Service and get a ticket to talk to the
// Kerberos Ticket-Granting-Service
LoginContext lc = new LoginContext(...);
lc.login();

//Use JAAS Authorization to set the subject into the thread context
Subject.doAs(lc.getSubject(), action)

// The rest of the code should be executed as a Privileged action
// Create a GSSContext to talk to a particular server.

GSSManager gssManager = GSSManager.getInstance();
GSSName serviceName = gssManager.createName(svcPrincipalName, null);
GSSContext gssContext = gssManager.createContext(serviceName, null,
null, GSSCredential.DEFAULT_LIFETIME);

// Then call initSecContext. this will cause the client to contact
// the Ticket-Granting-Service to obtain a ticket for talking to that
// particular server. The token that is returned by the initSecContext
// is a GSS wrapped AP_REQ packet.
byte[] token = new byte[1];
token = gssContext.initSecContext(token, 0, token.length);

// Create a Kerberos BST using this AP_REQ packet
WSSecurity ws = ...
KerberosBinarySecurityToken kbst = ws.createBST_Kerberos(token,
WSSURI.vt_GSSKerberosv5);
ws.addKerberosToken(kbst);

// Get the sessionKey that is present inside the AP_REQ packet,
// this is the session that is generated by the TGT and returned
// to the client in the initSecContext class
//
// This getSessionKey call simply calls Subject.getPrivateCredentials
// to get a list of tickets associated with the subject, and then
// iterates through them to find the one to be used for
// for that particular server
SecretKey sessionKey =
KerberosUtils.getSessionKey(lc.getSubject(),svcPrincipalName);

これで、この秘密鍵を使用してデータを署名または暗号化できます。

サーバー側

9.2.3.4 サーバー側Kerberosトークンの作成

サーバー側kerberosトークンには、GSSContextの作成とセッション・キーの抽出が必要です。

次の例に、サーバー側kerberosトークンの作成方法を示します。

// Use JAAS Authentication and Authorization as for the client
// Create GSSContext will null credentials </b><br>
SSManager manager = GSSManager.getInstance();
GSSContext gssContext = manager.createContext((GSSCredential)null);

// Locate the KerberosBinarySecurityToken in the incoming WSSecurity
// header. You can do this by doing a DOM search
WSSecurity = ...
KerberosBinarySecurityToken kbst = ...

// Now extract the AP_REQ from the BST and call acceptSecContext
byte ap_req[] = kbst.getValue();
gssContext.acceptSecContext(ap_req);

// The context is now extablished. (Note Mutual authentication would
// need one more round trip)

// Now extract the session key
// KerberosUtils.getSession is an overloaded method, and this
// particular one is meant to be used by server. Internally
// it decrypts the ap_req packet using the server's key (or the
// tgtSession key) and extracts the key from the decrypted ap_req
// packet
Subject srvrSubject = ...
SecretKey sessionKey =
KerberosUtils.getSessionKey(srvrSubject, ap_req);

これで、この鍵を使用して復号化または検証できます。

9.2.3.5 SAMLアサーション・トークンの作成

Assertionオブジェクトの作成方法の詳細は、Oracle XML Securityを参照してください。SAMLアサーション・トークンは、SAMLAssertionToken(Assertion assertion)コンストラクタを起動するだけでAssertionオブジェクトから作成できます。

9.2.4 セキュリティ・トークン参照(STR)

WS Security仕様には、セキュリティ・トークンを参照するメカニズムであるセキュリティ・トークン参照(STR)の概念も定義されています。SignatureまたはEncryptionでは、このSTRメカニズムを使用して、署名または暗号化に使用した鍵を識別します。STRでは、直接参照、キー識別子、埋込みなどのメカニズムがサポートされています。

通常、STRでは次のメカニズムをサポートしています。

- 直接参照: STRではURIを使用してSTを参照します。

- キー識別子: STRでは、トークンの識別にURIではなく、発行者のシリアル(X509トークンの場合)やアサーションID (SAMLトークンの場合)などの別のメカニズムを使用します。トークンがメッセージに存在しない場合もあります。

- 埋込み: トークンはKeyInfoに直接埋め込まれます。

9.2.4.1 直接参照STRの作成

STRは同一の手順を使用して作成されます。STRを渡すメカニズムはトークンのタイプにより異なります。

STRを作成する手順:

1. 前述のとおりトークンを作成します。

2. .setWsuId()をコールしてそのトークンにIDを設定します

3. 手順2のIDを使用してSTRを作成します

4. WSSSignatureParamsまたはWSEncryptionParams内でそのSTRを渡します

後続の項では様々なトークンに対するSTRを渡す方法について示します。

9.2.4.2 ユーザー名トークンの参照STRの作成

次の例に、ユーザー名トークンの参照STRの作成方法を示します。

WSSecurity ws = ...
WSSecurityTokenReference str =
ws.createSTR_Username_ref("#MyUser");

9.2.4.3 X509トークンの参照STRの作成

次の例に、X509トークンの参照STRの作成方法を示します。

WSSecurity ws = ...
WSSecurityTokenReference str =
ws.createSTR_X509_Ref("#MyCert");

9.2.4.4 Kerberosトークンの参照STRの作成

次の例に、kerberosトークンの参照STRの作成方法を示します。

WSSecurity ws = ...
// use the appropriate value type
String valueType = WSSURI.vt_GSSKerberosv5;
WSSecurityTokenReference str =
ws.createSTR_KerberosKeyRef ( "#MyToken");

9.2.4.5 SAMLアサーション・トークンの参照STRの作成

この例では、SAMLアサーション・トークンの参照STRの作成方法を示します。

WSSecurity ws = ...
WSSecurityTokenReference str =
ws.createSTR_SAML_Assertion_Ref20("MySAMLAssertion")

9.2.4.6 EncryptedKeyの参照STRの作成

次の例に、暗号化キーの参照STRの作成方法を示します。

WSSecurity ws = ...
WSSecurityTokenReference str =
ws.createSTR_EncKeyRef("MyEncKey")

9.2.4.7 汎用トークンの参照STRの作成

createSTRメソッドを使用するかわりに、次のように適切なvalueTypeとtokenTypeを使用して参照を直接作成することもできます。

WSSecurity ws = ...
String uri = "#MyToken";
WSSReference ref = new WSSReference(doc, uri);
ref.setValueType(valueType); // set an optional valueType
WSSecurityTokenReference str = new WSSecurityTokenReference(doc);
str.setTokenType(tokenType); // set an optional tokenType
str.appendChild(ref);

9.2.4.8 キー識別子STRの作成

KeyIdentifierは、assertionID (SAMLトークンの場合)やSubject Key Identifier (X509トークンの場合)など、トークンの固有プロパティを使用するセキュリティ・トークンを参照する別の方法です。

KeyIdentifersは、トークン自身が文書内に存在しない場合に多く使用されます。たとえば、受信メッセージはX509Certで暗号化できますが、メッセージには、そのX509Certを格納するかわりに、SubjectKeyIdentifierの形式でヒントのみを格納できます。

9.2.4.9 X509トークンのKeyIdentifier STRの作成

X509トークンを識別するには、次の3つの方法があります。

1. 発行者のシリアル: 発行者のDNと証明書のシリアル番号の組合せ

2. サブジェクト・キー識別子: 証明書のサブジェクト・キー識別子

3. サムプリントSHA1: 証明書のSHA1

X509Certificate cert = ...
WSSecurity ws = ...
WSSecurityTokenReference str =
ws.createSTR_X509_IssuerSerial(cert);
// alternatively use ws.createSTR_X509_SKI(cert)
// or ws. createSTR_X509_ThumbprintSHA1(cert)

9.2.4.10 KerberosトークンのKeyIdentifier STRの作成

Kerberosトークンは、AP_REQパケットのSHA1またはGSSでラップされたAP_REQパケットのSHA1で識別できます。

byte ap_req[] = ...
WSSecurity ws = ...
String valueType = WSSURI.vt_GSSKerberosv5;
WSSecurityTokenReference str =
ws.createSTR_KerberosKeyIdSHA1(ap_req, valueType);

9.2.4.11 SAMLアサーション・トークンのKeyIdentifier STRの作成

SAMLアサーションはアサーションIDで識別できます。

ローカルSAML 1.1アサーションでは、次を使用します。

WSSecurity.createSTR_SAML_AssertionIdv11(byte assertionId[])

リモートSAML 1.1アサーションでは、次を使用します。

createSTR_SAML_AssertionIdv11(
byte assertionId[], AuthorityBinding authorityBinding)

ローカルSAML 2.0アサーションでは、次を使用します。

createSTR_SAML_AssertionIdv20(byte assertionId[])

リモートSAML 2.0アサーションでは、次のように参照URIを使用します。

createSTR_SAML_Assertion_Ref20("MySAMLAssertion")

9.2.4.12 EncryptedKeyのKeyIdentifier STRの作成

リモートで暗号化された鍵は、その鍵のSHA1ハッシュで識別できます。KeyIdentifierを作成するには、次の関数を使用します。

createSTR_EncKeySHA1(byte sha1[])

9.2.4.13 STRTransformの追加

STRTransformは、署名に追加する非常に便利な変換です。この変換により、対応するSTによって署名の計算中にSTRが一時的に置換されます。

たとえば、X509 SKIベースのSTRを参照に含めるとします。STRTransformがない場合は、署名に含まれるSTR参照、つまりSKI値のみになります。これに対し、STRTransformを追加すると、署名および検証プロセス中にSTRが実際のX509証明書によって置換され、X509証明書全体がメッセージに含まれます。

9.2.5 署名と検証

SOAPメッセージを署名して検証し、署名を確認できます。

この項では、データの署名と検証について説明します。

内容は次のとおりです。

- SOAPメッセージの署名

- SOAPメッセージの検証

- 署名の確認

9.2.5.1 SOAPメッセージの署名

SOAPメッセージに署名するには、次の手順に従います。

1. 署名対象のデータを指定する方法を決定します。最も一般的なメカニズムはIDを使用することですが、IDを使用するかわりにXPath式を使用することもできます。

2. 追加の変換を決定します。排他的c14nとSTR変換は、追加可能な一般的な変換です。

3. 署名鍵を決定します。対称鍵を使用するHMAC署名またはRSA/DSA署名のいずれかを実行できます。

4. この署名鍵を受信者に示す方法を決定します。この場合は通常、前述のSTRを作成する必要があります。

9.2.5.1.1 要素へのIDの追加

IDをDOM要素に追加することができます。

次の関数を使用します。

WSSUtils.addWsuIdToElement(String id, Element element)

これにより、署名対象の要素にwsu:Idを追加します。このメカニズムを使用すると、IDを追加して、DOM要素、またはDOM要素からも導出されるSAAJオブジェクトを正規化できます。

wsuネームスペースの接頭辞を宣言する必要があります。たとえば、次のようにSOAPエンベロープ・レベルで宣言できます。

SOAPEnvelope env = ...
env.addNamespaceDeclaration("wsu" , WSSURI.ns_wsu);

添付ファイルに署名するには、各添付ファイルにContentIdを割り当てる必要があります。この場合は、次のメソッドを使用する必要があります。

setContentId(String contentId)

このメソッドは、SAAJ AttachmentPartオブジェクトの一部です。

9.2.5.1.2 WSSignatureParamsオブジェクトの作成

WSSSignatureParamsオブジェクトは、すべての署名パラメータを使用して作成する必要があります。

最初のWSSignatureParamsオブジェクトを作成するには、次のコンストラクタを使用します。HMAC署名を使用する場合は、hmacKeyに値を渡し、signingKeyにnullを渡します。非対称署名を使用するには、signingKeyに値を渡し、hmacKeyにnullを渡します。

WSSignatureParams(byte[] hmacKey, PrivateKey signingKey);

このコストラクタは、c14nMethod=excC14N、digestMethod=SHA1、signMethod=hmacSHA/rsaSHA1/dsaSHA1(鍵に応じて)を前提とします。異なるアルゴリズムが必要な場合は、次のsetterを使用して設定します。

setDigestMethod(String digestMethod)
setSignMethod(String signMethod)
setC14nMethod(String method)

前に作成したSTRをこのオブジェクトに設定する必要もあります。STRを設定するには、setKeyInfoDataを使用します。

setKeyInfoData(KeyInfoData keyInfoData)

添付ファイルに署名する場合は、このWSSignatureParamsオブジェクトにSOAPMessageを設定し、対応する添付ファイルを特定してcid参照を解決できるようにします。

setSOAPMessage(SOAPMessage msg)

9.2.5.1.3 変換の指定

変換を指定するには、単純だが制限がある方法と、高度で柔軟な方法の2つの方法があります。

単純な方法では、次のパラメータをWSSignatureParamsに設定する必要があります。

setAttachmentContentOnly(boolean)

単純なモードでは、すべてのcid参照によってAttachmentContentOnly変換が自動的に取得されますが、setAttachmentContentOnly(false)をコールすると、cid参照によってAttachmentComplete変換が取得されます。

·    setUsingSTRTransform(boolean)

これをtrueに設定すると、各参照がSTRを指しているかどうかチェックされ、STRを指している場合は、該当の参照にSTRTransformが追加されます。STRTransformが追加されるのは、参照がSTRを直接指している場合のみで、参照がSTRの祖先を指している場合は追加されないことに注意してください。

·    setC14Nmethod(String)

このパラメータは、デフォルトで排他的c14nに設定され、各参照の正規化メソッドとSignedInfoセクションの正規化メソッドの両方を指定します。

·    setUsingDecryptTransfom(boolean)

復号化変換を追加する場合は、これをtrueに設定します。

9.2.5.1.4 WSSecurity.signメソッドのコール

最後に、WSSecurityの次のメソッドをコールし、実際の署名を実行します。

XSSignature sign (String[] uris, WSSignatureParams sigParams, XSAlgorithmIdentifier[][] trans)

このメソッドでは、<Signature>要素を作成して、各参照のダイジェストを計算し、最後に署名を計算します。

urisは署名対象のIDの配列です。この配列の要素ごとに、個別の<Reference>が作成されます。

前述のように、変換を指定するには2つの方法がありますが、単純な方法では、変換をnullにする必要があり、変換情報は前述の様々なsetメソッド(WSSignatureParams内)で指定されます。高度な方法では、参照ごとに変換パラメータですべての変換を明示的に指定する、つまり、trans.lengthとuris.lengthが等しくなるようにする必要があります。

9.2.5.2 SOAPメッセージの検証

署名を検証する場合は、最初に<wsse:Security>ヘッダーで署名要素を特定する必要があります。この場合は、次のメソッドを使用できます。

WSSecurity ws = ...
List<XSSignature>sigs = ws.getSignatures();

このメソッドでは、DOMツリーを検索して、<dsig:Signature>である<wsse:Security>の直接の子をすべて特定し、これらの要素ごとにXSSignatureラッパー・オブジェクトを作成して返します。(ネームスペースの接頭辞にはwsseとdsigを使用する必要がないことに注意)

検証鍵がすでにある場合は、次のメソッドをコールし、hmacKey(HMAC署名の場合)またはsigningKey(非対称鍵の署名の場合)のいずれかを渡します。SOAPMessageが必要になるのは、添付ファイルが署名される場合のみです。

XSSignature sig = sigs[0];

byte [] hmacKey = ...
PublicKey signingKey = ... ; // Need either hmacKey of signingKey

SOAPMessage msg = null; // needed only for attachments
boolean res = WSSecurity.verify(sig, byte[] hmacKey, signingKey, msg);

ただし、検証鍵がない場合は、STRキー識別子を解決するために、次のコールバックを設定する必要があります。通常、STRキー識別子は文書外部のトークンの参照になるため、Oracleセキュリティ開発ツールでは、これらのコールバックを明示的に設定しないかぎり、これらのトークンを特定することはできません。

表9-3 STRキー識別子を解決するためのコールバック

トークンのタイプ

実装インタフェースと登録

注意

ユーザー名トークン

インタフェース: PasswordRetriever

登録: UsernameToken.addPasswordRetriever

このコールバックでは、UsernameTokenの参照STRを解決します。

getPassword()コールバックでは、ユーザーに対応するパスワードを返します。

この秘密鍵は、パスワード、反復カウントおよびsaltから導出されます。

login()コールバックとlogout()コールバックは使用されません。

ユーザー名トークン

インタフェース: KeyDerivator

登録: UsernameToken.addKeyDerivator

このコールバックもUsernameTokenの参照STRを解決します。独自の鍵導出アルゴリズムを使用する場合に使用します。resolve()コールバックでは、鍵を導出して返します。

X509

インタフェース: X509KeyIdentifierResolver

登録: X509KeyIdentifier.addResolver

このコールバックでは、サムプリントとSKIキー識別子のSTRを解決します。

証明書を返すにはresolve()コールバックを実装し、秘密鍵を返すにはgetPrivateKey()コールバックを実装します。

注意: 秘密鍵は検証には不要ですが、復号化には必要です。

証明書の配列がある場合は、X509KeyIdentifier.matches()メソッドを使用し、

渡したX509 KeyIdentifierに対して各証明書を照合します。

X509

インタフェース: X509IssuerSerialResolver

登録: X509IssuerSerial.addResolver

このコールバックでは、発行者のシリアル・キー識別子のSTRを解決します。

前述の場合と同様に、resolve()コールバックとgetPrivateKey()コールバックを実装します。

Kerberos

インタフェース: KerberosKeyIdentifierResolver

登録: KerberosKeyIdentifier.addResolver

このコールバックでは、Kerberos STRを解決します。

resolve()およびresolveKey()メソッドを実装して、ap_reqパケットと、セッション鍵/サブキーを返します

(これは、KeyIdentifierに存在するSHA1値に対応します)。

ap_reqパケットの配列がある場合は、その配列の各パケットのSHA1を計算し、

KerberosKeyIdentifier.getValue()によって返される値に一致するSHA1を持つものを検索します。

このap_reqパケットは、resolve()メソッドで返します。

resolveKey()メソッドの場合は、もう1つステップを実行して、

ap_Reqパケット内に存在する鍵を返します。この場合は、KerberosUtils.getSessionKey(Subject, byte[])メソッドを使用できます

(これは、サブジェクトの鍵を使用してap_reqパケットを復号化し、そこからセッション鍵/サブキーを抽出します)。

SAMLアサーション・バージョン1.1

インタフェース: SAMLAssertionKeyIdentifierResolver

登録: SAMLAssertionKeyIdentifier.addResolver

このコールバックでは、SAMLアサーションのKeyIdentifier STRを解決します。

SAMLアサーションを返すにはresolve()メソッド、SAMLX509Certを返すにはgetPublicKey()メソッド、秘密鍵を返すにはgetPrivateKey()メソッドを実装します。(注意: 秘密鍵は復号化のみに必要で、検証には不要です。)

SAMLアサーション・バージョン2.0

インタフェース: SAML2AssertionKeyIdentifierResolver

登録: SAML2AssertionKeyIdentifier.addResolver

SAMLアサーション・バージョン1.1の注意事項を参照してください。

対称鍵を使用するトークン(UserNameトークン、KerberosおよびEncryptedKey)の場合、この対称鍵は文書内にないため、リゾルバを設定する必要があります。Oracleセキュリティ開発ツールでは、リゾルバを設定しないかぎり検証(復号化)はできません。

非対称鍵を使用するトークン(SAMLアサーションとX509トークン)の場合は、Oracleセキュリティ開発ツールだけで証明書を特定できるため、直接のURI参照STRまたは埋込みのトークンを使用する場合は、リゾルバを設定する必要はありません。ただし、Oracleセキュリティ開発ツールでは、コールバックで証明書を検証していないかぎり、メッセージ内の証明書をむやみに使用しないため、CertificateValidatorコールバックを設定する必要があります。

関連項目:

Oracle XML Security

すべてのリゾルバとCertificateValidatorを設定したら、次のメソッドを使用します。

SOAPMessage msg = null; // needed only for attachments
boolean searchTokens = true;
boolean res = WSSecurity.verify(sig, searchTokens, msg);

このメソッドでは、署名のKeyInfoを調べ、証明書を検索するか、適切なリゾルバをコールして署名用の鍵を取得します。

WSSecurity.verifyAllメソッドを使用することもできます。このメソッドでは、署名を検索して1つずつ検証します。

9.2.5.3 署名の確認

署名確認の要素を構成して処理するには、WSSignatureConfirmationラッパー・クラスを使用します。

9.2.5.3.1 署名確認レスポンスの生成

レスポンス生成には、WSSecurityの次の関数を使用します。

List<WSSignatureConfirmation> createSignatureConfirmations(Document doc);

この関数では、現在のWSSecurity要素に存在するすべてのSignaturesを確認し、対応するSignatureConfirmation要素を新しい文書内に構成します。これらは、レスポンスのWSSecuirtyヘッダーに配置できます。

9.2.5.3.2 署名確認レスポンスの処理

レスポンスの処理では、最初に(リクエスト時)次の関数を使用し、すべての署名値を保存します。

String [] getSignatureValues()

保存したこのリストは、次のようにレスポンス処理時に受信SignatureConfirmationsとの比較に使用できます。

boolean verifySignatureConfirmations(String sigValue[])

9.2.6 暗号化と復号化

EncryptedKeyを使用して(または使用せずに) SOAPメッセージを暗号化または復号化できます。

暗号化には、主に次の2つの方法があります。

1. EncryptedKeyを使用する方法: ランダム・セッション鍵で要素を暗号化して、このセッション鍵を<EncryptedKey>要素に暗号化し、この要素を<wsse:Security>ヘッダーに配置します。

2. EncryptedKeyを使用しない方法: 各要素で異なる可能性のある既知の対称鍵で要素を暗号化し、暗号化したこれらの各データ・セクションの参照で<ReferenceList>要素を構成し、<ReferenceList>を<wsse:Security>ヘッダーに配置します。

注意:

正規のDOM要素を暗号化するのが標準的な技法ですが、SOAPヘッダー、SOAP本文および添付ファイルを暗号化することもできます。これらのオブジェクトを暗号化する場合は、後述するように特に注意が必要です。

9.2.6.1 EncryptedKeyを使用したSOAPメッセージの暗号化

EncryptedKeyによりSOAPメッセージを暗号化できます。

次のように、このランダム・セッション鍵の暗号化に使用する鍵を最初に決定し、受信者がこの復号化鍵の特定に使用する情報を使用してSTRを作成します。

Key keyEncKey = ... ; WSSecurityTokenReference str = ...

次の情報を使用してWSSEncryptionParamsを作成します。

// Choose a data encryption algorithm - say AES 128
String dataEncAlg = XMLURI.alg_aes128_CBC;

// Either generate a random session key yourself, or set this to
// null to indicate that OSDT should generate it
SecretKey dataEncKey = null;

// Depending on the KeyEncryptionKey that you have chosen choose
// either an RSA key wrap or a symmetric key wrap
String keyEncAlg = XMLURI.alg_rsaOAEP_MGF1;

// Now put all this information into a WSSEncryptionParams
WSSEncryptionParams eParam = new WSSEncryptionParams(
dataEncAlg, dataEncKey, keyEncAlg, keyEncKey, str);

次のように、DOM要素、SOAPヘッダー、SOAP本文またはAttachmentPartsを正規化します。

Element elem1 = ... // one object to be encrypted
Element elem2 = … // another object to be encrypted
ArrayList objectList[] = new ArrayList();
objectList.add(elem1);
objectList.add(elem2);

次のように配列を2つ作成し、各オブジェクトを暗号化されたコンテンツのみにするかどうかを指定し、生成されるEncryptedDataオブジェクトに割り当てるIDを指定します。

注意:

SOAP本文は、このフラグで渡すものに関係なく、常に暗号化されたコンテンツのみになります。添付ファイルの場合、「コンテンツのみではない」は、コンテンツにmimeヘッダーを加えることを意味します。

// both these elements are not content only
boolean[] contentOnlys = { false, false };

// After encryption the EncryptedData elements will get these ids
String encDataIds[] = { "id1", "id2" };

最後に、次のようにencryptWithEncKeyメソッドをコールします。

WSSecurity ws = ...
XEEncryptedKey encKey = ws.encryptWithEncKey(objectList, contentOnlys,
encDataIds, eParam);

9.2.6.2 EncryptedKeyを使用しないSOAPメッセージの暗号化

EncryptedKeyを使用しない場合は、次の手順を使用します。

データの暗号化鍵を決定します。すべてのEncryptedDataセクションで同じ鍵を使用できますが、セクションごとに異なる鍵を使用することもできます。または、受信者がこの復号化鍵の特定に使用する情報を使用してSTRを作成し、次のようにWSSEncryptionParamsオブジェクトに配置します。

SecretKey dataEncKey = ... ; // assuming 128 bit AES key
String dataEncAlg = XMLURI.alg_aes128_CBC;
WSSecurityTokenReference str = ...

// Now put all this information into a WSSEncryptionParams
WSSEncryptionParams eParam = new WSSEncryptionParams(
dataEncAlg, dataEncKey, null, null, str);

前述の場合と同様、次のように暗号化対象の要素のリストと、関連するcontentOnlyとencDataIds配列を作成します。

Element elem1 = ... // one object to be encrypted
Element elem2 = … // another object to be encrypted
ArrayList objectList[] = new ArrayList();
objectList.add(elem1);
objectList.add(elem2);

// both these elements are not content only
boolean[] contentOnlys = { false, false };

// After encryption the EncryptedData elements will get these ids
String encDataIds[] = { "id1", "id2" };

最後に、次のようにencryptWithNoEncKeyメソッドをコールします。

WSSecurity ws = ...
XEEncryptedKey encKey = ws.encryptWithNoEncKey(objectList,
contentOnlys, encDataIds, new WSEncryptionParams[]{eParam, eParam});

この例では、両方の要素で同じencryptionParamsを使用しています。

9.2.6.3 SOAPヘッダーのEncryptedHeaderへの暗号化

コンテンツのみをfalseに設定して、SOAPヘッダー・ブロックで暗号化メソッドをコールすると、SOAPヘッダー・ブロック全体がEncryptedData要素に暗号化されます。この要素はEncryptedHeader要素内に配置され、元のSOAPヘッダー・ブロックを置き換えます。

mustUnderstand属性とactor属性が現在のwsse:Securityヘッダーからコピーされます。

9.2.6.4 EncryptedKeyを使用したSOAPメッセージの復号化

EncryptedKeyを使用してSOAPメッセージを復号化するには、次を使用します。

WSSecurity.decrypt(XEEncryptedKey, PrivateKey, SOAPMessage)

最初に、所定のPrivateKeyでEncryptedKeyを復号化して対称鍵を取得し、この対称鍵を使用して、EncryptedKey内のすべての参照を復号化します。

PrivateKeyがわからない場合は、次をコールします。

decrypt(XEEncryptedKey, SOAPMessage)

これにより、EncryptedKeyのKeyInfoが調べられ、登録されたコールバックがコールされて秘密鍵が取得されます。

EncryptedKeyの復号化形式がわかっている場合は、次を使用します。

decrypt(XEEncryptedKey, SecretKey, SOAPMessage)

これにより、所定の対称鍵を使用して、EncryptedKey内のすべての参照が復号化されます。

9.2.6.5 EncryptedKeyを使用しないSOAPメッセージの復号化

最上位レベルのReferenceListに示されたすべての要素(または添付ファイル)を復号化する場合は、次を使用します。

decrypt(XEReferenceList, SecretKey, SOAPMessage)

これにより、所定の対称鍵を使用して、ReferenceList内のすべての参照が復号化されます。この関数は、すべての参照が同じ鍵で暗号化されていることを前提としています。

SecretKeyがわからない場合、またはすべての参照が同じ鍵で暗号化されていない場合は、SecretKeyにnullを入れてdecryptし、各EncrytedDataのKeyInfoを調べ、登録されたコールバックをコールして対称鍵を取得します。

9.3 Web Services Securityの追加リソース

OASIS WSS SOAPメッセージ・セキュリティ仕様やOASIS WSSユーザー名トークン・プロファイル仕様などのOASIS仕様には、Webサービス・セキュリティの詳細が記載されています。

Webサービス・セキュリティの詳細は、次のリソースを参照してください。

- OASIS WSS SOAPメッセージ・セキュリティ仕様

- OASIS WSSユーザー名トークン・プロファイル仕様

- OASIS WSS X.509証明書トークン・プロファイル仕様

- OASIS WSS SAMLアサーション・トークン・プロファイル仕様

- OASIS WSS SWAトークン・プロファイル仕様1.1

関連項目:

これらのドキュメントへのリンクは、「リファレンス」を参照してください。

9.4 Oracle Web Services SecurityのJava APIリファレンス

Oracle Web Services Security APIで利用可能なクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

10 Oracle Liberty SDK

Java開発者は、Oracle Liberty SDKを使用して、シングル・サインオン(SSO)およびフェデレーテッド・アイデンティティ管理(FIM)ソリューションを設計および開発することができます。このSDKは、Liberty Alliance ID-FF 1.1および1.2の仕様に準拠するシステムの開発と統合のあらゆる面の統一、単純化および拡張を目的としています。

Liberty Allianceは、個人および企業が貴重なアイデンティティ情報のプライバシやセキュリティを危険にさらすことなく、ほとんどすべてのトランザクションを実行できるようにすることを目標に設立されました。Liberty Allianceによって発行された仕様は、オープンなアイデンティティ・フェデレーション・フレームワークに基づいており、これにより、業務提携する企業は、組織をまたがるフェデレーテッド・ネットワーク・アイデンティティ・モデルに基づいた業務関係を形成できるようになります。

この章には次のトピックが含まれます:

- Oracle Liberty SDKの機能と利点

- Oracle Liberty 1.1

- Oracle Liberty 1.2

10.1 Oracle Liberty SDKの機能と利点

Oracle Liberty SDK 1.1および1.2では、直観的でわかりやすいJava APIを使用することでソフトウェア開発の単純化が実現されています。このツールキットによって、Liberty Alliance仕様に準拠するソリューションの開発を支援するツール、情報およびサンプルが提供されます。また、ツールキットは、アプレット、アプリケーション、EJB、サーブレット、JSPなど、あらゆる既存のJavaソリューションに透過的に統合できます。

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

- Liberty Alliance ID-FFバージョン1.1および1.2仕様のサポート

- Libertyベースのシングル・サインオンおよびフェデレーテッド・アイデンティティ・プロトコルのサポート

- SAML 1.0/1.1仕様のサポート

関連項目:

Liberty Alliance仕様は、http://www.projectliberty.org/resources/specifications.phpを参照してください。

10.2 Oracle Liberty 1.1

Oracle Liberty 1.1は、Liberty Alliance ID-FF 1.1仕様に準拠しています。認証リクエスト/レスポンス、ログアウト・リクエスト/レスポンス、フェデレーション終了などの機能を提供するクラス、インタフェースおよびメソッドが含まれています。

この項では、Oracle Liberty 1.1の環境設定方法と使用方法、およびOracle Liberty 1.1のクラスとインタフェースについて説明します。次の項目が含まれます。

- Oracle Liberty 1.1の環境設定

- Oracle Liberty 1.1のクラスとインタフェースの概要

- Oracle Liberty 1.1のAPIリファレンス

10.2.1 Oracle Liberty 1.1の環境設定

Oracle Liberty 1.1の環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルおよびclassファイルへのCLASSPATH変数を設定します。

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

10.2.1.1 Oracle Liberty 1.1のシステム要件の理解

Oracle Liberty 1.1を使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。

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

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar

- osdt_saml.jar

- org.jaxen_1.1.1.jarファイル(Oracle XML Securityディストリビューションに含まれるJaxen XPathエンジン)

- osdt_lib_v11.jarファイル

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

%CLASSPATH%;%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_xmlsec.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_saml.jar;
%ORACLE_HOME%\modules\org.jaxen_1.1.1.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_lib_v11.jar;

関連項目:

CLASSPATH環境変数の設定

10.2.2 Oracle Liberty 1.1のクラスとインタフェースの概要

Oracle Liberty SDK v. 1.1には、認証リクエスト/レスポンス、ログアウト・リクエスト/レスポンス、フェデレーション終了などの機能を提供するコア・クラスとインタフェースおよびサポート・クラスとインタフェースが含まれています。

この項では、Oracle Liberty SDK v. 1.1の有用なクラスとインタフェースの一部を示します。この項の内容は、次のとおりです。

- コア・クラスとインタフェースの使用方法

- サポート・クラスとインタフェースの使用方法

10.2.2.1 コア・クラスとインタフェースの使用方法

Oracle Liberty SDK v. 1.1のコア・クラスおよびインタフェースにより、認証リクエストおよびレスポンス要素、ログアウト・リクエストおよびレスポンス要素、登録名識別子を作成できます。

この項には次のトピックが含まれます。

- oracle.security.xmlsec.liberty.v11.AuthnRequestクラスの使用方法

- oracle.security.xmlsec.liberty.v11.AuthnResponseクラスの使用方法

- oracle.security.xmlsec.liberty.v11.FederationTerminationNotificationクラスの使用方法

- oracle.security.xmlsec.liberty.v11.LogoutRequestクラスの使用方法

- oracle.security.xmlsec.liberty.v11.LogoutResponseクラスの使用方法

- oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierRequestクラスの使用方法

- oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierResponseクラスの使用方法

10.2.2.1.1 oracle.security.xmlsec.liberty.v11.AuthnRequestクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのAuthnRequest要素を表します。

次の例に、新しいAuthnRequest要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
AuthnRequest authnRequest = new AuthnRequest(doc);
doc.getDocumentElement().appendChild(authnRequest);

次の例に、AuthnRequest要素をXML文書から取得する方法を示します。

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

// Get list of all AuthnRequest elements in the document.
NodeList arList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "AuthnRequest");
if (arList.getLength() == 0)
System.err.println("No AuthnRequest elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v11.AuthnRequest object and process
for (int s = 0, n = arList.getLength(); s < n; ++s)
{
AuthnRequest authnRequest =
new AuthnRequest((Element)arList.item(s));

// Process AuthnRequest element
...
}

10.2.2.1.2 oracle.security.xmlsec.liberty.v11.AuthnResponseクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのAuthnResponse要素を表します。

次の例に、新しいAuthnResponse要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
AuthnResponse authnResponse = new AuthnResponse(doc);
doc.getDocumentElement().appendChild(authnResponse);

次の例に、AuthnResponse要素をXML文書から取得する方法を示します。

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

// Get list of all AuthnResponse elements in the document.
NodeList arList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "AuthnResponse");
if (arList.getLength() == 0)
System.err.println("No AuthnResponse elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v11.AuthnResponse object and process
for (int s = 0, n = arList.getLength(); s < n; ++s)
{
AuthnResponse authnResponse =
new AuthnResponse((Element)arList.item(s));
// Process AuthnResponse element
...
}

10.2.2.1.3 oracle.security.xmlsec.liberty.v11.FederationTerminationNotificationクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのFederationTerminationNotification要素を表します。

次の例に、新しいフェデレーション終了通知要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
FederationTerminationNotification ftn =
new FederationTerminationNotification(doc);
doc.getDocumentElement().appendChild(ftn);

次の例に、フェデレーション終了通知要素をXML文書から取得する方法を示します。

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

// Get list of all FederationTerminationNotification elements in the document
NodeList ftnList = doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"FederationTerminationNotification");
if (ftnList.getLength() == 0)
System.err.println("No FederationTerminationNotification elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v11.FederationTerminationNotification
// object and process
for (int s = 0, n = ftnList.getLength(); s < n; ++s)
{
FederationTerminationNotification ftn =
new FederationTerminationNotification((Element)ftnList.item(s));

// Process FederationTerminationNotification element
...
}

10.2.2.1.4 oracle.security.xmlsec.liberty.v11.LogoutRequestクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのLogoutRequest要素を表します。

次の例に、新しいLogoutRequest要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
LogoutRequest lr = new LogoutRequest(doc);
doc.getDocumentElement().appendChild(lr);

次の例に、LogoutRequest要素をXML文書から取得する方法を示します。

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

// Get list of all LogoutRequest elements in the document.
NodeList lrList = doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"LogoutRequest");
if (lrList.getLength() == 0)
System.err.println("No LogoutRequest elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v11.LogoutRequest
// object and process
for (int s = 0, n = lrList.getLength(); s < n; ++s)
{
LogoutRequest lr = new LogoutRequest((Element)lrList.item(s));

// Process LogoutRequest element
...
}

10.2.2.1.5 oracle.security.xmlsec.liberty.v11.LogoutResponseクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのLogoutResponse要素を表します。

次の例に、新しいLogoutResponse要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
LogoutResponse lr = new LogoutResponse(doc);
doc.getDocumentElement().appendChild(lr);

次の例に、LogoutResponse要素をXML文書から取得する方法を示します。

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

// Get list of all LogoutResponse elements in the document.
NodeList lrList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "LogoutResponse");
if (lrList.getLength() == 0)
System.err.println("No LogoutResponse elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v11.LogoutResponse
// object and process
for (int s = 0, n = lrList.getLength(); s < n; ++s)
{
LogoutResponse lr = new LogoutResponse((Element)lrList.item(s));

// Process LogoutResponse element
...
}

10.2.2.1.6 oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierRequestクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのRegisterNameIdentifierRequest要素を表します。

次の例に、新しいRegisterNameIdentifierRequest要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
RegisterNameIdentifierRequest rnir =
new RegisterNameIdentifierRequest(doc);
doc.getDocumentElement().appendChild(rnir);

次の例に、RegisterNameIdentifierRequest要素をXML文書から取得する方法を示します。

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

// Get list of all RegisterNameIdentifierRequest elements in the document
NodeList rnirList = doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"RegisterNameIdentifierRequest");
if (rnirList.getLength() == 0)
System.err.println("No RegisterNameIdentifierRequest elements found.");

// Convert each org.w3c.dom.Node object to an
//oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierRequest
// object and process
for (int s = 0, n = rnirList.getLength(); s < n; ++s)
{
RegisterNameIdentifierRequest rnir = new
RegisterNameIdentifierRequest((Element)rnirList.item(s));

// Process RegisterNameIdentifierRequest element
...
}

10.2.2.1.7 oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierResponseクラスの使用方法

このクラスは、Libertyプロトコル・スキーマのRegisterNameIdentifierResponse要素を表します。

次の例に、新しいRegisterNameIdentifierResponse要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
RegisterNameIdentifierResponse rnir = new RegisterNameIdentifierResponse(doc);
doc.getDocumentElement().appendChild(rnir);

次の例に、RegisterNameIdentifierResponse要素をXML文書から取得する方法を示します。

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

// Get list of all RegisterNameIdentifierResponse elements in the document
NodeList rnirList = doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"RegisterNameIdentifierResponse");
if (rnirList.getLength() == 0)
System.err.println("No RegisterNameIdentifierResponse elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v11.RegisterNameIdentifierResponse
// object and process
for (int s = 0, n = rnirList.getLength(); s < n; ++s)
{
RegisterNameIdentifierResponse rnir = new
RegisterNameIdentifierResponse((Element)rnirList.item(s));

// Process RegisterNameIdentifierResponse element
...
}

10.2.2.2 サポート・クラスとインタフェースの使用方法

この項では、Oracle Liberty SDK v. 1.1のサポート・クラスとインタフェースについて説明します。

サポート・クラスとインタフェースを次に示します。

- oracle.security.xmlsec.liberty.v11.LibertyInitializerクラスの使用方法

- oracle.security.xmlsec.liberty.v11.LibertyURIインタフェース

- oracle.security.xmlsec.liberty.v11.ac.AuthenticationContextURIインタフェースの使用方法

- The oracle.security.xmlsec.util.ac.AuthenticationContextStatement class

- oracle.security.xmlsec.saml.SAMLURIインタフェース

- oracle.security.xmlsec.saml.SAMLMessageクラス

10.2.2.2.1 oracle.security.xmlsec.liberty.v11.LibertyInitializerクラスの使用方法

oracle.security.xmlsec.liberty.v11.LibertyInitializerクラスは、Oracle Liberty SDKライブラリのロード時の初期化と構成を処理します。このクラスの静的なinitialize()メソッドをコールしてから、Oracle Liberty SDKのAPIをコールする必要があります。

10.2.2.2.2 oracle.security.xmlsec.liberty.v11.LibertyURIインタフェース

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

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

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

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

- LibertyプロファイルのネームスペースURIはprof_で始まります。

10.2.2.2.3 oracle.security.xmlsec.liberty.v11.ac.AuthenticationContextURIインタフェースの使用方法

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

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

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

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

10.2.2.2.4 oracle.security.xmlsec.util.ac.AuthenticationContextStatementクラス

oracle.security.xmlsec.util.ac.AuthenticationContextStatementクラスは、Liberty認証コンテキスト・スキーマの最上位レベルのAuthenticationContextStatement要素を表す抽象クラスです。このクラスの各具体実装は、Liberty認証コンテキスト仕様で定義された各クラスを表します。

10.2.2.2.5 oracle.security.xmlsec.saml.SAMLURIインタフェース

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

- SAML 1.0仕様に定義されているアクションのネームスペースURIは、action_で始まります。

- SAML 1.0仕様に定義されている認証メソッドのネームスペースURIは、authentication_method_で始まります。

- SAML 1.0仕様に定義されている確認メソッドのネームスペースURIは、confirmation_method_で始まります。

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

10.2.2.2.6 oracle.security.xmlsec.saml.SAMLMessageクラス

oracle.security.xmlsec.saml.SAMLMessageクラスは、すべてのSAMLおよびSAML拡張メッセージのベース・クラスです。署名することができ、XML-DSIG構造体を含むことが可能です。

10.2.3 Oracle Liberty 1.1のAPIリファレンス

Oracle Liberty SDK v1.1で利用可能なクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

10.3 Oracle Liberty 1.2

Oracle Liberty 1.2は、Liberty Alliance ID-FF 1.2仕様に準拠しています。環境を設定してOracle Liberty 1.2のクラスとインタフェースを使用することにより、仕様に準拠する機能を提供できます。

この項では、Oracle Liberty 1.2のクラスとインタフェース、およびOracle Liberty 1.2の環境設定方法と使用方法について説明します。

これらの項目が含まれます。

- Oracle Liberty 1.2の環境設定

- Oracle Liberty 1.2のクラスとインタフェースの概要

- Oracle Liberty SDKリリース1.2のAPIリファレンス

10.3.1 Oracle Liberty 1.2の環境設定

Oracle Liberty 1.2の環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルおよびclassファイルへのCLASSPATH変数を設定します。

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

Oracle Liberty 1.2を使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。また、PATH環境変数にJava binディレクトリが指定されていることを確認してください。

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

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar

- osdt_saml.jar

- org.jaxen_1.1.1.jarファイル(Oracle XML Securityディストリビューションに含まれるJaxen XPathエンジン)

- osdt_lib_v12.jar

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

setenv CLASSPATH $CLASSPATH:$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cert.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_xmlsec.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_saml.jar:
$ORACLE_HOME/modules/org.jaxen_1.1.1.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_lib_v12.jar

10.3.2 Oracle Liberty 1.2のクラスとインタフェースの概要

Oracle Liberty 1.2には、複数のコア・クラスとインタフェースおよびサポート・クラスとインタフェースが含まれています。Liberty 1.2の有用なクラスには、アサーション、リクエスト、レスポンス、認証リクエスト/レスポンスおよびその他が含まれます。

この項では、Oracle Liberty SDKバージョン1.2の有用なクラスとインタフェースの一部を示します。この項の内容は、次のとおりです。

- コア・クラスとインタフェース

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

10.3.2.1 コア・クラスとインタフェース

この項では、Oracle Liberty SDKバージョン1.2のコア・クラスとインタフェースについて説明します。

コア・クラスを次に示します。

- oracle.security.xmlsec.saml.Assertionクラスの使用方法

- oracle.security.xmlsec.samlp.Requestクラスの使用方法

- oracle.security.xmlsec.samlp.Responseクラスの使用方法

- oracle.security.xmlsec.liberty.v12.AuthnRequestクラスの使用方法

- oracle.security.xmlsec.liberty.v12.AuthnResponseクラスの使用方法

- oracle.security.xmlsec.liberty.v12.FederationTerminationNotificationクラスの使用方法

- oracle.security.xmlsec.liberty.v12.LogoutRequestクラスの使用方法

- oracle.security.xmlsec.liberty.v12.LogoutResponseクラスの使用方法

- oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierRequestクラスの使用方法

- oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierResponseクラスの使用方法

10.3.2.1.1 oracle.security.xmlsec.saml.Assertionクラスの使用方法

oracle.security.xmlsec.saml.Assertionクラスは、SAMLアサーション・スキーマのAssertion要素を表します。

次の例に、新しいアサーション要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Assertion assertion = new Assertion(doc);
doc.getDocumentElement().appendChild(assertion);

次の例に、アサーション要素をXML文書から取得する方法を示します。

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

// Get list of all Assertion elements in the document
NodeList assrtList =
doc.getElementsByTagNameNS(SAMLURI.ns_saml, "Assertion");
if (assrtList.getLength() == 0)
System.err.println("No Assertion elements found.");

// Convert each org.w3c.dom.Node object to
// an oracle.security.xmlsec.saml.Assertion
// object and process
for (int s = 0, n = assrtList.getLength(); s < n; ++s)
{
Assertion assertion = new Assertion((Element)assrtList.item(s));

// Process Assertion element
...
}

10.3.2.1.2 oracle.security.xmlsec.samlp.Requestクラスの使用方法

oracle.security.xmlsec.samlp.Requestクラスは、SAMLプロトコル・スキーマのRequest要素を表します。

次の例に、新しいRequest要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Request request = new Request(doc);
doc.getDocumentElement().appendChild(request);

次の例に、Request要素をXML文書から取得する方法を示します。

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

// Get list of all Request elements in the document
NodeList reqList =
doc.getElementsByTagNameNS(SAMLURI.ns_samlp, "Request");
if (reqList.getLength() == 0)
System.err.println("No Request elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.samlp.Request
// object and process
for (int s = 0, n = reqList.getLength(); s < n; ++s)
{
Request request = new Request((Element)reqList.item(s));

// Process Request element
...
}

10.3.2.1.3 oracle.security.xmlsec.samlp.Responseクラスの使用方法

oracle.security.xmlsec.samlp.Responseクラスは、SAMLプロトコル・スキーマのResponse要素を表します。

次の例に、新しい要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
Response response = new Response(doc);
doc.getDocumentElement().appendChild(response);

次の例に、Response要素をXML文書から取得する方法を示します。

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

// Get list of all Response elements in the document
NodeList respList =
doc.getElementsByTagNameNS(SAMLURI.ns_samlp, "Response");
if (respList.getLength() == 0)
System.err.println("No Response elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.samlp.Response
// object and process
for (int s = 0, n = respList.getLength(); s < n; ++s)
{
Response response = new Response((Element)respList.item(s));

// Process Response element
...
}

10.3.2.1.4 oracle.security.xmlsec.liberty.v12.AuthnRequestクラスの使用方法

oracle.security.xmlsec.liberty.v12.AuthnRequestクラスは、Libertyプロトコル・スキーマのAuthnRequest要素を表します。

次の例に、新しい認証リクエスト要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
AuthnRequest authnRequest = new AuthnRequest(doc);
doc.getDocumentElement().appendChild(authnRequest);

次の例に、AuthnRequest要素をXML文書から取得する方法を示します。

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

// Get list of all AuthnRequest elements in the document
NodeList arList = doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "AuthnRequest");

if (arList.getLength() == 0)
System.err.println("No AuthnRequest elements found.");

// Convert each org.w3c.dom.Node object to
// an oracle.security.xmlsec.liberty.v12.AuthnRequest
// object and process
for (int s = 0, n = arList.getLength(); s < n; ++s)
{
AuthnRequest authnRequest = new AuthnRequest((Element)arList.item(s));

// Process AuthnRequest element
...
}

10.3.2.1.5 oracle.security.xmlsec.liberty.v12.AuthnResponseクラスの使用方法

oracle.security.xmlsec.liberty.v12.AuthnResponseクラスは、Libertyプロトコル・スキーマのAuthnResponse要素を表します。

次の例に、新しい認証レスポンス要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
AuthnResponse authnResponse = new AuthnResponse(doc);
doc.getDocumentElement().appendChild(authnResponse);

次の例に、AuthnResponse要素をXML文書から取得する方法を示します。

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

// Get list of all AuthnResponse elements in the document.
NodeList arList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "AuthnResponse");
if (arList.getLength() == 0)
System.err.println("No AuthnResponse elements found.");

// Convert each org.w3c.dom.Node object to
// an oracle.security.xmlsec.liberty.v12.AuthnResponse
// object and process
for (int s = 0, n = arList.getLength(); s < n; ++s)
{
AuthnResponse authnResponse =
new AuthnResponse((Element)arList.item(s));

// Process AuthnResponse element
...
}

10.3.2.1.6 oracle.security.xmlsec.liberty.v12.FederationTerminationNotificationクラスの使用方法

oracle.security.xmlsec.liberty.v12.FederationTerminationNotificationクラスは、Libertyプロトコル・スキーマのFederationTerminationNotification要素を表します。

次の例に、新しいフェデレーション終了通知要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
FederationTerminationNotification ftn =
new FederationTerminationNotification(doc);
doc.getDocumentElement().appendChild(ftn);

次の例に、フェデレーション終了通知要素をXML文書から取得する方法を示します。

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

// Get list of all FederationTerminationNotification elements in the document
NodeList ftnList = doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"FederationTerminationNotification");
if (ftnList.getLength() == 0)
System.err.println("No FederationTerminationNotification elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v12.FederationTerminationNotification
// object and process
for (int s = 0, n = ftnList.getLength(); s < n; ++s)
{
FederationTerminationNotification ftn = new
FederationTerminationNotification((Element)ftnList.item(s));

// Process FederationTerminationNotification element
...
}

10.3.2.1.7 oracle.security.xmlsec.liberty.v12.LogoutRequestクラスの使用方法

oracle.security.xmlsec.liberty.v12.LogoutRequestクラスは、Libertyプロトコル・スキーマのLogoutRequest要素を表します。

次の例に、新しい要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
LogoutRequest lr = new LogoutRequest(doc);
doc.getDocumentElement().appendChild(lr);

次の例に、ログアウト・リクエスト要素をXML文書から取得する方法を示します。

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

// Get list of all LogoutRequest elements in the document
NodeList lrList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "LogoutRequest");
if (lrList.getLength() == 0)
System.err.println("No LogoutRequest elements found.");

// Convert each org.w3c.dom.Node object to
// an oracle.security.xmlsec.liberty.v12.LogoutRequest
// object and process
for (int s = 0, n = lrList.getLength(); s < n; ++s)
{
LogoutRequest lr = new LogoutRequest((Element)lrList.item(s));

// Process LogoutRequest element
...
}

10.3.2.1.8 oracle.security.xmlsec.liberty.v12.LogoutResponseクラスの使用方法

oracle.security.xmlsec.liberty.v12.LogoutResponseクラスは、Libertyプロトコル・スキーマのLogoutResponse要素を表します。

次の例に、新しいログアウト・レスポンス要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
LogoutResponse lr = new LogoutResponse(doc);
doc.getDocumentElement().appendChild(lr);

次の例に、ログアウト・レスポンス要素をXML文書から取得する方法を示します。

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

// Get list of all LogoutResponse elements in the document
NodeList lrList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty, "LogoutResponse");
if (lrList.getLength() == 0)
System.err.println("No LogoutResponse elements found.");

// Convert each org.w3c.dom.Node object to
// an oracle.security.xmlsec.liberty.v12.LogoutResponse
// object and process
for (int s = 0, n = lrList.getLength(); s < n; ++s)
{
LogoutResponse lr = new LogoutResponse((Element)lrList.item(s));

// Process LogoutResponse element
...
}

10.3.2.1.9 oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierRequestクラスの使用方法

oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierRequestクラスは、Libertyプロトコル・スキーマのRegisterNameIdentifierRequest要素を表します。

次の例に、新しいRegisterNameIdentifierRequest要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
RegisterNameIdentifierRequest rnir = new RegisterNameIdentifierRequest(doc);
doc.getDocumentElement().appendChild(rnir);

次の例に、RegisterNameIdentifierRequest要素をXML文書から取得する方法を示します。

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

// Get list of all
// RegisterNameIdentifierRequest elements
// in the document
NodeList rnirList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"RegisterNameIdentifierRequest");
if (rnirList.getLength() == 0)
System.err.println("No RegisterNameIdentifierRequest elements found.");

// Convert each org.w3c.dom.Node object to a
// oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierRequest
// object and process
for (int s = 0, n = rnirList.getLength(); s < n; ++s)
{
RegisterNameIdentifierRequest rnir =
new RegisterNameIdentifierRequest((Element)rnirList.item(s));

// Process RegisterNameIdentifierRequest element
...
}

10.3.2.1.10 oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierResponseクラスの使用方法

oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierResponseクラスは、Libertyプロトコル・スキーマのRegisterNameIdentifierResponse要素を表します。

次の例に、新しいRegisterNameIdentifierResponse要素を作成して文書に追加する方法を示します。

Document doc = Instance of org.w3c.dom.Document;
RegisterNameIdentifierResponse rnir =
new RegisterNameIdentifierResponse(doc);
doc.getDocumentElement().appendChild(rnir);

次の例に、RegisterNameIdentifierResponse要素をXML文書から取得する方法を示します。

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

// Get list of all RegisterNameIdentifierResponse elements in the document
NodeList rnirList =
doc.getElementsByTagNameNS(LibertyURI.ns_liberty,
"RegisterNameIdentifierResponse");

if (rnirList.getLength() == 0)
System.err.println("No RegisterNameIdentifierResponse elements found.");

// Convert each org.w3c.dom.Node object to an
// oracle.security.xmlsec.liberty.v12.RegisterNameIdentifierResponse
// object and process
for (int s = 0, n = rnirList.getLength(); s < n; ++s)
{
RegisterNameIdentifierResponse rnir = new
RegisterNameIdentifierResponse((Element)rnirList.item(s));

// Process RegisterNameIdentifierResponse element
...
}

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

この項では、Oracle Liberty SDKバージョン1.2のサポート・クラスとインタフェースについて説明します。

- oracle.security.xmlsec.liberty.v12.LibertyInitializerクラス

- oracle.security.xmlsec.liberty.v12.LibertyURIインタフェース

- oracle.security.xmlsec.util.ac.AuthenticationContextStatementクラス

- oracle.security.xmlsec.saml.SAMLInitializerクラス

- oracle.security.xmlsec.saml.SAMLURIインタフェース

10.3.2.2.1 oracle.security.xmlsec.liberty.v12.LibertyInitializerクラス

このクラスは、Oracle Liberty SDK 1.2ライブラリのロード時の初期化と構成を処理します。このクラスの静的なinitialize()メソッドをコールしてから、Oracle Liberty SDK 1.2のAPIをコールする必要があります。

10.3.2.2.2 oracle.security.xmlsec.liberty.v12.LibertyURIインタフェース

このインタフェースは、アルゴリズム、ネームスペースおよびオブジェクトのURI文字列定数を定義します。

10.3.2.2.3 oracle.security.xmlsec.util.ac.AuthenticationContextStatementクラス

これは、Liberty認証コンテキスト・スキーマの最上位レベルのAuthenticationContextStatement要素を表す抽象クラスです。このクラスの各具体実装は、Liberty認証コンテキスト仕様で定義された各クラスを表します。

10.3.2.2.4 oracle.security.xmlsec.saml.SAMLInitializerクラス

このクラスは、Oracle SAMLライブラリのロード時の初期化と構成を処理します。リリース1.1では、このクラスの静的なinitialize(int major, int minor)メソッドをコールしてから、Oracle SAML Toolkit API for SAML 1.1をコールする必要があります。

10.3.2.2.5 oracle.security.xmlsec.saml.SAMLURIインタフェース

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

- SAML 1.1仕様に定義されているアクションのネームスペースURIは、action_で始まります。

- SAML 1.1仕様に定義されている認証メソッドのネームスペースURIは、authentication_method_で始まります。

- SAML 1.1仕様に定義されている確認メソッドのネームスペースURIは、confirmation_method_で始まります。

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

10.3.2.2.6 oracle.security.xmlsec.saml.SAMLMessageクラス

oracle.security.xmlsec.saml.SAMLMessageは、すべてのSAMLおよびSAML拡張メッセージのベース・クラスです。署名することができ、XML-DSIG構造体を含むことが可能です。

10.3.3 Oracle Liberty SDKリリース1.2のAPIリファレンス

Oracle Liberty SDK v1.2 APIで利用可能なクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

11 Oracle XKMS

XKMS (XML Key Management Specification)は、公開鍵の管理に関するW3C仕様です。Oracle XKMS APIはこの仕様に準拠しています。これを使用すると、開発者はデジタル署名の処理に関するXMLトランザクションを記述できるため、公開鍵のインフラストラクチャを簡単に処理できるようになります。

この章には次のトピックが含まれます:

- Oracle XKMSの機能と利点の理解

- Oracle XKMSの環境設定

- コア・クラスとインタフェース

- Oracle XKMSのJava APIリファレンス

11.1 Oracle XKMSの機能と利点の理解

Oracle XKMSは、複数の業務やアプリケーションにわたって鍵の検出とユーザー・アイデンティティの検証を行うためのツールキットからなるPure Javaソリューションです。これを使用すると、Webサービスに必要な安全かつ信頼できるメッセージングをサポートできるほか、PKIに関連するコストや複雑性をある程度軽減することができます。

Oracle XKMSでは次の機能が提供されます。

- PKI機能への容易なアクセス - W3C XKMS Standardを実装したOracle XKMSは、XMLの簡易性とPKIの堅牢性を兼ね備えています。このツールキットを利用すると、開発者は安全で軽量なクライアント・ソフトウェアをデプロイすることにより、堅牢なアプリケーション機能を簡単にデプロイできるようになります。

- 鍵/証明書のライフ・サイクルの完全サポート - Oracle XKMSでは、軽量のWebサービス・インフラストラクチャを使用して、エンタープライズ・アプリケーションによる署名と暗号鍵の検出、取得、検証を行うことができます。

- XML署名を使用したXKMSメッセージのセキュリティ保護 - Oracle XMLツールキットを使用して、リクエストとレスポンスにデジタル署名を付けることができます。

- ネイティブ・メソッドのない100% Java

- JAXP 1.1準拠のXMLパーサーとの連携

Oracle XKMSライブラリには、次のパッケージが含まれています。

表11-1 Oracle XKMSライブラリに含まれるパッケージ

パッケージ

説明

oracle.security.xmlsec.xkms

主なXKMSメッセージ要素が含まれています。

oracle.security.xmlsec.xkms.xkiss

鍵情報サービスの仕様に関するクラスが含まれています。

oracle.security.xmlsec.xkms.xkrss

鍵登録サービスの仕様に関するクラスが含まれています。

oracle.security.xmlsec.xkms.util

定数とユーティリティ・クラスが含まれています。

11.2 Oracle XKMSの環境設定

Oracle XKMSの環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルおよびclassファイルへのCLASSPATH変数を設定します。

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

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

- Java Development Kit (JDK)バージョン1.6以上

- Oracle XML Securityツールキット

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

- osdt_core.jar

- osdt_cert.jar

- osdt_xmlsec.jar

- org.jaxen_1.1.1.jar。セキュリティ・ツール・ディストリビューションの$ORACLE_HOME/modules/ディレクトリにあります。Oracle XML Securityは、XPathの処理のためにJaxen XPathエンジンを利用します。

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

C:%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_xmlsec.jar;
%ORACLE_HOME%\modules\org.jaxen_1.1.1.jar;

関連項目:

CLASSPATH環境変数の設定

11.3 コア・クラスとインタフェース

Oracle XKMSのコア・クラスにより、メッセージ・リクエストおよび結果を検索、検証およびリカバリできます。Oracle XKMSのコア・クラスとインタフェースを使用方法については、コード例を参照してください。

コア・クラスを次に示します。

- oracle.security.xmlsec.xkms.xkiss.LocateRequest

- oracle.security.xmlsec.xkms.xkiss.LocateResultクラスの使用方法

- oracle.security.xmlsec.xkms.xkiss.ValidateRequestクラスの使用方法

- oracle.security.xmlsec.xkms.xkiss.ValidateResultクラスの使用方法

- oracle.security.xmlsec.xkms.xkrss.RecoverRequestクラスの使用方法

- oracle.security.xmlsec.xkms.xkrss.RecoverResultクラスの使用方法

11.3.1 oracle.security.xmlsec.xkms.xkiss.LocateRequest

oracle.security.xmlsec.xkms.xkiss.LocateRequestクラスは、XKMSのLocateRequest要素を表します。例を参照してLocateRequestのインスタンスを作成し、RespondWith属性をLocateRequestに追加できます。

// Parse the XML document containing the dsig:Signature.
Document sigDoc = //Instance of org.w3c.dom.Document;

//Create Query Key Binding
QueryKeyBinding queryKeyBinding = new QueryKeyBinding(sigDoc);
queryKeyBinding.setTimeInstant(new Date());

// Create the xkms:LocateRequest.
LocateRequest loc = new LocateRequest(sigDoc, queryKeyBinding);

LocateRequestタイプのクライアント・リクエストには、xkms:RespondWith属性を含める必要があります。

次の例に、RespondWithをLocateRequestに追加する方法を示します。

//Add xkms:RespondWith as X.509 Certificate.
loc.addRespondWith(XKMSURI.respondWith_X509Cert);

11.3.2 oracle.security.xmlsec.xkms.xkiss.LocateResultクラスの使用方法

oracle.security.xmlsec.xkms.xkiss.LocateResultクラスは、xkms:LocateResult要素を表します。LocateResult要素のインスタンスを作成できます。LocateRequestにX509CertificateのRespondWith属性が含まれている場合は、X509証明書をLocateResultに追加できます。

次に例を示します。

//Parse the XML document containin the dsig:Signature
Document sigDoc = //Instance of org.w3c.doc.Document;

// Create the xkms:LocateResult
LocateResult locRes = new LocateResult(sigDoc);

//Set ResultMajor to Success.
locRes.setResultCode(XKMSURI.result_major_success, null);

LocateRequestにX509CertificateのRespondWith属性が含まれている場合は、次のコードを使用してX509証明書をLocateResultに追加します。

//Creating a signature and adding X509 certificate to the KeyInfo element.
X509Certificate userCert = // Instance of java.security.cert.X509Certificate
XSSignature Sig = XSSignature.newInstance(sigDoc, "MySignature");
XSKeyInfo xsInfo = sig.getKeyInfo();
X509Data xData = xsInfo.createX509Data(userCert);

//Add X509Data to the KeyInfo
xsInfo.addKeyInfoData(xData);

//Set Key Binding and add KeyInfo the the KeyBinding
UnverifiedKeyBinding keyBinding = new UnverifiedKeyBinding(sigDoc);
keyBinding.setKeyInfo(xsInfo);

//Add Key Binding to LocateResult
locRes.addKeyBinding(keyBinding);

11.3.3 oracle.security.xmlsec.xkms.xkiss.ValidateRequestクラスの使用方法

oracle.security.xmlsec.xkms.xkiss.ValidateRequestクラスは、XKMSのxkms:ValidateRequest要素を表します。このクラスを使用して、xkms:ValidateRequest要素のインスタンスを作成できます。

次の例に、xkms:ValidateRequestのインスタンスを作成する方法を示します。

// Parse the XML document containing the dsig:Signature.
Document sigDoc = //Instance of org.w3c.dom.Document;

//Create Query Key Binding
QueryKeyBinding queryKeyBinding = new QueryKeyBinding(sigDoc);
queryKeyBinding.setTimeInstant(new Date());

// Create the xkms:ValidateRequest.
ValidateRequest validateReq = new ValidateRequest(sigDoc, queryKeyBinding);

ValidateRequestタイプのリクエストには、xkms:RespondWith属性を含める必要があります。次の例に、RespondWithをValidateRequestに追加する方法を示します。

//Add xkms:RespondWith as X.509 Certificate.
validateReq.addRespondWith(XKMSURI.respondWith_X509Cert);

11.3.4 oracle.security.xmlsec.xkms.xkiss.ValidateResultクラスの使用方法

oracle.security.xmlsec.xkms.xkiss.ValidateResultクラスを使用して、ValidateResultのインスタンスを作成できます。ValidateRequestに対するレスポンスでステータスを設定することもできます。

次の例に、ValidateResultのインスタンスを作成する方法を示します。

//Parse the XML document containin the dsig:Signature
Document sigDoc = //Instance of org.w3c.doc.Document;

// Create the xkms:ValidateResult
ValidateResult valRes = new ValidateResult(sigDoc);

//Set ResultMajor to Success.
valRes.setResultCode(XKMSURI.result_major_success, null);

ValidateRequestに対するレスポンスでステータスを設定するには、次のコードを使用します。

//Create a status element and add reasons.
Status responseStatus = new Status(sigDoc);
responseStatus.addValidReason(XKMSURI.reasonCode_IssuerTrust);
responseStatus.addValidReason(XKMSURI.reasonCode_RevocationStatus);
responseStatus.addValidReason(XKMSURI.reasonCode_ValidityInterval);
responseStatus.addValidReason(XKMSURI.reasonCode_Signature);

//Create a xkms:KeyBinding to add status and X509Data
XSKeyInfo xsInfo =
// Instance of oracle.security.xmlsec.dsig.XSKeyInfo,
// which contains X509Data
KeyBinding keyBinding = new KeyBinding(sigDoc);
keyBinding.setStatus(responseStatus);
keyBinding.setKeyInfo(xsInfo);

// Add the key binding to the ValidateResult.
valRes.addKeyBinding(keyBinding);

11.3.5 oracle.security.xmlsec.xkms.xkrss.RecoverRequestクラスの使用方法

oracle.security.xmlsec.xkms.xkrss.RecoverRequestクラスは、XKMSのRecoverRequest要素を表します。このクラスを使用して、RecoverRequestのインスタンスを作成できます。RecoverRequestにAuthentication要素とRecoverKeyBinding要素を追加することもできます。

次の例に、RecoverRequestのインスタンスを作成する方法を示します。

// Parse the XML document containing the dsig:Signature.
Document sigDoc = //Instance of org.w3c.dom.Document;

// Create the xkms:RecoverRequest
RecoverRequest recReq = new RecoverRequest(sigDoc);

//Set RespondWith to PrivateKey, so that the RecoverResult
contains the private key.
recReq.addRespondWith(XKMSURI.respondWith_PrivateKey);

RecoverRequestには、Authentication要素とRecoverKeyBinding要素を含める必要があります。これらを追加するには、次のコードを使用します。

//Create an instance of XSSignature.
XSSignature sig =
//Instance of oracle.security.xmlsec.dsig.XSSignature

//Create an instance of Authentication element.
Authentication auth = new Authentication(sigDoc);

//Set key binding authentication.
auth.setKeyBindingAuthentication(sig);

//Set Authentication for the RecoverRequest.
recReq.setAuthentication(auth);

//Add RecoverKeyBinding to RecoverRequest.
RecoverKeyBinding recKeyBind = new RecoverKeyBinding(sigDoc);

//Add Key Info on the key to be recovered.
XSKeyInfo xsInfo =
//Instance of oracle.security.xmlsec.dsig.XSKeyInfo
recKeyBind.setKeyInfo(xsInfo);

//Adding status, as known to the key holder, to the KeyBinding
Status keyStatus = new Status(sigDoc);
keyStatus.setStatusValue(XKMSURI.kbs_Indeterminate);
recKeyBind.setStatus(keyStatus);

//Adding RecoverKeyBinding to RecoverRequest.
recReq.setKeyBinding(recKeyBind);

11.3.6 oracle.security.xmlsec.xkms.xkrss.RecoverResultクラスの使用方法

oracle.security.xmlsec.xkms.xkrss.RecoverResultクラスは、xkms:RecoverResult要素を表します。このクラスを使用して、RecoverResultのインスタンスを作成できます。RecoverResultのKeyBindingを設定できます。RecoverResultに復元されたPrivateKeyを設定することもできます。

次の例に、RecoverResultのインスタンスを作成する方法を示します。

// Parse the XML document containing the dsig:Signature.
Document sigDoc = //Instance of org.w3c.dom.Document;

// Create the xkms:RecoverResult
RecoverResult recResult = new RecoverResult(sigDoc);

//Set ResultMajor to Success.
recResult.setResultCode(XKMSURI.result_major_success, null);

RecoverResultには、KeyBindingを設定する必要があります。この設定を行うには、次のコードを使用します。

//Create a xkms:KeyBinding to add status and X509Data
XSKeyInfo xsInfo =
//Instance of oracle.security.xmlsec.dsig.XSKeyInfo,
//which contains X509Data
KeyBinding keyBinding = new KeyBinding(sigDoc);
keyBinding.setKeyInfo(xsInfo);

//Create a status element and add reasons.
//Status is set to Invalid because the service can decide
//to revoke the key binding in the case of recovery.

Status responseStatus = new Status(sigDoc);
responseStatus.addInvalidReason(XKMSURI.reasonCode_IssuerTrust);
responseStatus.addInvalidReason(XKMSURI.reasonCode_RevocationStatus);
responseStatus.addInvalidReason(XKMSURI.reasonCode_ValidityInterval);
responseStatus.addInvalidReason(XKMSURI.reasonCode_Signature);
responseStatus.setStatusValue(XKMSURI.kbs_Invalid);

keyBinding.setStatus(responseStatus);

//Set KeyBinding into RecoverResult
recResult.addKeyBinding(keyBinding);

次の例に、復元されたPrivateKeyをRecoverResultに設定する方法を示します。

//Create an Instance of dsig:XEEncryptedData
XEEncryptedData encryptedData = //Instance of
oracle.security.xmlsec.enc.XEEncryptedData

//Create an instance of oracle.security.xmlsec.xkms.xkrss.PrivateKey
PrivateKey privKey = new PrivateKey(sigDoc);
privKey.setEncryptedData(encryptedData);

//Add PrivateKey to RecoverResult
recResult.setPrivateKey(privKey);

11.4 Oracle XKMSのJava APIリファレンス

Oracle XKMS APIで利用可能なクラス、インタフェースおよびメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。

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

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

12 Oracle JSON Web Token

Oracle JSON Web Token APIは、JSON Web Token (JWT)を幅広くサポートする完全なJavaソリューションです。このAPIを使用して、Base64urlでエンコードされたトークンの構成、トークンのヘッダーとクレームのパラメータ値の設定、トークンの解析と検証、およびトークンの署名とシリアライズを行うことができます。

リリース11gで導入されたOracle JSON Web Tokenでは、JSON Web Token (JWT)規格のサポートを提供します。

- Oracle JSON Web Tokenの機能と利点

- Oracle JSON Web Tokenの環境設定

- コア・クラスとインタフェースの使用方法

- Oracle JSON Web Tokenの使用例

- Oracle JSON Web Token Java APIのリファレンス

12.1 Oracle JSON Web Tokenの機能と利点

JSON Web Token (JWT)は、二者の間で転送されるクレームを表します。JWTは、HTTP認可ヘッダーやURI問合せパラメータなど、領域が制限された環境向けのコンパクトなトークン・フォーマットです。このAPIを使用して、Base64urlでエンコードされたトークンの構成、トークンのヘッダーとクレームのパラメータ値の設定、トークンの解析と検証、およびトークンの署名とシリアライズを行うことができます。

この項では、JWTの概念およびOracle JSON Web Tokenの主要な機能について説明します。

- JSON Web Tokenについて

- Oracle JSON Web Tokenの機能

12.1.1 JSON Web Tokenについて

JSON Web Token (JWT)は、二者の間で転送されるクレームを表します。JWTは、HTTP認可ヘッダーやURI問合せパラメータなど、領域が制限された環境向けのコンパクトなトークン・フォーマットです。JSONオブジェクトは、JSON Web Signature (JWS)を使用してデジタル署名され、オプションで、JSON Web Encryption (JWE)を使用して暗号化されます。

JWTにあるクレームは、base64urlでエンコードされていて0個以上の名前と値(名前は文字列で値は任意のJSON値)のペア(またはメンバー)で構成される、JSONオブジェクトとしてエンコードされます。各メンバーは、JWTによって表されるクレームです。

JWTは、次の3つのセグメントを連結したもので表されます。

- JWTヘッダー・セグメントは、トークンに適用される暗号化操作を指定します。

- JWTクレーム・セグメントは、JWTに含まれるクレームをエンコードします。

- JWT暗号セグメントには、トークンのコンテンツを保護する暗号化マテリアルが含まれます。

各セグメントは、ピリオド('.')文字で区切られます。3つのすべてのセグメントは、常にBase64urlでエンコードされた値になります。

関連項目:

JSON Web Token IETFのドラフト・ドキュメントは、http://tools.ietf.org/html/draft-jones-json-web-token-05にあります。

12.1.2 Oracle JSON Web Tokenの機能

このAPIを使用して、Base64urlでエンコードされたトークンの構成、トークンのヘッダーとクレームのパラメータ値の設定、トークンの解析と検証、およびトークンの署名とシリアライズを行うことができます。

Oracle JSON Web Tokenは、JWTトークンを幅広くサポートする完全なJavaソリューションです。APIを使用すると次のことが可能です。

- Base64urlでエンコードされたトークンの構成、および、ユーザー定義のヘッダーなど、トークンのヘッダーとクレームのパラメータ値の設定

- トークンの解析および検証

- トークンの署名およびシリアライズ

oracle.security.jwt.JwtTokenクラスは、JSON Web Token (JWT)を表します。oracle.security.jwt.JwtTokenの代表的なメソッドは、次のとおりです。

- setAlgorithm(String)、getAlgorithm()

- signAndSerialize(PrivateKey)

- serializeUnsigned()

- setPrincipal(String)、getPrincipal()、getIssuer()などのクレーム・メソッド

詳細は、Javadocにある、ヘッダーとクレームのパラメータ名および対応するget/setメソッドの表を参照してください。

関連項目:

Oracle JSON Web Token Java APIのリファレンス。

12.2 Oracle JSON Web Tokenの環境設定

Oracle JSON Web Tokenの環境を設定するには、Oracleセキュリティ開発ツールとJava Development Kit (JDK)をインストールし、必要なすべてのjarファイルおよびclassファイルへのCLASSPATH変数を設定します。

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

Oracle JSON Web Tokenを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。

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

- osdt_core.jarファイル

- osdt_cert.jarファイル

- jackson-core-1.1.1.jarファイル

- jackson-mapper-1.1.1.jarファイル

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

setenv CLASSPATH $CLASSPATH:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar:
$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_cert.jar:
$Jackson.library.path/jackson-core-1.1.1.jar
$Jackson.library.path/jackson-mapper-1.1.1.jar

実行時に、次の場所でJackson jarが検索されます。

1. 存在する場合、jarはシステム・クラス・パスからロードされます。

2. jarがシステム・クラス・パスに存在しない場合、システム・プロパティJackson.library.pathを調べます。存在する場合、jarはJava SEクライアントとJava EEクライアントの両方の場所からロードされます。

3. システム・プロパティJackson.library.pathが設定されていないか、Jackson jarがそこに見つからない場合、事前定義済の場所$ORACLE_HOME/modules (Java EE環境の場合)および現在のディレクトリ(Java SEクライアントの場合)から取得されます。

関連項目:

CLASSPATH環境変数の設定

12.3 コア・クラスとインタフェースの使用方法

Oracle JSON Web Tokenは、oracle.security.restsec.jwt.JwtTokenクラスで構成されます。このクラスの主な機能として、JWTトークンの構成、JWTトークンのパラメータ値の設定、トークンの署名、トークンの検証、トークンのシリアライズなどがあります。

「Oracle JSON Web Tokenの使用例」に、Oracle JSON Web Tokenの使用方法を示します。

12.4 Oracle JSON Web Tokenの使用例

Oracle JSON Web Tokenの使用方法については、JWTトークンの構成、トークンの署名、トークンの検証および署名なしのトークンのシリアライズの例を参照してください。

この項では、Oracle JSON Web Tokenの使用例を説明します。

- JWTトークンの作成

- JWTトークンの署名

- JWTトークンの検証

- 署名なしのJWTトークンのシリアライズ

注意:

これらは、Oracle JSON Web Tokenの使用方法を示す具体例です。ここで説明したメソッドの使用の詳細およびその他のオプションについては、JWT javadoc (「Oracle JSON Web Token Java APIのリファレンス」)を参照してください。

12.4.1 JWTトークンの作成

JWTトークンの作成には、オブジェクトそのものの作成と、必要に応じてヘッダーおよびクレームのパラメータの設定が含まれます。

手順は次のとおりです。

1. JWTトークンを作成するには、コンストラクタ・メソッドJwtToken()を使用して、JwtTokenオブジェクトの作成を開始します。

JwtToken jwtToken = new JwtToken();

様々なsetterメソッドを使用して、JWTトークンのパラメータ値を設定できます。

2. ヘッダー・パラメータを設定するには、ヘッダー・パラメータalgを最初に設定する必要があります。setAlgorithm(String)メソッドを使用してこのパラメータを設定し、getAlgorithm()メソッドを使用してこのパラメータを取得します。デフォルトでは、algパラメータはnoneに設定されており、これはトークンに署名しないことを意味します。

setHeaderParameter(String, Object)メソッドを使用して、JWTヘッダー・セグメント内のユーザー定義のヘッダー・パラメータを設定します。

3. Oracle JSON Web Tokenでは、クレーム・パラメータexp、iat、iss、aud、prnを設定するためのメソッドが用意されています。すべてのクレーム・パラメータはオプションです。

setClaimParameter(String, Object)メソッドを使用して、JWTクレーム・セグメント内のユーザー定義のクレーム・パラメータを設定します。

12.4.2 JWTトークンの署名

トークンの署名には、トークン・インスタンスの作成、トークン・パラメータの設定、最後にトークンの署名といったアクションが含まれます。

手順は次のとおりです。

1. まず、JwtTokenクラスのインスタンスを作成することで、JWTトークンの作成および署名を行います。

JwtToken jwtToken = new JwtToken(String);

2. 次に、アルゴリズム、発行者、有効期限、その他のクレームなどのパラメータを次のように設定します。

jwtToken.setAlgorithm(JwtToken.SIGN_ALGORITHM.HS256.toString());
jwtToken.setType(JwtToken.JWT);
jwtToken.setIssuer("my.company.com");
jwtToken.setPrincipal("john.doe");

3. 最後に、次のように、秘密鍵を取得して、秘密鍵を使用したトークンに署名します。

PrivateKey privateKey ;
String jwtString = jwtToken.signAndSerialize(privateKey);

12.4.3 JWTトークンの検証

トークンの検証には、HTTPヘッダーからのトークンの読取り、トークンの発行者の確認などのアクションが含まれます。

次のコード例では、有効期限およびトークンの発行者を検証しています。

// Read the JWT token as a String from HTTP header
String jwtStr = "eyJ.eyJp.dB";
JwtToken token = new JwtToken(jwtStr);

// Validate the issued and expiry time stamp.
if (token.getExpiryTime().after(new Date())) {
...
...
}

// Get the issuer from the token
String issuer = token.getIssuer();

12.4.4 署名なしのJWTトークンのシリアライズ

JWTトークンにデジタル署名する必要がない場合は、署名なしでトークンをシリアライズできます。

次に例を示します。

JwtToken jwtToken = new JwtToken();
jwtToken.setType(JwtToken.JWT);
jwtToken.setIssuer("my.example.com");
jwtToken.setPrincipal("john.doe");
String jwtString = jwtToken.serializeUnsigned();

12.5 Oracle JSON Web Token Java APIのリファレンス

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

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

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

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

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

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

- JCEフレームワークについて

- JCEキーの理解

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

- JCE証明書の操作

- JCE証明書失効リスト(CRL)の操作

- JCEキーストアの使用方法

- Oracle JCEのJava APIリファレンス

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

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

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

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

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

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

追加資料

この章では、JCEフレームワークに対応するためのOracleセキュリティ開発ツールの変更点と、既存のセキュリティ・アーティファクトを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セキュリティ開発ツールの変更点に焦点を当てています。利用可能な暗号化機能の詳細は、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に変更

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

鍵をOracleセキュリティ開発ツール(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セキュリティ開発ツール(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セキュリティ開発ツールの証明書を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.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ファイルの名前です。

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

Oracleセキュリティ開発ツールには、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セキュリティ開発ツール形式のストアから取得できます。

- PKCSオブジェクトの取得

- 証明書の取得

- CRLの取得

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リファレンス

B リファレンス

Oracle Security Developer Toolsの基礎を形成する標準のリストです。このドキュメントで参照される標準とプロトコルについては、次を参照してください。

表B-1 セキュリティの規格とプロトコル

ドキュメント

リファレンス

[AES-128]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「Block Encryption Algorithms」のhttp://www.w3.org/2001/04/xmlenc#aes128-cbcおよびhttp://www.w3.org/2001/04/xmlenc#kw-aes128を参照

[AES-192]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「Block Encryption Algorithms」のhttp://www.w3.org/2001/04/xmlenc#aes192-cbcおよびhttp://www.w3.org/2001/04/xmlenc#kw-aes192を参照

[AES-256]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「Block Encryption Algorithms」のhttp://www.w3.org/2001/04/xmlenc#aes256-cbcおよびhttp://www.w3.org/2001/04/xmlenc#kw-aes256を参照

暗号化

Bruce Schneier著、『Applied Cryptography: Protocols, Algorithms, and Source Code in C (2nd Edition)』、John Wiley and Sons、1996年

暗号化

William Stallings著、『Cryptography and Network Security: Principles and Practice (3rd Edition)』、Prentice Hall、2002年

[DES-EDE]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「Block Encryption Algorithms」のhttp://www.w3.org/2001/04/xmlenc#aes128-cbcおよびhttp://www.w3.org/2001/04/xmlenc#kw-tripledesを参照

Diffie-Hellman鍵合意

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「Diffie-Hellman Key Agreement」のhttp://www.w3.org/2001/04/xmlenc#dhを参照

[DSA-SHA]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「DSA」、http://www.w3.org/TR/xmlenc-core/を参照

JSON Web Token

JSON Web Token (JWT)ドラフト、http://tools.ietf.org/html/draft-jones-json-web-token-05を参照

Liberty Alliance

Liberty AllianceプロジェクトID-FF 1.2およびID-WSF 2.0仕様、http://www.projectliberty.org/resources/specifications.php

[PKCS]

RSA Laboratories、「Public-Key Cryptography Standards (PKCS)」、http://www.rsasecurity.com/rsalabs/node.asp?id=2125

[PKCS1]

RSA Laboratories、「PKCS #1: RSA Cryptography Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2125

[PKCS3]

RSA Laboratories、「PKCS #3: Diffie-Hellman Key Agreement Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2126

[PKCS5]

RSA Laboratories、「PKCS #5: Password-Based Cryptography Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2127

[PKCS6]

RSA Laboratories、「PKCS #6: Extended-Certificate Syntax Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2128

[PKCS7]

RSA Laboratories、「PKCS #7: Cryptographic Message Syntax Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=21299

[PKCS8]

RSA Laboratories、「PKCS #8: Private-Key Information Syntax Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2130

[PKCS9]

RSA Laboratories、「PKCS #9: Selected Attribute Types」、http://www.rsasecurity.com/rsalabs/node.asp?id=2131

[PKCS10]

RSA Laboratories、「PKCS #10: Certification Request Syntax Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2132

[PKCS11]

RSA Laboratories、「PKCS #11: Cryptographic Token Interface Standard」、http://www.rsasecurity.com/rsalabs/node.asp?id=2133

[RFC2311]

S.Dusse、P.Hoffman、B.Ramsdell、L.Lundblade、L.Repka著、「S/MIME Version 2 Message Specification」(1998年3月)、http://www.ietf.org/rfc/rfc2311.txt

[RFC2459]

R.Housley、W.Ford、W.Polk、D.Solo著、「Internet X.509 Public Key Infrastructure Certificate and CRL Profile」(1999年1月)、http://www.ietf.org/rfc/rfc2459.txt

[RFC2510]

C.Adams、S.Farrell著、「Internet X.509 Public Key Infrastructure Certificate Management Protocols」(1999年3月)、http://www.ietf.org/rfc/rfc2510.txt

[RFC2511]

M.Myers、C.Adams、D.Solo、D.Kemp著、「Internet X.509 Certificate Request Message Format」(1999年3月)、http://www.ietf.org/rfc/rfc2511.txt

[RFC2560]

M.Myers、R.Ankney、A.Malpani、S.Galperin、C.Adams著、「X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP」(1999年6月)、http://www.ietf.org/rfc/rfc2560.txt

[RFC2630]

R.Housley著、「Cryptographic Message Syntax」(1999年6月)、http://www.ietf.org/rfc/rfc2630.txt

[RFC2634]

P.Hoffman編、「Enhanced Security Services for S/MIME」(1999年6月)、http://www.ietf.org/rfc/rfc2634.txt

[RFC3161]

C.Adams、P.Cain、D.Pinkas、R.Zuccherato著、「Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)」(2001年8月)、http://www.ietf.org/rfc/rfc3161.txt

[RFC3274]

P.Gutmann著、「Compressed Data Content Type for Cryptographic Message Syntax (CMS)」(2002年6月)、http://www.ietf.org/rfc/rfc3274.txt

[RFC3275]

D.Eastlake、J.Reagle、D.Solo著、「(Extensible Markup Language) XML-Signature Syntax and Processing」(2002年3月)、http://www.ietf.org/rfc/rfc3275.txt

[RFC3280]

R.Housley、W.Polk、W.Ford、D.Solo著、「Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile」(2002年4月)、http://www.ietf.org/rfc/rfc3280.txt

[RSA-OAEP]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「RSA-OAEP」のhttp://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1pを参照

[RSA-SHA]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「PKCS1 (RSA-SHA1)」のhttp://www.w3.org/TR/xmlenc-core/を参照

[RSAES-OAEP]

R.Housley.「RFC 3560 - Use of the RSAES-OAEP Key Transport Algorithm in Cryptographic Message Syntax (CMS)」、http://www.faqs.org/rfcs/rfc3560.html

[RSAES-PKCS1-v1_5]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、「RSA Version 1.5」のhttp://www.w3.org/2001/04/xmlenc#rsa-1_5を参照

[SAML]

OASIS Security Services (SAML) TC、http://www.oasis-open.org/committees/security/

[WSS]

ASIS Web Services Security (WSS) TC、http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss

[WSS v1.0]

OASIS規格およびその他の承認済仕様、http://www.oasis-open.org/specs/index.php#wssv1.0。

このOASIS規格の内容は次のとおりです。

1. OASIS WSS SOAPメッセージ・セキュリティ仕様

2. OASIS WSSユーザー名トークン・プロファイル仕様

3. OASIS WSS X.509証明書トークン・プロファイル仕様

4. OASIS WSS SAMLアサーション・トークン・プロファイル仕様

5. OASIS WSS RELトークン・プロファイル仕様

[XKMS 2.0]

W.Ford、P.Hallam-Baker、B.Fox、B.Dillaway、B.LaMacchia、J.Epstein、J.Lapp著、「XML Key Management Specification」(2001年3月30日)http://www.w3.org/TR/xkms/

[xml.com]

O'Reilly xml.com、http://www.xml.com/

[XML 1.0]

W3C勧告、XML 1.0: 「Extensible Markup Language (XML) 1.0 (Third Edition)」(2004年2月4日)、http://www.w3.org/TR/REC-xml/

[XML Canonicalization]

W3C勧告、正規XML: 「Canonical XML Version 1.0」(2001年3月15日)、http://www.w3.org/TR/xml-c14n

[Exclusive XML Canonicalization]

W3C勧告、排他XML正規化: 「Exclusive XML Canonicalization Version 1.0」(2001年3月15日)、http://www.w3.org/TR/xml-exc-c14n/

[XML Decryption Transform]

W3C勧告、XML復号化変換: 「Decryption Transform for XML Signature」(2002年12月10日)、http://www.w3.org/TR/xmlenc-decrypt

[XML Encryption]

W3C勧告、XML暗号化: 「XML Encryption Syntax and Processing」(2002年12月10日)、http://www.w3.org/TR/xmlenc-core/

[XML FAQ]

「Java Technology and XML FAQ」、http://www.oracle.com/technetwork/java/faq-141681.html

[XML Signatures]

W3C勧告、XML署名: 「XML-Signature Syntax and Processing」(2002年2月12日)、http://www.w3.org/TR/xmldsig-core/