kakiro-webカキローウェブ

システム開発情報とコンピューター書籍の紹介サイト

CentOS7.2 64bit OpenSSLを使用して自己認証局で署名したSSLクライアント証明書を作成

外部に公開しているWebサイト等でアクセス制限を行いたい場合、ユーザーIDとパスワードの入力による認証や、ファイアウォールを使用してアクセス元のIPアドレスによる制限を行うこともできますが、SSLクライアント証明書を使用することで、特定の証明書を所有する端末からのアクセスのみを許可するように制限することができます。

ここでは、CentOS7.2の標準リポジトリからインストールできるOpenSSL1.0.1eを使用して、自己認証局で署名したSSLクライアント証明書を作成する方法を、以下に示します。

※当サイトのSSLサーバー証明書の作成に関するページでも、SSLについて記載しています。CentOS7 64bit OpenSSLを使用して秘密鍵、CSRを作成し、自己署名のSSLサーバー証明書を作成のページCentOS7 64bit OpenSSLを使用して秘密鍵と自己署名のSSLサーバー証明書を同時に作成のページをご覧ください。

※SSLクライアント証明書のWindows、Macへのインストール(インポート)については、当サイトのSSLクライアント証明書をWindows、Macにインストール(インポート)のページをご覧ください。

※ApacheでSSLクライアント証明書を使用したアクセス制御を行う方法については、当サイトのCentOS7 64bit Apache2.4 SSLクライアント証明書を使用したアクセス制御のページをご覧ください。

SSLクライアント証明書の作成の流れ

初めにSSLクライアント証明書を作成する流れを簡単でありますが、記載しておきます。

※SSLクライアント証明書には、当サイトのCentOS7 64bit OpenSSLを使用して秘密鍵と自己署名のSSLサーバー証明書を同時に作成のページにも記載しているような方法で作成した自己署名の証明書を使用することもできますが、Apacheでアクセス制限を行う場合に、1つのサイトに対し、複数のSSLクライアント証明書を使用するのが難しくなってしまいますので、自己認証局で署名したSSLクライアント証明書を作成するようにします。

※Apacheでは指定の認証局により署名されたSSLクライアント証明書を所有する端末からのアクセスを許可することで、1つのサイトに対し、複数のSSLクライアント証明書を使用することが可能になっています。

  • 認証局(CA:Certification Authority)用の秘密鍵と証明書を、サーバーで作成します。

    アクセス元を制限する目的で使用するSSLクライアント証明書であれば、署名を行う認証局は自己認証局にすることもできますので、ここでは認証局の証明書は自己署名の証明書を作成するようにします。

  • クライアント用の秘密鍵を、サーバーで作成します。

  • SSLクライアント証明書を認証局で署名して作成する際に必要となるCSR(Certificate Signing Request)を、サーバーで作成します。

    CSRには、先に作成したクライアント用の秘密鍵と対になる公開鍵が含まれます。

  • CSRを元に、認証局の秘密鍵を使用して署名したSSLクライアント証明書を、サーバーで作成します。

    SSLクライアント証明書には、クライアント用の公開鍵が含まれます。

  • SSLクライアント証明書を使用した認証を行うには、クライアントにクライアント用の秘密鍵とSSLクライアント証明書をインストールする必要があります。

    クライアントに秘密鍵とSSLクライアント証明書のインストールを行う際には、この2つのファイルをまとめたPKCS#12(Public Key Cryptography Standard #12)という形式のファイルが使用されます。

    クライアント用の秘密鍵とSSLクライアント証明書からPKCS#12形式のファイルを、サーバーで作成します。

  • サーバーで作成したPKCS#12形式のファイルをクライアントに配布し、クライアントで秘密鍵とSSLクライアント証明書のインストールを行います。

SSLクライアント証明書による認証の流れ

