この章では、Oracle Security EngineのSoftware Development Kit(SDK)証明書パッケージの使用について説明します。Oracle Security EngineはOracle Cryptoのスーパーセットです。Oracle Cryptoで提供されるすべてのライブラリとツールの他に、デジタル証明書を生成するためのパッケージとユーティリティが含まれます。
Java開発者は、Oracle Cryptoを使用して、データのセキュリティと整合性を確保するアプリケーションを開発することができます。Oracle Cryptoの機能の詳細は、第2章の「Oracle Crypto」を参照してください。
公開鍵インフラストラクチャ(PKI)の概要は、第1章の「公開鍵インフラストラクチャ(PKI)」を参照してください。
この章に含まれる内容は次のとおりです。
Oracleセキュリティ開発ツールは、Oracle Application ServerとともにORACLE_HOME
にインストールされます。この項では、Oracle Security Engineの環境設定について説明します。この項に含まれる内容は次のとおりです。
Oracle Security Engineを使用するには、システムにJava Development Kit(JDK)バージョン1.2.2が必要です。
CLASSPATH
環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。次の項目をCLASSPATH
に指定します。
osdt_core.jar
osdt_cert.jar
WindowsでCLASSPATH
を設定する手順を次に示します。
Windowsの「コントロール パネル」で「システム」を選択します。
「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。
「環境変数」をクリックします。
ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH
環境変数をユーザー・プロファイルに追加します。CLASSPATH
環境変数がすでに存在している場合は、選択して「編集」をクリックします。
必要なjarファイルおよびclassファイルすべてのフルパスとファイル名をCLASSPATH
に追加します。
たとえば、CLASSPATH
は次のようになります。
%CLASSPATH%;C:\ORACLE_HOME\jlib\osdt_core.jar; C:\ORACLE_HOME\jlib\osdt_cert.jar;
「OK」をクリックします。
この項では、Oracle Security Engineの証明書機能のクラスの使用について説明し、コード例を示します。Oracle Security Engineには、Oracle Cryptoで提供されるすべてのクラスが含まれます。Oracle Cryptoのコア・クラスの詳細は、第2章「Oracle Crypto」を参照してください。
証明書機能のコア・クラスを次に示します。
X.500相対識別名(RDN)を表すクラス。これは、X.500の名前のビルディング・ブロックです。RDNは、一連の属性と値のペアで構成されます。通常、各RDNには1つの属性と値のペアが含まれます。
このクラスは、X.500シリーズの仕様で使用され、X.520で定義されている識別名を表します。X500Name
オブジェクトは、X500RDN
オブジェクトで構成されます。X500Nameは、共通名、国、組織などエンティティを定義する属性を保持します。
X500Name
オブジェクトを作成するには、標準のコンストラクタを使用してから、オブジェクトに属性を移入します。オブジェクトが作成されると、他のプロセスで使用できるようにDERエンコードを行うことができます。
例4-2 X500Nameオブジェクトを作成するコード例
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@oracle.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();
このクラスは、エンティティの情報とリクエストの内容の署名が含まれるPKCS#10証明書リクエストを表します。証明書リクエストは、認証局(CA)に情報と認証データ(署名)を渡すために使用されます。認証局がこれらを使用して、対応するエンティティの証明書を生成します。
新しい証明書リクエストを作成する手順の概要は次のとおりです。
引数なしのコンストラクタを使用し、鍵とサブジェクト名を設定するか、X500Name
とKeyPair
オブジェクトをとるコンストラクタを使用して、CertificateRequest
の新しいインスタンスを作成します。
X.509拡張領域を証明書リクエストに追加します。
証明書リクエストに署名し、ファイルに保存します。
作成した証明書リクエストを認証局に送信します。
例4-3 証明書リクエストを作成するコード例
//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