5 Oracle S/MIME
Oracle S/MIME APIは、S/MIMEオブジェクトを使用するためのクラス、インタフェースおよびメソッドを含むJavaソリューションです。
Oracle S/MIMEのクラスおよび機能の概要について説明します。
- Oracle S/MIMEの機能と利点
Oracle S/MIME APIは、X.509証明書と秘密鍵暗号化をサポートするJavaソリューションです。 - Oracle S/MIMEの環境設定
Oracle Security Developer Toolsは、Oracle WebLogic ServerとともにORACLE_HOME
にインストールされます。Oracle S/MIMEを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。CLASSPATH
環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。 - Oracle S/MIMEでのアプリケーションの開発
Oracle S/MIME APIのコア・クラスとインタフェース、サポート・クラスとインタフェースおよびそれらのメソッドを使用して、アプリケーションを開発できます。 - Oracle S/MIMEのJava APIリファレンス
Oracle S/MIMEで利用可能なクラスとメソッドについては、Oracle Fusion Middleware Oracle Security Developer Tools 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ライブラリ。
親トピック: Oracle S/MIME
5.2 Oracle S/MIMEの環境設定
Oracle Security Developer Toolsは、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の次の場所から無償で入手できます。
-
JavaMail APIの実装。Oracleの次の場所から無償で入手できます。
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ファイル・タイプを登録する必要があります。
親トピック: Oracle S/MIME
5.3 Oracle S/MIMEでのアプリケーションの開発
Oracle S/MIME APIのコア・クラスとインタフェース、サポート・クラスとインタフェースおよびそれらのメソッドを使用して、アプリケーションを開発できます。
この項では、Oracle S/MIMEのAPIで選択されたインタフェースとクラスについて説明し、使用方法を示します。次のトピックが含まれます:
選択されたメソッドは必要に応じて説明します。
- Oracle S/MIMEのコア・クラスとインタフェース
Oracle S/MIME APIは、複数のコア・クラスとインタフェースで構成されます。 - サポート・クラスとインタフェース
Oracle S/MIMEには、アルゴリズム識別子、コンテンツ・タイプ識別子、属性識別子などの定数を定義するサポート・インタフェースが含まれています。静的なユーティリティ・メソッドを備え、署名付きS/MIMEオブジェクトの署名を検証し、S/MIMEオブジェクトの機能をカプセル化するサポート・クラスが含まれています。 - Oracle S/MIMEクラスの使用
Oracle S/MIME SDKを使用して、マルチパート署名付きメッセージの操作、メッセージの署名と署名付きメッセージの認証、デジタル・エンベロープの作成とオープン、および拡張セキュリティ・サービス(ESS)の実装を行うことができます。
親トピック: 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クラスの使用方法
親トピック: Oracle S/MIMEでのアプリケーションの開発
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)
このオブジェクトを指定した出力ストリームに出力します。
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
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
をスローできます。
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
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);
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
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);
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
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);
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
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);
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
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);
親トピック: Oracle S/MIMEのコア・クラスとインタフェース
5.3.2 サポート・クラスとインタフェース
Oracle S/MIMEには、アルゴリズム識別子、コンテンツ・タイプ識別子、属性識別子などの定数を定義するサポート・インタフェースが含まれています。静的なユーティリティ・メソッドを備え、署名付きS/MIMEオブジェクトの署名を検証し、S/MIMEオブジェクトの機能をカプセル化するサポート・クラスが含まれています。
この項では、Oracle S/MIMEのサポート・クラスとインタフェースについて説明します。
- oracle.security.crypto.smime.Smimeインタフェースの使用方法
- oracle.security.crypto.smime.SmimeUtilsクラスの使用方法
- oracle.security.crypto.smime.MailTrustPolicyクラスの使用方法
- oracle.security.crypto.smime.SmimeCapabilitiesクラスの使用方法
- oracle.security.crypto.smime.SmimeDataContentHandlerクラスの使用方法
- oracle.security.crypto.smime.essパッケージの使用方法
親トピック: 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)の追加
- 拡張セキュリティ・サービス(ESS)の処理
親トピック: Oracle S/MIMEでのアプリケーションの開発
5.3.3.1 抽象クラスSmimeObjectの使用
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になります。
親トピック: Oracle S/MIMEクラスの使用
5.3.3.2 メッセージの署名
次の手順を実行して、署名付きメッセージまたは署名付きMIMEボディ部を作成します。
これらの例で使用されるgenerateContentType
メソッドは、オブジェクトの適切なMIMEタイプを特定する文字列を返します。この場合は、次のようになります。
application/pkcs7-mime; smime-type=signed-data
このようにシンプルな手順を実行することで、MIMEメッセージの転送、S/MIMEコンテンツを含むボディ部のMIMEマルチパート・オブジェクトへの配置、またはこれらのオブジェクトに対応するその他の操作が可能になります。詳細は、JavaMail APIを参照してください。
親トピック: Oracle S/MIMEクラスの使用
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"
親トピック: Oracle S/MIMEクラスの使用
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
を繰り返してコールすることで、任意の数のエンベロープ受信者を追加できます。
親トピック: Oracle S/MIMEクラスの使用
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値を含むコンテンツ・タイプを自動的に返します。
親トピック: Oracle S/MIMEクラスの使用
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 |
親トピック: Oracle S/MIMEクラスの使用
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();
親トピック: Oracle S/MIMEクラスの使用
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
などその他のオブジェクトです。
親トピック: Oracle S/MIMEクラスの使用
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);
親トピック: 拡張セキュリティ・サービス(ESS)の追加
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);
親トピック: 拡張セキュリティ・サービス(ESS)の追加
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
オブジェクトである点が異なります。
親トピック: 拡張セキュリティ・サービス(ESS)の追加
5.3.3.10 拡張セキュリティ・サービス(ESS)の処理
S/MIME署名付き通知により、データ・コンテンツ・ハンドラが通知を認識できるよう、コンテンツ・タイプ・パラメータが正しく設定されています。コンテンツ・タイプ・パラメータがない場合、署名付き通知は署名付きメッセージとして処理されます。
親トピック: Oracle 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リファレンス
親トピック: Oracle S/MIME