続いてSSLクライアント証明書による認証の流れを簡単でありますが、記載しておきます。

  • クライアントからサーバーにSSLクライアント証明書を送信します。

  • サーバーは認証局の証明書を使用して、SSLクライアント証明書が認証局により署名されたものか検証します。

    認証局の証明書には認証局の公開鍵が含まれており、認証局の公開鍵を使用して、SSLクライアント証明書の署名が認証局の秘密鍵で行われたものであることを確認します。

    ここでは、認証局の証明書には自己認証局の証明書を使用することになります。

  • SSLクライアント証明書の所有者がクライアントであることを示すために、クライアントからサーバーにクライアント用の秘密鍵で暗号化したデータを送信します。

  • サーバーはSSLクライアント証明書に含まれるクライアント用の公開鍵で受信したデータを復号化することで、データを送信してきたのがSSLクライアント証明書を所有するクライアントであることを確認します。

自己認証局用の秘密鍵と証明書を作成

ここでは、自己認証局用の証明書には自己書名の証明書を使用しますので、秘密鍵と同時に作成することができます。

以下のようなコマンドを実行して、自己認証局用の秘密鍵と自己署名の証明書の作成を行います。

# openssl req -x509 -newkey rsa:2048 -nodes -keyout ca.key -sha256 -days 3650 -out ca.crt
  • 「openssl req」コマンドは、CSRに関する処理となるのですが、「-x509」オプションを指定すると、自己署名の証明書が作成されるようになります。

    x509というのは、証明書の規格になります。

  • 「-newkey」オプションで、作成する秘密鍵で使用する暗号方式を指定します。

    ここでは、「rsa:2048」と指定し、RSAの鍵をサイズ2048ビットで作成するようにしています。

    RSAは、公開鍵暗号で主に使用される暗号方式になります。

    RSAの鍵のサイズは2048ビット以上であれば、強度が十分なものとなりますので、ここでは2048ビットになるように指定しています。

  • 「-nodes」オプションを指定すると、秘密鍵にパスフレーズを付けた暗号化は行われなくなります。

    このコマンドでは、秘密鍵にパスフレーズを付けて暗号化する際の、共通鍵暗号の方式を指定するオプションがないようですので、ここではパスフレーズを付けないようにしています。

    秘密鍵にパスフレーズを付けて暗号化するのは、秘密鍵の作成後に行うこともできます。その手順については、当サイトのCentOS7 64bit OpenSSLを使用して秘密鍵、CSRを作成し、自己署名のSSLサーバー証明書を作成のページをご覧ください。

  • 「-keyout」オプションで、作成する秘密鍵のファイル名を指定します。

    秘密鍵のファイル名は任意です。拡張子に決まりもありません。

    ここでは、「ca.key」という名前の秘密鍵を作成するようにしています。

  • 証明書の署名アルゴリズムには、SHA-1ではなくSHA-2(SHA-256)を使用することが推奨されています。

    「-sha256」オプションを指定して、証明書の署名アルゴリズムにSHA-256を使用するようにしています。

  • 「-days」オプションで、証明書の有効期限を日単位で指定します。

    ここでは、「3650」と指定し、証明書の有効期限を3650日(約10年)にしています。

  • 「-out」オプションで、作成する証明書のファイル名を指定します。

    証明書のファイル名は任意です。拡張子に決まりもありません。

    ここでは、「ca.crt」という名前の証明書を作成するようにしています。

コマンドの実行時に入力を求められる以下の項目については、ここではサンプル用の値を指定しています。公的な認証局にSSLサーバー証明書の作成を依頼する場合にどのような指定をするものなのかは、認証局のホームページに各項目の説明があるかと思いますので、そちらを参考にしてみてください。

