2.5. 独自の証明書の作成

2.5.1. 前提条件

OpenSSL ユーティリティー

このセクションで説明する手順は、OpenSSL プロジェクトの OpenSSL コマンドラインユーティリティーに基づいています。OpenSSL コマンドラインユーティリティーの詳細については、http://www.openssl.org/docs/ を参照してください。

CA ディレクトリー構造の例

図については、CA データベースには以下のディレクトリー構造があることを前提としています。

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

ここで、X509CA は CA データベースの親ディレクトリーです。

2.5.2. 独自の CA の設定

実行するサブステップ

このセクションでは、独自のプライベート CA を設定する方法について説明します。実際の展開用に CA を設定する前に、「プライベート認証局」 の追加の注意事項をお読みください。

独自の CA を設定するには、以下の手順を実行します。

bin ディレクトリーを PATH に追加します。

安全な CA ホストで、OpenSSL bin ディレクトリーをパスに追加します。

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

この手順により、コマンドラインから openssl ユーティリティーを利用できるようになります。

CA ディレクトリー階層の作成

新規 CA を保持する新規ディレクトリー X509CA を作成します。このディレクトリーは、CA に関連付けられたすべてのファイルを保持するために使用されます。X509CA ディレクトリーの下に、以下のディレクトリーの階層を作成します。

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

openssl.cnf ファイルのコピーと編集

OpenSSL インストールから X509CA ディレクトリーにサンプル openssl.cnf をコピーします。

openssl.cnf を編集して、X509CA ディレクトリーのディレクトリー構造を反映し、新しい CA によって使用されるファイルを特定します。

openssl.cnf ファイルの [CA_default] セクションを編集して、以下のようにします。

#############################################################
[ CA_default ]

dir        = X509CA            # Where CA files are kept
certs      = $dir/certs  # Where issued certs are kept
crl_dir    = $dir/crl          # Where the issued crl are kept
database   = $dir/index.txt    # Database index file
new_certs_dir = $dir/newcerts  # Default place for new certs

certificate   = $dir/ca/new_ca.pem # The CA certificate
serial        = $dir/serial        # The current serial number
crl           = $dir/crl.pem       # The current CRL
private_key   = $dir/ca/new_ca_pk.pem  # The private key
RANDFILE      = $dir/ca/.rand
# Private random number file

x509_extensions = usr_cert  # The extensions to add to the cert
...

この段階で、OpenSSL 設定の他の詳細を編集することもできます。詳細は、http://www.openssl.org/docs/ を参照してください。

CA データベースの初期化

X509CA ディレクトリーで、serialindex.txt の 2 つのファイルを初期化します。

Windows

Windows で serial ファイルを初期化するには、以下のコマンドを入力します。

> echo 01 > serial

Windows で空のファイル index.txt を作成するには、以下のように X509CA ディレクトリーのコマンドラインで Windows Notepad を起動します。

> notepad index.txt

ダイアログボックスにCannot find the text.txt file. Do you want to create a new file?というテキストが表示されたら、Yes をクリックして Notepad を閉じます。

UNIX

UNIX の serial ファイルおよび index.txt ファイルを初期化するには、以下のコマンドを入力します。

% echo "01" > serial
% touch index.txt

これらのファイルは、証明書ファイルのデータベースを維持するために CA によって使用されます。

注記

index.txt ファイルは、最初は完全に空でなければならず、空白も含んではいけません。

自己署名 CA 証明書および秘密鍵の作成

以下のコマンドを使用して、新しい自己署名 CA 証明書と秘密鍵を作成します。

openssl req -x509 -new -config X509CA/openssl.cnf -days 365 -out X509CA/ca/new_ca.pem -keyout X509CA/ca/new_ca_pk.pem

このコマンドは、CA 秘密鍵のパスフレーズと、CA 識別名の詳細を要求します。以下に例を示します。

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
....++
.++
writing new private key to 'new_ca_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Finance
Common Name (eg, YOUR name) []:Gordon Brown
Email Address []:gbrown@redhat.com
注記

CA のセキュリティーは、秘密鍵ファイルと、この手順で使用する秘密鍵のパスフレーズによって異なります。

CA 証明書と秘密鍵 (new_ca.pem および new_ca_pk.pem) のファイル名と場所が、openssl.cnf で指定した値と同じであることを確認してください (前述の手順を参照)。

これで、CA で証明書に署名する準備が整いました。

2.5.3. CA を使用した Java キーストアでの署名証明書の作成

実行するサブステップ

Java キーストア (JKS) で証明書を作成して署名するには (CertName.jks)、以下のサブステップを実行します。

Java bin ディレクトリーを PATH に追加します。

まだ追加していない場合は、Java の bin ディレクトリーをパスに追加します。

Windows

> set PATH=JAVA_HOME\bin;%PATH%

UNIX

% PATH=JAVA_HOME/bin:$PATH; export PATH

この手順により、コマンドラインから keytool ユーティリティーを利用できるようになります。

証明書と秘密鍵の生成

