2.5. 独自の証明書の作成
2.5.1. 前提条件
OpenSSL ユーティリティー
このセクションで説明する手順は、OpenSSL プロジェクトの OpenSSL コマンドラインユーティリティーに基づいています。OpenSSL コマンドラインユーティリティーの詳細は、http://www.openssl.org/docs/ を参照してください。
CA ディレクトリー構造の例
図については、CA データベースには以下のディレクトリー構造があることを前提としています。
|
|
|
|
ここで、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 ディレクトリーの下に、以下のディレクトリーの階層を作成します。
|
|
|
|
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 ディレクトリーで、serial
と index.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?
というテキストが表示されたら、 をクリックして 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 の署名
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
ファイルを次のように編集します。
(
openssl.cnf
ファイルにない場合)req_extensions
設定を[req]
セクションに追加します。# openssl Configuration File ... [req] req_extensions=v3_req
[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
適切な 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
ファイルは、以下のエントリーが一致している必要があります。
- 国名
- 州または地区名
- 組織名
証明書のサブジェクト 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 の署名
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
設定もコメントアウトします。