空にしている項目については、公的な認証局にSSLサーバー証明書の作成を依頼する場合も空でよいようですので、ここでも空にしています。

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:CaExampleState
Locality Name (eg, city) [Default City]:CaExampleLocality
Organization Name (eg, company) [Default Company Ltd]:CaExampleOrganization
Organizational Unit Name (eg, section) []:CaExampleOrganizationalUnit
Common Name (eg, your name or your server's hostname) []:ca.example.com
Email Address []:

「openssl req」コマンドに関する設定ファイルの内容

OpenSSLの設定ファイル「/etc/pki/tls/openssl.cnf」で、「openssl req」コマンドに関するデフォルトの内容は、以下のようになっています。

[ req ]
default_bits            = 2048
default_md              = sha256
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert

# Passwords for private keys if not present they will be prompted for
# input_password = secret
# output_password = secret

# This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString.
# pkix   : PrintableString, BMPString (PKIX recommendation before 2004)
# utf8only: only UTF8Strings (PKIX recommendation after 2004).
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
string_mask = utf8only

# req_extensions = v3_req # The extensions to add to a certificate request
  • 設定の「default_bits」は、コマンドの「-newkey」オプションでRSAの秘密鍵を作成する際の鍵のサイズに使用されます。

    設定ファイルの値は「2048」で、コマンドのオプションで「-newkey rsa:2048」と指定しているものと同じになりますので、このコマンドのオプションは「-newkey rsa」と指定しても同じ結果となります。

  • 設定の「default_md」は、証明書の署名に使用するアルゴリズムになります。

    設定ファイルの値は「sha256」で、コマンドのオプションで「-sha256」と指定しているものと同じになりますので、このコマンドのオプションは指定しなくても同じ結果となります。

  • 設定の「x509_extensions」は、自己署名の証明書を作成する際に、証明書に追加される拡張領域に関する指定になります。

    設定ファイルの値は「v3_ca」となっており、証明書はx509のバージョン3で、拡張領域を追加して作成されるようになります。

    この設定をコメントアウトすると、証明書はx509のバージョン1で、拡張領域はなしで作成されるようになります。

作成された秘密鍵の詳しい内容

秘密鍵の詳しい内容は、以下のようなコマンドで確認することができます。

# openssl rsa -in ca.key -text -noout
※出力は割愛します。

コマンドの詳細や出力内容については、当サイトのCentOS7 64bit OpenSSLを使用して秘密鍵と自己署名のSSLサーバー証明書を同時に作成のページに記載しているものと同様になりますので、ご覧ください。

作成された証明書の詳しい内容

証明書の詳しい内容は、以下のようなコマンドで確認することができます。

# openssl x509 -in ca.crt -text -noout
※出力は割愛します。

コマンドの詳細や出力内容については、当サイトのCentOS7 64bit OpenSSLを使用して秘密鍵と自己署名のSSLサーバー証明書を同時に作成のページに記載しているものと同様になりますので、ご覧ください。

クライアント用の秘密鍵を作成

クライアント用の秘密鍵は、SSLクライアント証明書と一緒に1つにまとめてPKCS#12という形式のファイルにし、このときにパスワードの設定を行いますので、ここでは秘密鍵はパスフレーズなしで作成します。

以下のようなコマンドを実行して、クライアント用の秘密鍵の作成を行います。

# openssl genrsa -out client01.key 2048
  • 公開鍵暗号の方式には、主にRSAが使用されます。

    RSAの秘密鍵を作成するには、「openssl genrsa」コマンドを使用します。

  • 「-out」オプションで、作成する秘密鍵のファイル名を指定します。

    秘密鍵のファイル名は任意です。拡張子に決まりもありません。

    ここでは、「client01.key」という名前の秘密鍵を作成するようにしています。

  • コマンドの引数に、RSAの鍵のサイズを指定します。

    RSAの鍵のサイズは2048ビット以上であれば、強度が十分なものとなりますので、ここでは2048ビットになるように指定しています。

作成された秘密鍵の詳しい内容

秘密鍵の詳しい内容は、以下のようなコマンドで確認することができます。

# openssl rsa -in client01.key -text -noout
※出力は割愛します。

コマンドの詳細や出力内容については、当サイトのCentOS7 64bit OpenSSLを使用して秘密鍵、CSRを作成し、自己署名のSSLサーバー証明書を作成のページに記載しているものと同様になりますので、ご覧ください。

クライアント用のCSR(Certificate Signing Request)を作成

以下のようなコマンドを実行して、クライアント用のCSRの作成を行います。

# openssl req -new -key client01.key -out client01.csr
  • CSRに関する処理には、「openssl req」コマンドを使用します。

  • 「-new」オプションを指定すると、CSRの作成が行われるようになります。

  • 「-key」オプションで、CSRの作成に使用する秘密鍵を指定します。

    ここでは、上記で作成した秘密鍵「client01.key」を指定しています。

    ここで指定した秘密鍵が、CSRに含まれる公開鍵と対になります。

  • 「-out」オプションで、作成するCSRのファイル名を指定します。

    CSRのファイル名は任意です。拡張子に決まりもありません。

    ここでは、「client01.csr」という名前のCSRを作成するようにしています。

コマンドの実行時に入力を求められる以下の項目については、ここではサンプル用の値を指定しています。公的な認証局にSSLサーバー証明書の作成を依頼する場合にどのような指定をするものなのかは、認証局のホームページに各項目の説明があるかと思いますので、そちらを参考にしてみてください。

空にしている項目については、公的な認証局にSSLサーバー証明書の作成を依頼する場合も空でよいようですので、ここでも空にしています。

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Client01ExampleState
Locality Name (eg, city) [Default City]:Client01ExampleLocality
Organization Name (eg, company) [Default Company Ltd]:Client01ExampleOrganization
Organizational Unit Name (eg, section) []:Client01ExampleOrganizationalUnit
Common Name (eg, your name or your server's hostname) []:client01.example.com
Email Address []:

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

作成されたCSRの詳しい内容

CSRの詳しい内容は、以下のようなコマンドで確認することができます。

# openssl req -in client01.csr -text -noout
※出力は割愛します。

コマンドの詳細や出力内容については、当サイトのCentOS7 64bit OpenSSLを使用して秘密鍵、CSRを作成し、自己署名のSSLサーバー証明書を作成のページに記載しているものと同様になりますので、ご覧ください。

自己認証局の準備

インデックスファイルを作成

認証局で署名した証明書を作成する際には、署名した証明書の情報を保存するインデックスファイルが必要となります。

インデックスファイルがない状態で証明書の作成を行うと、以下のようなエラーになってしまいます。

/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
140051007969184:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r')
140051007969184:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

インデックスファイルの初期状態は、空にします。

以下のようなコマンドを実行して、インデックスファイルの作成を行います。

# touch /etc/pki/CA/index.txt

シリアル番号のファイルを作成

認証局で署名した証明書を作成する際には、シリアル番号のファイルが必要となります。

シリアル番号のファイルがない状態で証明書の作成を行うと、以下のようなエラーになってしまいます。

/etc/pki/CA/serial: No such file or directory
error while loading serial number
140140859271072:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/serial','r')
140140859271072:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

シリアル番号のファイルの初期状態は、ここでは「01」と記載された状態にします。

以下のようなコマンドを実行して、シリアル番号のファイルの作成を行います。

# echo 01 > /etc/pki/CA/serial

自己認証局で署名したSSLクライアント証明書を作成

以下のようなコマンドを実行して、自己認証局で署名したSSLクライアント証明書の作成を行います。

# openssl ca -in client01.csr -out client01.crt -keyfile ca.key -cert ca.crt -md sha256 -days 3650 -policy policy_anything
  • 認証局に関する処理には、「openssl ca」コマンドを使用します。

  • 「-in」オプションで、SSLクライアント証明書の作成に使用するCSRを指定します。

    ここでは、上記で作成したCSR「client01.csr」を指定しています。

  • 「-out」オプションで、作成するSSLクライアント証明書のファイル名を指定します。

    SSLクライアント証明書のファイル名は任意です。拡張子に決まりもありません。

    ここでは、「client01.crt」という名前のSSLクライアント証明書を作成するようにしています。

  • 「-keyfile」オプションで、署名に使用する認証局の秘密鍵を指定します。

    ここでは、上記で作成した自己認証局の秘密鍵「ca.key」を指定しています。

  • 「-cert」オプションで、認証局の証明書を指定します。

    ここでは、上記で作成した自己認証局の証明書「ca.crt」を指定しています。

  • 「-md」オプションで、証明書の署名に使用するアルゴリズムを指定します。

    証明書の署名アルゴリズムには、SHA-1ではなくSHA-2(SHA-256)を使用することが推奨されています。

    ここでは、「sha256」と指定し、証明書の署名アルゴリズムにSHA-256を使用するようにしています。

  • 「-days」オプションで、証明書の有効期限を日単位で指定します。

    ここでは、「3650」と指定し、証明書の有効期限を3650日(約10年)にしています。

  • 「-policy」オプションで、認証局が署名を行う際に、認証局の証明書と、クライアントのCSRで、「Country Name」や「State or Province Name」といった値が、一致している必要があるか、必須であるかといったポリシーを指定します。

    ここでは、「policy_anything」と指定し、「Common Name」は必須で、それ以外は任意になるようにしています。

    この指定については、下記の設定ファイルに関する記載でも説明します。

コマンドの実行時に以下のように確認を2回求められますので、2回とも「y」と入力します。

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

「openssl ca」コマンドに関する設定ファイルの内容

OpenSSLの設定ファイル「/etc/pki/tls/openssl.cnf」で、「openssl ca」コマンドに関するデフォルトの内容は、以下のようになっています。

####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section

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

dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
RANDFILE        = $dir/private/.rand    # private random number file

x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

# Extension copying option: use with caution.
# copy_extensions = copy

# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions        = crl_ext

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = sha256                # use SHA-256 by default
preserve        = no                    # keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
  • 設定の「database」は、インデックスファイルのパスになります。

    設定の「dir」と組み合わせて、インデックスファイルには「/etc/pki/CA/index.txt」が使用されるようになっています。

  • 設定の「unique_subject」は、認証局で署名した証明書を作成する際に、CSRの情報(CSRの作成時に入力する情報)が、以前に作成した証明書と重複することを許可するかを指定するものになります。

    設定ファイルではコメントアウトされており、この場合は「yes」が使用され、CSRの情報の重複は許可されないようになります。

  • 設定の「new_certs_dir」は、署名した証明書の内容が記載されたファイルが保存されるディレクトリになります。

    設定の「dir」と組み合わせて、保存先には「/etc/pki/CA/newcerts」が使用されるようになっています。

    ここに保存されるファイルの名前は、「シリアル番号.pem」という形式になります。

  • 設定の「serial」は、シリアル番号のファイルのパスになります。

    設定の「dir」と組み合わせて、シリアル番号のファイルには「/etc/pki/CA/serial」が使用されるようになっています。

  • 設定の「default_days」は、証明書に指定される有効期限の日数になります。

    コマンドのオプション「-days」で、設定ファイルの値とは異なるものを指定することができます。

    設定ファイルの値は「365」で、証明書の有効期限には365日が指定されるようになっています。

  • 設定の「default_md」は、証明書の署名に使用するアルゴリズムになります。

    コマンドのオプション「-md」で、設定ファイルの値とは異なるものを指定することができます。

    設定ファイルの値は「sha256」で、コマンドのオプションで「-md sha256」と指定しているのと同じになりますので、このコマンドのオプションは指定しなくても同じ結果となります。

  • 設定の「policy」は、認証局が署名を行う際に、認証局の証明書と、クライアントのCSRで、「Country Name」や「State or Province Name」といった値が、一致している必要があるか、必須であるかといったポリシーになります。

    コマンドのオプション「-policy」で、設定ファイルの値とは異なるものを指定することができます。

    設定ファイルの値は「policy_match」で、その下にある [ policy_match ] に記載されているポリシーが使用されます。

    「policy_match」では、「countryName」、「stateOrProvinceName」、「organizationName」は「match」となっていますので、認証局と一致する必要があり、「commonName」は「supplied」となっていますので、必須で、「organizationalUnitName」、「emailAddress」は「optional」となっていますので、任意になります。

    「policy_match」の下にある「policy_anything」では、「commonName」のみが必須で、それ以外は、任意となっています。認証局と一致する必要がある項目はありません。

上記のコマンドで、「-policy policy_anything」を指定しなかった場合、例えば、認証局の証明書と、クライアントのCSRで、「State or Province Name」の値が一致していないと、以下のようなエラーになってしまいます。

The stateOrProvinceName field needed to be the same in the
CA certificate (CaExampleState) and the request (Client01ExampleState)

自己認証局で署名した証明書を作成後のインデックスファイルの内容

自己認証局で署名した証明書を作成後の、インデックスファイル「/etc/pki/CA/index.txt」の内容は、以下のようになります。

V    260524142546Z       01  unknown /C=JP/ST=Client01ExampleState/L=Client01ExampleLocality/O=Client01ExampleOrganization/OU=Client01ExampleOrganizationalUnit/CN=client01.example.com

作成された証明書の情報が追記されています。

今後、新たに自己認証局で署名した証明書を作成していくと、同様の情報が追記されていくようになっています。

自己認証局で署名した証明書を作成後のシリアル番号のファイルの内容

自己認証局で署名した証明書を作成後の、シリアル番号のファイル「/etc/pki/CA/serial」の内容は、以下のようになります。

02

シリアル番号がひとつ増え、次の証明書のシリアル番号には「02」が割り当てられるようになります。

今後、新たに自己認証局で署名した証明書を作成していくと、シリアル番号がさらにひとつ増えていくようになっています。

自己認証局で署名した証明書を作成後に作成されるファイル

自己認証局で署名した証明書を作成後には、インデックスファイル「/etc/pki/CA/index.txt」の更新、シリアル番号のファイル「/etc/pki/CA/serial」の更新以外に、以下のファイルが作成されます。

  • 「/etc/pki/CA/index.txt.old」

    自己認証局で署名した証明書を作成前の、インデックスファイルのバックアップになります。

  • 「/etc/pki/CA/index.txt.attr」

    自己認証局で署名した証明書を作成する際の、設定情報が記載されたファイルになります。

  • 「/etc/pki/CA/serial.old」

    自己認証局で署名した証明書を作成前の、シリアル番号のファイルのバックアップになります。

  • 「/etc/pki/CA/newcerts/01.pem」

    自己認証局で署名した証明書の内容が記載されたファイルになります。

    ファイルの名前は、「シリアル番号.pem」という形式になります。

以前に作成したSSLクライアント証明書と同じ情報を持つCSRから証明書の再作成を行いたい場合

以前に作成したSSLクライアント証明書と同じ情報(CSRの作成時に入力する情報)を持つCSRから証明書の再作成を行いたい場合、デフォルトの設定の状態ですと、以下のようなエラーになってしまいます。

failed to update database
TXT_DB error number 2

以下のいずれかの方法で、証明書の再作成が行えるようになります。

OpenSSLの設定ファイルでCSRの情報の重複を許可する

OpenSSLの設定ファイル「/etc/pki/tls/openssl.cnf」にCSRの情報の重複に関する設定があり、デフォルトでは以下のようになっています。

[ CA_default ]
:(略)
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.

設定の「unique_subject」が、CSRの情報の重複の許可の指定になります。

デフォルトではコメントアウトされており、この場合「yes」が使用され、CSRの情報の重複は許可されなくなります。

以下のように「no」を指定すると、CSRの情報の重複が許可されるようになります。

unique_subject = no

ただし、既に自己認証局で署名した証明書を作成済みの場合、設定情報がファイル「/etc/pki/CA/index.txt.attr」に以下のように記載されており、こちらが優先されて使用されるようになります。

unique_subject = yes

以下のように「no」を指定するように変更することで、CSRの情報の重複が許可されるようになります。

unique_subject = no

また、「index.txt.attr」の変更を繰り返していると、証明書を作成時に以下のようなエラーになってしまうことがあります。

error creating name index:(2,0,1)

このように証明書の作成ができなくなってしまった場合は、一度インデックスファイルと設定情報のファイルを削除してみてください。

# rm /etc/pki/CA/index.txt
# rm /etc/pki/CA/index.txt.attr

自己認証局で署名したSSLクライアント証明書を失効させる

作成済みのSSLクライアント証明書を失効させることで、以前と同じ情報を持つ証明書の再作成を行うことができるようになります。

以下のようなコマンドを実行して、SSLクライアント証明書を失効させます。

# openssl ca -revoke /etc/pki/CA/newcerts/01.pem -keyfile ca.key -cert ca.crt
  • 認証局に関する処理には、「openssl ca」コマンドを使用します。

  • 「-revoke」オプションで、失効させるSSLクライアント証明書を指定します。

    自己認証局で署名済みのSSLクライアント証明書は、ディレクトリ「/etc/pki/CA/newcerts/」に、ファイル名が「シリアル番号.pem」の形式で保存されています。

    ここでは、シリアル番号が「01」のSSLクライアント証明書「01.pem」を指定しています。

  • 「-keyfile」オプションで、認証局の秘密鍵を指定します。

    ここでは、上記で作成した自己認証局の秘密鍵「ca.key」を指定しています。

  • 「-cert」オプションで、認証局の証明書を指定します。

    ここでは、上記で作成した自己認証局の証明書「ca.crt」を指定しています。

SSLクライアント証明書を失効させた後の、インデックスファイル「/etc/pki/CA/index.txt」の内容は、以下のようになります。

R    260524142546Z   160526142832Z   01  unknown /C=JP/ST=Client01ExampleState/L=Client01ExampleLocality/O=Client01ExampleOrganization/OU=Client01ExampleOrganizationalUnit/CN=client01.example.com

先頭の「V」が「R」に変更されており、失効したことを示していると思われます。

以前に作成したSSLクライアント証明書を失効させた後に、再度同じ情報を持つものの作成を行うと、インデックスファイルの内容は、以下のようになります。

R    260524142546Z   160526142832Z   01  unknown /C=JP/ST=Client01ExampleState/L=Client01ExampleLocality/O=Client01ExampleOrganization/OU=Client01ExampleOrganizationalUnit/CN=client01.example.com
V   260524143229Z       02  unknown /C=JP/ST=Client01ExampleState/L=Client01ExampleLocality/O=Client01ExampleOrganization/OU=Client01ExampleOrganizationalUnit/CN=client01.example.com

失効させた証明書と同じ情報を持つものが追記されています。

クライアント用の秘密鍵とSSLクライアント証明書からPKCS#12形式のファイルを作成

クライアントに秘密鍵とSSLクライアント証明書のインストールを行う際には、この2つのファイルをまとめたPKCS#12(Public Key Cryptography Standard #12)という形式のファイルが使用されます。

以下のようなコマンドを実行して、クライアント用の秘密鍵とSSLクライアント証明書からPKCS#12形式のファイルの作成を行います。

# openssl pkcs12 -export -inkey client01.key -in client01.crt -out client01.pfx
  • PKCS#12形式のファイルに関する処理には、「openssl pkcs12」コマンドを使用します。

  • 「-export」オプションを指定すると、PKCS#12形式のファイルの作成が行われるようになります。

  • 「-inkey」オプションで、PKCS#12形式のファイルに含める秘密鍵を指定します。

    ここでは、上記で作成したクライアント用の秘密鍵「client01.key」を指定しています。

  • 「-in」オプションで、PKCS#12形式のファイルに含める証明書を指定します。

    ここでは、上記で作成したSSLクライアント証明書「client01.crt」を指定しています。

  • 「-out」オプションで、作成するPKCS#12形式のファイルのファイル名を指定します。

    PKCS#12形式のファイルのファイル名は任意です。拡張子には主に「pfx」が使用されます。

    ここでは、「client01.pfx」という名前のPKCS#12形式のファイルを作成するようにしています。

  • コマンドの実行時にPKCS#12形式のファイルに設定するパスワードの入力を2回求められますので、同じパスワードを2回入力します。

    このパスワードは、クライアントで秘密鍵とSSLクライアント証明書のインストールを行う際に指定が必要なものとなります。

CentOS7.2 64bit OpenSSLを使用して自己認証局で署名したSSLクライアント証明書を作成については、以上です。

Linuxの基礎知識に関するおすすめの書籍

当サイトの書籍紹介ページで、Linuxの基礎知識に関するおすすめの書籍の紹介も行っておりますので、ご覧ください。

暗号技術に関するおすすめの書籍

当サイトの書籍紹介ページで、暗号技術に関するおすすめの書籍の紹介も行っておりますので、ご覧ください。