コマンドプロンプトを開き、キーストアファイル KeystoreDir を保存するディレクトリーに移動します。以下のコマンドを入力します。

keytool -genkey -dname "CN=Alice, OU=Engineering, O=Progress, ST=Co. Dublin, C=IE" -validity 365 -alias CertAlias -keypass CertPassword -keystore CertName.jks -storepass CertPassword

この keytool コマンドは、-genkey オプションで呼び出され、X.509 証明書とこれに一致する秘密鍵を生成します。証明書と鍵は、新規に作成されたキーストアの キーエントリー に配置されます (CertName.jks)。指定のキーストア CertName.jks はコマンドを発行する前に存在していなかったため、keytool は暗黙的に新しいキーストアを作成します。

-dname フラグおよび -validity フラグは、新たに作成された X.509 証明書の内容を定義し、サブジェクト DN と有効期限までの日数をそれぞれ指定します。DN 形式の詳細は、付録A ASN.1 および識別名 を参照してください。

サブジェクト DN の一部は、CA 証明書の値に一致する必要があります (openssl.cnf ファイルの CA ポリシーセクションで指定)。デフォルトの openssl.cnf ファイルは、以下のエントリーと一致する必要があります。

  • 国名 (C)
  • 州または地区名 (ST)
  • 組織名 (O)
注記

制約に従わない場合、OpenSSL CA は証明書への署名を拒否します (「CSR の署名」 を参照)。

証明書署名リクエストの作成

以下のように、CertName.jks 証明書の新しい証明書署名要求 (CSR) を作成します。

keytool -certreq -alias CertAlias -file CertName_csr.pem -keypass CertPassword -keystore CertName.jks -storepass CertPassword

このコマンドは CSR をファイルにエクスポートします (CertName_csr.pem)。

CSR の署名

以下のように CA を使用して CSR に署名します。

openssl ca -config X509CA/openssl.cnf -days 365 -in CertName_csr.pem -out CertName.pem

証明書に正常に署名するには、CA 秘密鍵パスフレーズを入力する必要があります (「独自の CA の設定」 を参照)。

注記

デフォルトの CA 以外 の CA 証明書を使用して CSR に署名する場合には、-cert および -keyfile オプションを使用して CA 証明書とその秘密鍵ファイルをそれぞれ指定します。

PEM 形式への変換

以下のように、署名済み証明書 (CertName.pem) を PEM のみの形式に変換します。

openssl x509 -in CertName.pem -out CertName.pem -outform PEM

ファイルの連結

以下のように、CA 証明書ファイルと CertName.pem 証明書ファイルを連結します。

Windows

copy CertName.pem + X509CA\ca\new_ca.pem CertName.chain

UNIX

cat CertName.pem X509CA/ca/new_ca.pem> CertName.chain

完全な証明書チェーンでキーストアの更新

以下のように、証明書の完全な証明書チェーンをインポートして、キーストア CertName.jks を更新します。

keytool -import -file CertName.chain -keypass CertPassword -keystore CertName.jks -storepass CertPassword

必要に応じて手順を繰り返します。

ステップ 2 から 7 を繰り返し、システムの完全な証明書セットを作成します。

2.5.4. CA を使用して署名した PKCS#12 証明書の作成

実行するサブステップ

「独自の CA の設定」 で説明されているように、プライベート CA を設定した場合は、これで、独自の証明書を作成して署名する準備が整いました。

PKCS#12 形式 CertName.p12 で証明書を作成して署名するには、以下のサブステップを実行します。

bin ディレクトリーを PATH に追加します。

まだ追加していない場合は、以下のように OpenSSL bin ディレクトリーをパスに追加します。

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

この手順により、コマンドラインから openssl ユーティリティーを利用できるようになります。

subjectAltName 拡張機能の設定 (オプション)

証明書が、クライアントが URL 整合性チェックを実施する HTTPS サーバーを対象としている場合、およびサーバーをマルチホームホストまたは複数の DNS 名エイリアスを持つホストに展開する場合 (たとえば、展開する場合) は、この手順を実行します。マルチホーム Web サーバー上の証明書)。この場合、証明書 ID は複数のホスト名と一致する必要がありますが、これは subjectAltName 証明書エクステンションを追加することでのみ行うことができます (「HTTPS 証明書の特別な要件」 を参照)。

