検証用自己証明書の目的
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 に証明書を送り、証明書を実行すると自動的に読み込みます。
[設定] アプリを開き、[ダウンロードしたプロファイル] をタップして証明書をインストールします。
インストールした証明書は[一般]>[情報]>[プロファイルとデバイスの管理]から確認できます。
ルート認証局として信頼するために、[一般]>[情報]>[証明書信頼設定] を開き、インストールした証明書を有効にします。
コメント