Copyright
ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Security Developer Toolsリファレンス
11gリリース1(11.1.1)
B61386-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

6 Oracle S/MIME

この章では、Oracle S/MIMEの概要を説明します。Oracle S/MIMEの主要な機能と利点、設定および使用の方法について説明します。

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

6.1 Oracle S/MIMEの機能と利点

Oracle S/MIMEは、次の機能を提供するPure Javaソリューションです。

6.2 Oracle S/MIMEの環境設定

Oracleセキュリティ開発ツールは、Oracle Application ServerとともにORACLE_HOMEにインストールされます。この項では、Oracle S/MIMEを使用するための環境設定について説明します。この項に含まれる内容は次のとおりです。

6.2.1 Oracle S/MIMEのシステム要件

Oracle S/MIMEを使用するには、システムにJava Development Kit(JDK)バージョン1.5以上が必要です。Oracle S/MIMEでは次の実装も必要です。

POPまたはIMAPを使用する場合は、Sun社のPOP3(またはIMAP)プロバイダをJavaMailページからダウンロードしてください。

6.2.2 CLASSPATH環境変数の設定

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

Oracle S/MIMEのAPIを使用するアプリケーションでは、必要なすべてのMIMEタイプをコマンド・マップに登録する必要があります。

一部のアプリケーション、特にS/MIMEエントリをFileDataSourceから読み取るアプリケーションでは、S/MIMEファイル・タイプを登録する必要があります。

6.2.2.1 WindowsでのCLASSPATHの設定

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

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

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

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

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

  5. 必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を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_cms.jar;
    %ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_smime.jar;
    C:\jaf-1.1.1\activation.jar;
    C:\javamail-1.4.1\mail.jar;
    
  6. 「OK」をクリックします。

6.2.2.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_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

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

この項では、Oracle S/MIMEのAPIで選択されたインタフェースとクラスについて説明し、使用方法を示します。この項に含まれる内容は次のとおりです。

選択されたメソッドは必要に応じて説明します。

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

この項では、Oracle S/MIMEのAPIのコア・クラスとインタフェースについて説明し、S/MIMEオブジェクト作成および解析の方法を示します。

OracleAS 11gリリース1におけるクラスの変更点のサマリー

OracleAS 11gリリース1では、次の変更が適用されています。

  • oracle.security.crypto.cert.X509がjava.security.cert.X509Certificateで置き換えられています。

  • oracle.security.crypto.core.PrivateKeyがjava.security.PrivateKeyで置き換えられています。

  • oracle.security.crypto.core.SymmetricKeyがjavax.crypto.SecretKeyで置き換えられています。

証明書のコア・クラスとインタフェース

コア・クラスとインタフェースは、次のとおりです。

6.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)

このオブジェクトを指定した出力ストリームに出力します。

6.3.1.2 oracle.security.crypto.smime.SmimeSignedObjectインタフェース

oracle.security.crypto.smime.SmimeSignedObjectインタフェースはSmimeObjectを拡張したものであり、SmimeSignedSmimeMultipartSignedなど、すべての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をスローできます。

6.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);

6.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);

6.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オブジェクトに追加します。(詳細は、javax.mailのAPIドキュメント(http://java.sun.com/products/javamail/javadocs/javax/mail/BodyPart.html)を参照してください。)

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);

6.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);

6.3.1.7 oracle.security.crypto.smime.SmimeCompressedクラス

oracle.security.crypto.smime.SmimeCompressedクラスは、RFC 3274に定義されているS/MIME圧縮メッセージを表します。このクラスは、新しいメッセージの構築や既存のメッセージの解析に使用できます。


注意:

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

次のコードを使用して新しいメッセージを構築します。

// 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);

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

この項では、Oracle S/MIMEのサポート・クラスとインタフェースについて説明します。

6.3.2.1 oracle.security.crypto.smime.Smimeインタフェース

oracle.security.crypto.smime.Smimeインタフェースでは、アルゴリズム識別子、コンテンツ・タイプ識別子および属性識別子などの定数が定義されます。

6.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境界を処理しません。

6.3.2.3 oracle.security.crypto.smime.MailTrustPolicyクラス

oracle.security.crypto.smime.MailTrustPolicyクラスは、署名付きS/MIMEオブジェクトの署名を検証するために使用される証明書信頼ポリシー(oracle.security.crypto.cert.CertificateTrustPolicy)を実装します。

6.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機能のセットに追加します。

6.3.2.5 oracle.security.crypto.smime.SmimeDataContentHandlerクラス

oracle.security.crypto.smime.SmimeDataContentHandlerクラスは、S/MIMEコンテンツ・タイプにDataContentHandlerを提供します。これはjavax.activation.DataContentHandlerを実装します。

6.3.2.6 oracle.security.crypto.smime.essパッケージ

oracle.security.crypto.smime.essパッケージには、次のクラスが含まれます。

表6-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の署名証明書。


6.3.3 Oracle S/MIMEクラスの使用

この項では、Oracle S/MIME SDKを使用して、マルチパート署名付きメッセージの操作、デジタル・エンベロープの作成とオープン、および拡張セキュリティ・サービス(ESS)の実装を行う方法について説明します。この項に含まれる内容は次のとおりです。

