Oracle® Fusion Middleware Oracle Security Developer Toolsによるセキュアなアプリケーションの開発 11gリリース1 (11.1.1) B61386-04 |
|
![]() 前 |
![]() 次 |
この章では、Oracle S/MIMEの概要を説明します。Oracle S/MIMEの主要な機能と利点、設定および使用の方法について説明します。
この章に含まれる内容は次のとおりです。
Oracle S/MIMEは、次の機能を提供するPure Javaソリューションです。
拡張領域付きX.509バージョン3証明書の全面的なサポート(証明書の解析と検証などを含む)。
PKCS 7およびPKCS 12形式のX.509証明連鎖のサポート。
PKCS 5、PKCS 8およびPKCS 12を使用する秘密鍵暗号化。
ASN.1 DER/BER形式でのデータの入出力のための統合ASN.1ライブラリ。
Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOME
にインストールされます。この項では、Oracle S/MIMEの環境を設定する方法について説明します。次の項目について説明します。
Oracle S/MIMEを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。Oracle S/MIMEでは次の実装も必要です。
JavaBeans Activation Framework(JAF)の実装。Sunのロイヤルティー不要の実装は次の場所から入手できます:
http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html
JavaMail APIの実装。Sunのロイヤルティー不要の実装は次の場所から入手できます:
POPまたはIMAPを使用する場合は、SunのPOP3(またはIMAP)プロバイダをJavaMailページからダウンロードしてください。
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ファイル・タイプを登録する必要があります。
WindowsでCLASSPATH
を設定する手順を次に示します。
Windowsの「コントロール パネル」で「システム」を選択します。
「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。
「環境変数」をクリックします。
ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH
環境変数をユーザー・プロファイルに追加します。CLASSPATH
環境変数がすでに存在している場合は、選択して「編集」をクリックします。
必要な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;
「OK」をクリックします。
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
この項では、Oracle S/MIMEのAPIで選択されたインタフェースとクラスについて説明し、使用方法を示します。内容は次のとおりです。
選択されたメソッドは必要に応じて説明します。
この項では、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で置き換えられています。
証明書のコア・クラスとインタフェースについて
コア・クラスとインタフェースは、次のとおりです。
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)
このオブジェクトを指定した出力ストリームに出力します。
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
をスローできます。
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);
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);
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);
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);
oracle.security.crypto.smime.SmimeCompressed
クラスは、RFC 3274に定義されているS/MIME圧縮メッセージを表します。このクラスは、新しいメッセージの構築や既存のメッセージの解析に使用できます。
次のコードを使用して新しいメッセージを構築します。
// 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);
この項では、Oracle S/MIMEのサポート・クラスとインタフェースについて説明します。
oracle.security.crypto.smime.Smime
インタフェースでは、アルゴリズム識別子、コンテンツ・タイプ識別子および属性識別子などの定数が定義されます。
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境界を処理しません。 |
oracle.security.crypto.smime.MailTrustPolicy
クラスは、署名付きS/MIMEオブジェクトの署名を検証するために使用される証明書信頼ポリシー(oracle.security.crypto.cert.CertificateTrustPolicy
)を実装します。
oracle.security.crypto.smime.SmimeCapabilities
クラスは、サポートされる暗号化アルゴリズムなど、S/MIMEオブジェクトの一連の機能をカプセル化します。
このクラスの有用なメソッドを次に示します。
void addCapability(oracle.security.crypto.asn1.ASN1ObjectID capabilityID)
指定したオブジェクトIDの機能を、このS/MIME機能のセットに追加します。
oracle.security.crypto.smime.SmimeDataContentHandler
クラスは、S/MIMEコンテンツ・タイプにDataContentHandlerを提供します。javax.activation.DataContentHandler
を実装します。
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の署名証明書。 |
この項では、Oracle S/MIME SDKを使用して、マルチパート署名付きメッセージの操作、デジタル・エンベロープの作成とオープン、および拡張セキュリティ・サービス(ESS)の実装を行う方法について説明します。ここでは、次のトピックについて説明します。
SmimeObject
は、基本的なS/MIMEメッセージ・コンテンツ・エンティティを表す抽象クラスです。SmimeObject
のサブクラスに含まれるのは、次のとおりです。
SmimeSigned
SmimeEnveloped
SmimeMultipartSigned
SmimeSignedReceipt
および
SmimeCompressed
SmimeObject
実装の特徴の1つは、自身のMIMEタイプがわかることです。つまり、これによりgenerateContentType
メソッドが実装されます。したがって、MIMEメッセージまたはボディ部の中にこのオブジェクトを配置する方法は、SmimeSigned
の例で説明した方法と同様です。
オブジェクトを作成します。
そのオブジェクトでgenerateContentType
を呼び出して、MIMEタイプを取得します。
生成されたコンテンツ・タイプとオブジェクトを一緒に、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になります。
次の手順を実行して、署名付きメッセージまたは署名付きMIMEボディ部を作成します。
署名するコンテンツを含むMimeBodyPartのインスタンスを準備します。このボディ部には、必要に応じて任意のコンテンツ・タイプを使用できます。次の例では、text/plainのボディ部を作成します。
MimeBodyPart doc = new MimeBodyPart(); doc.setText("Example signed message.");
前に作成したMimeBodyPartを引数とするコンストラクタを使用して、SmimeSigned
のインスタンスを作成します。
SmimeSigned sig = new SmimeSigned (doc);
必要なすべての署名を追加します。署名ごとに、秘密鍵、対応する公開鍵の証明書、およびメッセージ・ダイジェスト・アルゴリズムを指定する必要があります。次に例を示します。
sig.addSignature (signatureKey, signatureCert, AlgID.sha1);
この例では、SHA-1メッセージ・ダイジェスト・アルゴリズムを指定しました。かわりに、引数としてAlgID.md5
を渡してMD5アルゴリズムを指定することもできます。
状況に応じて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を参照してください。
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"
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
を繰り返してコールすることで、任意の数のエンベロープ受信者を追加できます。
コンテンツも署名も含まず、証明書または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
メソッドに渡すことができます。generateContentType
がcertBag
で呼び出されると、smime-type
パラメータに正しいcerts-only値を含むコンテンツ・タイプを自動的に返します。
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 |
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();
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
などその他のオブジェクトです。
ESSサービスのReceiptRequests
、SecurityLabels
およびSigningCertificates
をS/MIME署名付きメッセージに追加する場合は、それらを署名のsignedAttributes
に追加します。
// Create a Signed Message SmimeSigned sig = new SmimeSigned(); AttributeSet signedAttributes = new AttributeSet();
通知リクエスト(oracle.security.crypto.smime.ess.ReceiptRequest)
メッセージの受信者から署名付き通知をリクエストするには、署名を追加する際にreceiptRequest
属性をsignedAttributes
フィールドに追加します。
ReceiptRequest rr = new ReceiptRequest(); ......... signedAttributes.addAttribute(Smime.id_aa_receiptRequest, rr);
セキュリティ・ラベル(oracle.security.crypto.smime.ess.ESSSecurityLabel)
メッセージにセキュリティ・ラベルを添付するには、署名を追加する際にESSSecurityLabel
属性をsignedAttributes
フィールドに追加します。
ESSSecurityLabel sl = new ESSSecurityLabel(); ......... signedAttributes.addAttribute(Smime.id_aa_securityLabel, sl);
署名証明書(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
オブジェクトである点が異なります。