OpenSSLを使用した証明書チェーンおよび秘密キーの生成ガイドライン

証明書チェーンを使用すると、Oracle NoSQL Databaseプロキシにセキュアに接続できます。この項では、OpenSSLを使用したセキュアな接続のために、証明書チェーンおよびその他の必須ファイルを生成するステップについて説明します。

証明書チェーンは、認証局(CA)によって提供されます。CAは数多く存在します。各CAには、証明書チェーンを生成するための様々な登録プロセスがあります。CAから示されるステップに従ってプロセスを実行し、CAから証明書チェーンを取得します。

前提条件として、ホスト・マシンにOpenSSLをダウンロードしてインストールします。OpenSSLを参照してください。

証明書を生成する前に、セキュリティで保護する必要がある様々なホスト名、ドメイン、サブドメインおよびIPアドレスをすべてリストします。どのようにアプリケーションがOracle NoSQL Databaseプロキシに接続するかを知ることで、SSL証明書やTLS証明書の必要性がわかります。まず、セキュリティで保護する必要があるホスト名、ドメインおよびサブドメインの数を特定する必要があります。これは、アプリケーションとOracle NoSQL Databaseプロキシの間のトラフィックの暗号化に必要な、適切なSSL証明書やTLS証明書、または複合証明書を特定する際に役立ちます。

OpenSSLを使用して証明書チェーンおよび秘密キーを生成するには、次のステップを実行します。

  1. 構成ホストで、証明書ファイルを配置する必要があるディレクトリにナビゲートします。
  2. 2048ビットのサーバーの秘密キーを作成します。
    openssl genrsa -out key.pem 2048
    次の出力が表示されます。
    Generating RSA private key, 2048 bit long modulus
    ..................+++
    ...................+++
    e is 65537 (0x10001)
  3. このステップは、サーバーの秘密キーがPKCS#8形式ではない場合にのみ必要です。秘密キーをPKCS#8形式に変換します。プロンプトが表示されたら、暗号化のためのセキュアな任意のパスワードを入力します。
    openssl pkcs8 -topk8 \ 
    -inform PEM -outform PEM \ 
    -in key.pem -out key-pkcs8.pem
    次の出力が表示されます。
    Enter Encryption Password:
    Verifying - Enter Encryption Password:

    ノート:

    キーがPKCS#5 v2.0アルゴリズムで暗号化されている場合は、次の変換を行う必要があります。そうしないと、サポートされていないアルゴリズムが原因で、ファイルに有効な秘密キーが含まれていないことを示すIllegalArgumentException例外が発生する可能性があります。暗号化アルゴリズムは、-v1フラグを使用したPKCS#5 v1.5またはPKCS#12アルゴリズムを指定することで、OpenSSLのpkcs8ユーティリティを介して変換できます。次のコマンドは、キーの暗号化アルゴリズムをPBE-SHA1-3DESに変換します。
    openssl pkcs8 -topk8 -in <PKCS#5v2.0_key_file> -out <new_key_file> -v1 PBE-SHA1-3DES
  4. 証明書署名リクエスト(CSR)を作成します。
    openssl req -new  -key key.pem -out request.csr \ 
    -subj "/C=US/ST=CA/L=San/CN=proxy-nosql.example.com"
    ここで、subjでのCNは、NoSQL Databaseプロキシ・サーバーのホスト名、またはNoSQL Databaseプロキシのドメイン名にマップする必要があります。
    自己署名証明書生成時のCNの使用とSAN(オプション)の使用:
    • 共通名(CN)は、NoSQL Databaseプロキシ・サーバーのホスト名、またはNoSQL Databaseプロキシ・サーバーのドメイン名を指定するために使用します。
    • クライアントは、Oracle NoSQL Databaseプロキシに接続しようとするときに、SSL証明書を取得し、接続先となるNoSQL Databaseプロキシ・サーバーのホスト名またはNoSQL Databaseプロキシ・サーバーのドメイン名を、そのSSL証明書内で指定されているCNと比較します。それらが完全に同じである場合は、そのSSL証明書を使用して接続を暗号化します。そうでない場合は、接続に失敗します。
    • 標準X509では、1つのSSL証明書で使用できるCNは1つのみであると定義されています。つまり、1つのSSL証明書は、1つのNoSQL Databaseプロキシ・サーバー・ホスト名またはNoSQL Databaseプロキシ・サーバー・ドメイン名にのみ使用できます。
    • この制限事項を解決するには、サブジェクトの代替名(SAN)を作成します。SANは、SSL証明書内で複数名または多数のCNを定義するために使用します。
    • SANは、SSL証明書内で別個の属性として示されます。SANの例を次に示します。
      openssl req  -new  \
      -key key.pem  -out request.csr -config \
      <(echo "[req]"; 
      echo distinguished_name=req;
      echo req_extensions=req_ext
      echo "[req_ext]";
      echo subjectAltName=@alt_names
      echo "[alt_names]"; 
      echo DNS.1=proxy-nosql.example.com
      echo DNS.2=proxy-nosql
      echo DNS.3=localhost
      echo IP.1=10.0.0.9
      )  \
      -subj "/C=US/ST=CA/L=San/CN=proxy-nosql.example.com"
  5. 証明書署名リクエスト(CSR)データ・ファイルをCAに送信します。CAは、CSRデータを使用してSSL証明書を発行します。
  6. CAは、署名付き証明書certificate.pemを返します。CAの証明書(ca-chain.cert.pem)のチェーンをまだ設定していない場合は、手動でチェーンにする必要があります。
    cat intermediateCA.crt > ca-chain.cert.pem
    cat rootCA.crt > ca-chain.cert.pem
    cat ca-chain.cert.pem >> certificate.pem
ディレクトリ内に次のファイルが生成されます。
  • key.pemは、サーバーの秘密キーです。
  • key-pkcs8.pemは、PKCS#8形式のサーバーの秘密キーです。
  • certificate.pemは、pem形式の証明書チェーン・ファイルです。これには、CAによって発行されたサーバー証明書が含まれています。
  • request.csrは、サーバーの証明書リクエスト・ファイルです。
  • rootCA.crtは、CAから提供されたルート証明書です。
  • intermediateCA.crtは、CAによって提供される中間証明書です。
また、Javaドライバを使用している場合、およびrootCA.crtがJavaのデフォルトのトラスト・ストアJAVA_HOME/jre/lib/security/cacertsにリストされていない場合は、driver.trustファイルも必要となります。このdriver.trustファイルは、その他の言語ドライバには必要ありません。driver.trustファイルを生成するには、rootCA.crt証明書をJavaキーストアにインポートします。プロンプトが表示されたら、キーストア・パスワードを入力します。
keytool -import -alias example -keystore driver.trust -file rootCA.crt

Pythonドライバの場合は、選択したCAがデフォルトで信頼されていなければ、CAからrootCA.crtまたは証明書チェーン全体を取得し、それに応じてシステム環境変数を設定する必要があります。

例:
REQUESTS_CA_BUNDLE=PATH_OF_CA_FILE/rootCA.crt