6.3.3.1 抽象クラスSmimeObjectの使用

SmimeObjectは、基本的なS/MIMEメッセージ・コンテンツ・エンティティを表す抽象クラスです。SmimeObjectのサブクラスに含まれるのは、次のとおりです。

  • SmimeSigned

  • SmimeEnveloped

  • SmimeMultipartSigned

  • SmimeSignedReceipt

  • SmimeCompressed

SmimeObject実装の特徴の1つは、自らのMIMEタイプがわかることです。つまり、SmimeObjectによって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になります。

6.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またはMimeBodyPartSmimeSignedObjectを配置します。次に例を示します。

    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を参照してください。

6.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"

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

S/MIMEデジタル・エンベロープ(暗号化されたメッセージ)は、SmimeEnvelopedクラスによって表されます。これは、MIMEエンティティです。対称暗号化アルゴリズム(Triple-DesまたはRC2など)とランダムに生成されたセッション鍵でMIMEボディ部を暗号化し、各メッセージ受信者ごとにセッション鍵をRSA公開鍵で暗号化することで形成されます。

次の例では、docは、SmimeEnvelopedのインスタンスにラップされるMimeBodyPartのインスタンスです。recipientCertは受信者の証明書です。

SmimeEnveloped env = new SmimeEnveloped(doc, Smime.dES_EDE3_CBC);
env.addRecipient (recipientCert);

addRecipientを繰り返してコールすることで、任意の数のエンベロープ受信者を追加できます。

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

コンテンツも署名も含まず、証明書またはCRL(あるいはその両方)のみを含むS/MIME署名付きデータ・オブジェクトを作成できます。このようなエンティティは、証明書転送メカニズムとして使用できます。次のように特殊なコンテンツ・タイプが使用されます。

application/pkcs7-mime; smime-type=certs-only

次に例を示します。

X509Certificate cert1, cert2;
SmimeSigned certBag = new SmimeSigned();
certBag.addCertificate(cert1);
certBag.addCertificate(cert2);

これで、certBagを適切なsetContentメソッドに渡すことができます。generateContentTypecertBagで呼び出されると、smime-typeパラメータに正しいcerts-only値を含むコンテンツ・タイプを自動的に返します。

6.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

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

SmimeSignedまたはSmimeMutlipartSignedのインスタンスをgetContent()から取得すると、添付された署名を検証することになります。署名の検証に使用できるオプションを示すためには、S/MIME署名付きメッセージの構造を説明する必要があります。

署名付きS/MIMEメッセージのコンテンツは、SignedDataタイプのCMSオブジェクトです。このようなオブジェクトにはコンテンツ(署名の適用対象の文書)があります。これは、MIMEエンティティのテキスト・エンコーディングです。また、0個以上の署名を含み、さらにオプションで一連の証明書またはCRL(あるいはその両方)を含みます。受信側は署名を検証するためにこれらを使用できます。

SmimeSignedクラスおよびSmimeMultipartSignedクラスは、この情報のすべてをカプセル化します。verifyingSignatureverifyという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と同じくverifyAuthenticationExceptionをスローします。それ以外の場合は正常に値を返します。どちらの場合も、getEnclosedBodyPart()を呼び出して、署名付き文書(MIMEエンティティ)をリカバリできます。

MimeBodyPart doc = sig.getEnclosedBodyPart();

6.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などその他のオブジェクトです。

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

ESSサービスのReceiptRequestsSecurityLabelsおよびSigningCertificatesをS/MIME署名付きメッセージに追加する場合は、それらを署名のsignedAttributesに追加します。

// Create a Signed Message
SmimeSigned sig = new SmimeSigned(); 
    AttributeSet signedAttributes = new AttributeSet();

Receipt Request (oracle.security.crypto.smime.ess.ReceiptRequest)

メッセージの受信者から署名付き通知をリクエストするには、署名を追加する際にreceiptRequest属性をsignedAttributesフィールドに追加します。

ReceiptRequest rr = new ReceiptRequest();
.........
signedAttributes.addAttribute(Smime.id_aa_receiptRequest, rr);

Security Label (oracle.security.crypto.smime.ess.ESSSecurityLabel)

メッセージにセキュリティ・ラベルを添付するには、署名を追加する際にESSSecurityLabel属性をsignedAttributesフィールドに追加します。

ESSSecurityLabel sl = new ESSSecurityLabel();
    .........
    signedAttributes.addAttribute(Smime.id_aa_securityLabel, sl);

Signing Certificate (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オブジェクトである点が異なります。

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

S/MIME署名付き通知により、データ・コンテンツ・ハンドラが通知を認識できるよう、コンテンツ・タイプ・パラメータが正しく設定されています。コンテンツ・タイプ・パラメータがない場合、署名付き通知は署名付きメッセージとして処理されます。

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

Oracle S/MIMEのJava APIリファレンス(Javadoc)は次のドキュメントで参照できます。

Oracle Fusion Middleware S/MIME Java API Reference for Oracle Security Developer Tools

6.5 サンプル・プログラム

Oracleセキュリティ開発ツールを使用したサンプル・プログラムについては、Oracle Technology Network Webサイト(http://www.oracle.com/technology/sample_code/products/id_mgmt/index.html)を参照してください。