[検証用]OpenSSL で検証用の自己証明書を作成する手順

  • 投稿日:2020.04.22
  •        
  • 更新日:2020.05.09
  •           
  • IT
[検証用]OpenSSL で検証用の自己証明書を作成する手順

検証用自己証明書の目的

HTTPS や SSL など証明書が必要な検証環境を用意するための備忘録です。当然外部向けサービスには利用できないのでそういう目的の場合は外部機関で購入しましょう。簡易な検証環境、利用者が限られたクローズドなサービス環境での利用を目的とします。作業は Ubuntu 18.04 で実行します。

ファイル説明
cacert.key認証局の署名鍵。流出してはいけない。
cacert.cert認証局の証明書。
cacert.pem認証局の署名鍵と証明書の結合ファイル。流出してはいけない。
cacert.der認証局の証明書を配布するときの形式。クライアントにルート証明書として配置。
cacert.nopass.key複合化された署名鍵。流出してはいけない。
cacert.csr認証局の署名要求。作業が終われば消して OK。

環境準備

/etc/ssl/CA 配下に作業環境を作ります。以降 /etc/ssl/CA ディレクトリで作業します。

ディレクトリ名説明
crl失効した証明書のリストを配置
newcerts署名した証明書のコピーが入る。証明書の失効処理に使う。
private認証局の署名鍵を配置
cd /etc/ssl
mkdir CA
cd CA
mkdir certs
mkdir crl
mkdir newcerts
mkdir private
touch index.txt
echo 01 > serial

OpenSSL の設定変更

vim /etc/ssl/openssl.cnf

[CA_default] セクションで次の2箇所の値を変更します。

dir = /etc/ssl/CA
private_key = $dir/private/cacert.key

また、[req_distinguished_name] セクションのデフォルト値は必要であれば変更して入力を簡略化します。

countryName_default = JP
stateOrProvinceName_default = <都市名>
localityName_default = <町名>
0.organizationName_default = <組織名>
organizationalUnitName_default = <部署名>

認証局の証明書を作成する

認証局の署名鍵を作成

自己認証局の大事な署名鍵 cacert.key を作成します。このファイルは流出しないように注意しなければいけません。パスフレーズは自身で決めたものを入力します。

openssl genrsa -aes256 -out private/cacert.key 2048
/etc/ssl/CA# openssl genrsa -aes256 -out private/cacert.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
………………………………………………………………………….+++++
…………………………..+++++
e is 65537 (0x010001)
Enter pass phrase for private/cacert.key:    ←パスフレーズを入力する
Verifying - Enter pass phrase for private/cacert.key:    ←パスフレーズをもう一度入力

認証局の秘密鍵で署名要求を作成

認証局の署名鍵で署名要求 cacert.csr を作成します。署名要求は使用後は削除します。証明書に記載される情報を入力します。

openssl req -new -key private/cacert.key -out cacert.csr
/etc/ssl/CA# openssl req -new -key private/cacert.key -out cacert.csr
Enter pass phrase for private/cacert.key:    ←認証局の署名鍵パスフレーズを入力
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) [JP]:    ←そのまま Enter
State or Province Name (full name) [Tokyo]:    ←そのまま Enter
Locality Name (eg, city) [Chiyoda]:    ←そのまま Enter
Organization Name (eg, company) [Minidora]:    ←そのまま Enter
Organizational Unit Name (eg, section) [Lab]:    ←そのまま Enter
Common Name (e.g. server FQDN or YOUR name) []:ca.ether-zone.com    ←入力必須。認証局サーバーの FQDN「ca.ether-zone.com」を入力
Email Address []:    ←そのまま Enter

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

自分で署名して証明書を作成

自分の署名要求に対して自分の署名鍵で電子署名し、証明書 cacert.cert を作成します。-days で指定した日数の証明書が出来上がります。

openssl x509 -in cacert.csr -days 3650 -req -signkey private/cacert.key -out cacert.cert
/etc/ssl/CA# openssl x509 -in cacert.csr -days 3650 -req -signkey private/cacert.key -out cacert.cert
Signature ok
subject=C = JP, ST = Tokyo, L = Toshima, O = Minidora, OU = Lab, CN = ca.ether-zone.com
Getting Private key
Enter pass phrase for private/cacert.key:    ←認証局の署名鍵パスフレーズを入力

以降、この証明書で各証明要求に署名していきます。

認証局の証明書を配布可能な形式に変換

このように検証用に作成した自己証明書では、他の証明書のように認証局による証明を受けられないため、クライアント側に手動で配置する必要があります。

作成した cacert.der をクライアントに配布します。(クライアントへのインストール方法は後述)

openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der

サーバー証明書を作成する

証明を受けるサーバーで秘密鍵と署名要求を作成

証明書を配置したいサーバーで秘密鍵 sv.key と署名要求 wildcard.csr を作成します。

openssl genrsa -aes256 -out sv.key 2048
/etc/ssl/sv# openssl genrsa -aes256 -out sv.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes).....................................................................................+++++.................................+++++e is 65537 (0x010001)
Enter pass phrase for sv.key:
Verifying - Enter pass phrase for sv.key:
openssl req -new -key sv.key -out wildcard.csr
/etc/ssl/sv# openssl req -new -key sv.key -out wildcard.csr
Enter pass phrase for sv.key:
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) [JP]:    ←認証局に合わせる
State or Province Name (full name) [Tokyo]:    ←認証局に合わせる
Locality Name (eg, city) [Chiyoda]:    ←認証局に合わせる
Organization Name (eg, company) [Minidora]:    ←認証局に合わせる
Organizational Unit Name (eg, section) [Lab]:    ←認証局に合わせる
Common Name (e.g. server FQDN or YOUR name) []:*.ether-zone.com    ←配置するサーバーの FQDN を入力。今回は「*.ether-zone.com」
Email Address []:    ←そのまま Enter

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