subjectAltName 拡張子を設定するには、CA の openssl.cnf ファイルを次のように編集します。

  1. (openssl.cnf ファイルにない場合)req_extensions 設定を [req] セクションに追加します。

    # openssl Configuration File
    ...
    [req]
    req_extensions=v3_req
  2. [v3_req] セクションヘッダーを追加します (openssl.cnf ファイルにまだ存在しない場合)。[v3_req] セクションで、subjectAltName 設定を追加または変更して、DNS ホスト名の一覧に設定します。たとえば、サーバーホストが代替の DNS 名である www.redhat.com および jboss.org をサポートしている場合、以下のように subjectAltName を設定します。

    # openssl Configuration File
    ...
    [v3_req]
    subjectAltName=DNS:www.redhat.com,DNS:jboss.org
  3. 適切な CA 設定セクションに copy_extensions 設定を追加します。証明書の署名に使用される CA 設定セクションは、以下のいずれかです。

    • openssl ca コマンドの -name オプションで指定するセクション
    • [ca] セクションの default_ca 設定で指定されるセクション (通常は [CA_default])。

      たとえば、適切な CA 設定セクションが [CA_default] の場合は、copy_extensions プロパティーを以下のように設定します。

      # openssl Configuration File
      ...
      [CA_default]
      copy_extensions=copy

      この設定により、証明書署名要求に存在する証明書拡張が署名付き証明書に確実にコピーされます。

証明書署名リクエストの作成

以下のように、CertName.p12 証明書の新しい証明書署名要求 (CSR) を作成します。

openssl req -new -config X509CA/openssl.cnf -days 365 -out X509CA/certs/CertName_csr.pem -keyout X509CA/certs/CertName_pk.pem

このコマンドは、証明書の秘密鍵のパスフレーズと、証明書の識別名に関する情報の入力を求めるプロンプトを表示します。

CSR 識別名のエントリーの一部は、CA 証明書の値と一致する必要があります (openssl.cnf ファイルの CA ポリシーセクションで指定)。デフォルトの openssl.cnf ファイルは、以下のエントリーが一致している必要があります。

  • 国名
  • 州または地区名
  • Organization Name

証明書のサブジェクト DN の共通名は、証明書の所有者の ID を表すために通常使用されるフィールドです。共通名 (Common Name) は、次の条件に準拠している必要があります。

  • 共通名は、OpenSSL 認証局によって生成されたすべての証明書で 区別 する必要があります。
  • HTTPS クライアントが URL 整合性チェックを実装する場合は、共通名が証明書が展開されるホストの DNS 名と同一であることを確認する必要があります (「HTTPS 証明書の特別な要件」 を参照)。
注記

HTTPS URL の整合性チェックの目的上、subjectAltName エクステンションは 共通名よりも優先されます。

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
.++
.++
writing new private key to
      'X509CA/certs/CertName_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Systems
Common Name (eg, YOUR name) []:Artix
Email Address []:info@redhat.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:Red Hat

CSR の署名

以下のように CA を使用して CSR に署名します。

openssl ca -config X509CA/openssl.cnf -days 365 -in X509CA/certs/CertName_csr.pem -out X509CA/certs/CertName.pem

このコマンドには、new_ca.pem CA 証明書に関連付けられている秘密鍵のパスフレーズが必要です。以下に例を示します。

Using configuration from X509CA/openssl.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'IE'
stateOrProvinceName :PRINTABLE:'Co. Dublin'
localityName :PRINTABLE:'Dublin'
organizationName :PRINTABLE:'Red Hat'
organizationalUnitName:PRINTABLE:'Systems'
commonName :PRINTABLE:'Bank Server Certificate'
emailAddress :IA5STRING:'info@redhat.com'
Certificate is to be certified until May 24 13:06:57 2000 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

証明書に正常に署名するには、CA 秘密鍵パスフレーズを入力する必要があります (「独自の CA の設定」 を参照)。

注記

openssl.cnf ファイルの [CA_default] セクションで copy_extensions=copy を設定しなかった場合、署名済み証明書には元の CSR にあった証明書エクステンションは含まれません。

ファイルの連結

以下のように、CA 証明書ファイル、CertName.pem 証明書ファイル、CertName_pk.pem 秘密鍵を連結します。

Windows

copy X509CA\ca\new_ca.pem + X509CA\certspass:quotes[_CertName_].pem + X509CA\certspass:quotes[_CertName_]_pk.pem X509CA\certspass:quotes[_CertName_]_list.pem

UNIX

cat X509CA/ca/new_ca.pem X509CA/certs/CertName.pem X509CA/certs/CertName_pk.pem > X509CA/certs/CertName_list.pem

PKCS#12 ファイルの作成

以下のように CertName_list.pem ファイルから PKCS#12 ファイルを作成します。

openssl pkcs12 -export -in X509CA/certs/CertName_list.pem -out X509CA/certs/CertName.p12 -name "New cert"

PKCS#12 証明書を暗号化するパスワードを入力するように求められます。通常、このパスワードは CSR パスワードと同じです (これは、多くの証明書リポジトリーで必要です)。

必要に応じて手順を繰り返します。

ステップ 3 から 6 を繰り返し、システムの完全な証明書セットを作成します。

subjectAltName 拡張機能の設定 (オプション)

特定のホストマシンの証明書の生成後に、openssl.cnf ファイルで subjectAltName 設定を消去して、別の証明書セットに間違った DNS 名を誤って割り当てないようにすることが推奨されます。

openssl.cnf ファイルで、(行頭に # 文字を追加して) subjectAltName 設定をコメントアウトし、さらに copy_extensions 設定もコメントアウトします。