作成した署名要求ファイルを認証局に送ります。

認証局でサーバー証明書を作成

認証局にて、サーバーからの認証要求を利用してサーバー証明書 wildcard.cert を作成します。指定しない場合は1年間有効なものが作られます。

openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -in ./tmp/wildcard.csr -out ./tmp/wildcard.cert
/etc/ssl/CA# openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -in ./tmp/wildcard.csr -out ./tmp/wildcard.cert
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/CA/private/cacert.key:    ←認証局の署名鍵パスフレーズを入力
Can't open /etc/ssl/CA/index.txt.attr for reading, No such file or directory
139957705368000:error:02001002:system library:fopen:No such file or directory:../crypto/bio/bss_file.c:72:fopen('/etc/ssl/CA/index.txt.attr','r')
139957705368000:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:79:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Apr 22 10:50:01 2020 GMT
Not After : Apr 22 10:50:01 2021 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
localityName = Toshima
organizationName = Minidora
organizationalUnitName = Lab
commonName = *.ether-zone.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
BB:44:B0:96:D8:EC:45:A6:DA:90:1F:DE:9F:88:20:28:57:EE:DB:04
X509v3 Authority Key Identifier:
DirName:/C=JP/ST=Tokyo/L=Toshima/O=Minidora/OU=Lab/CN=ca.ether-zone.com
serial:18:0B:4B:B3:AB:61:76:2D:7E:7D:10:D3:50:DD:13:3C:CA:A1:AC:B5

Certificate is to be certified until Apr 22 10:50:01 2021 GMT (365 days)
Sign the certificate? [y/n]:y    ←y と入力


1 out of 1 certificate requests certified, commit? [y/n]y    ←y と入力
Write out database with 1 new entries
Data Base Updated

作成した証明書ファイルをサーバーに送ります。作成された証明書ファイルは次のような中身です。

/etc/ssl/sv# cat wildcard.cert
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, L=Toshima, O=Minidora, OU=Lab, CN=ca.ether-zone.com
Validity
Not Before: Apr 22 10:50:01 2020 GMT
Not After : Apr 22 10:50:01 2021 GMT
Subject: C=JP, ST=Tokyo, L=Toshima, O=Minidora, OU=Lab, CN=*.ether-zone.com
(以下省略)

PEM 形式の証明書ファイルを作成

必要に応じて暗号化を解いた秘密鍵とサーバー証明書を結合した PEM 形式のファイルを作ります。wildcard.pem にも秘密鍵が含まれるため、流出しないようにします。

openssl rsa -in sv.key -out sv.nopass.key
cat sv.key wildcard.cert > wildcard.pem
/etc/ssl/sv# openssl rsa -in sv.key -out sv.nopass.key
Enter pass phrase for sv.key:    ←サーバーの秘密鍵パスフレーズを入力
writing RSA key
/etc/ssl/sv# cat sv.key wildcard.cert > wildcard.pem

証明書ファイルの期限更新

サーバー証明書の有効期限を更新する手順は次の通りです。

openssl x509 -days 700 -signkey sv.key -in wildcard.cert -out wildcard.cert.new
mv wildcard.cert wildcard.cert.old
mv wildcard.cert.new wildcard.cert
openssl x509 -noout -text -in wildcard.cert
/etc/ssl/sv# openssl x509 -days 700 -signkey sv.key -in wildcard.cert -out wildcard.cert.new
Getting Private key
Enter pass phrase for sv.key:
/etc/ssl/sv#
/etc/ssl/sv# mv wildcard.cert wildcard.cert.old
/etc/ssl/sv# mv wildcard.cert.new wildcard.cert
/etc/ssl/sv# openssl x509 -noout -text -in wildcard.cert
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = JP, ST = Tokyo, L = Toshima, O = Minidora, OU = Lab, CN = *.ether-zone.com
Validity
Not Before: Apr 22 10:57:32 2020 GMT
Not After : Mar 23 10:57:32 2022 GMT     ←有効期限が更新されている
Subject: C = JP, ST = Tokyo, L = Toshima, O = Minidora, OU = Lab, CN = *.ether-zone.com

クライアントへ証明書をインストールする

クライアントへ認証局の自己証明書(cacert.der)を配置することで、認証局に署名された他のサーバー証明書を信頼することができます。

Windows への証明書インストール

cacert.der をWindows 環境に送り、ファイルをダブルクリックします。[証明書のインストール]をクリックして証明書を取り込みます。

インポートウィザードを進め、[証明書ストア]ページで[信頼されたルート証明機関]を選択します。選択したらそのままウィザードを進めます。

インストールに際して警告が表示されます。自分の作成したものであることを確認して[はい]をクリックします。

これで証明書が信頼されました。

iPhone への証明書インストール

iCloud やメールを使って iPhone に証明書を送り、証明書を実行すると自動的に読み込みます。

[設定]アプリを開き、[ダウンロードしたプロファイル]をタップして証明書をインストールします。

インストールした証明書は[一般]>[情報]>[プロファイルとデバイスの管理]から確認できます。

ルート認証局として信頼するために、[一般]>[情報]>[証明書信頼設定]を開き、インストールした証明書を有効にします。