3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

証明書の作り方〜ルート認証局〜

Posted at

前回までの記事

ルート認証局を作る

ルート認証局は,自己署名で作る.これはみんな大好き,オレオレ認証局である.
次のようなファイル構成を目指す.

/etc/pki/
├── tls/
│   └── openssl_root.cnf  # ルートCA用コンフィグ
└── RootCA/
    ├── cacert.pem        # ルートCA証明書
    ├── certs/
    ├── crl/
    ├── index.txt
    ├── newcerts/
    ├── private/          # 権限 600
    │   └── cakey.pem     # ルートCAの秘密鍵,権限 600
    └── serial

準備

コンフィグファイルを作ったり,必要なディレクトリやファイルを作ったり.

コンフィグファイル

openssl.cnfからopenssl_root.cnfを作る.

[~]# cd /etc/pki/tls
[tls]# cp openssl.cnf openssl_root.cnf

openssl_root.cnfの編集箇所は次の通り.

openssl_root.cnf
[ CA_default ]
:
dir		= /etc/pki/RootCA	# Where everything is kept
:
[ v3_ca ]
:
keyUsage = cRLSign, keyCertSign
:

keyUsageを設定しないと,何でもかんでもできるルート認証局ができる.まあ,実験なら何でもできたって別に構わないのだが,こういう設定があるなら使っておかないと,知らないまま本番環境を作ったりしそうだし.以前はnsCertTypeというのを使っていたようだが,ブラウザにインストールされてる最近の証明書を見るとkeyUsageを使うのが最近のやり方らしい.

ルート認証局用のディレクトリ作成

必要なディレクトリとかファイルとか作る.

[~]# mkdir /etc/pki/RootCA
[~]# cd /etc/pki/RootCA
[RootCA]# mkdir certs crl newcerts private
[RootCA]# chmod 600 private
[RootCA]# echo 01 > serial
[RootCA]# touch index.txt

構築

ルート認証局の秘密鍵と証明書を作る.
次のコマンドを実行.

[RootCA]# openssl req -new -x509 -days 3650 \
-config ../tls/openssl_root.cnf \
-out ./cacert.pem \
-keyout ./private/cakey.pem

実行すると,こんな感じ.

Generating a 2048 bit RSA private key
.......+++
.............................+++
writing new private key to './private/cakey.pem'
Enter PEM pass phrase:<ルート認証局用パスワード>
Verifying - 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) [JP]:
State or Province Name (full name) [Kanagawa]:
Locality Name (eg, city) [Yokohama]:
Organization Name (eg, company) [Default Company Ltd]:Matoi
Organizational Unit Name (eg, section) []:    
Common Name (eg, your name or your server's hostname) []:root.ca.myhost
Email Address []:

<ルート認証局用パスワード>は中間認証局の署名で使うので,忘れないようにしておく.実験環境だけなら,どうせ信頼できない認証局なのだからrootとでもしておけば良いんじゃね?どうするかはお好きなように.4文字以上が必須.

Country NameとかStateとか適当に入れていく.デフォルトの値で良ければ,そのままEnterを押していけば良い.Common Nameはルート認証局の名前を入れておく.ここではドメイン名っぽく書いてあるが,よその証明書を見ると普通の文字列で大丈夫のようだ.ただし,他の証明書とは衝突しない,ユニークな文字列にしておかないといけないようだ.

これで,秘密鍵とルート証明書ができた.ルート証明書は自己署名で作るので,よその認証局に署名してもらう必要は無い.

一応,秘密鍵の権限を変更しておく.

[RootCA]# chmod 600 ./private/cakey.pem

これで,ルート認証局ができた.

再構築

一度ルート認証局を作った後にコンフィグファイルを書き換えて,秘密鍵はそのままで再構築するには次のコマンドを実行.

[RootCA]# openssl req -x509 -days 3650 \
-config ../tls/openssl_root.cnf \
-out ./cacert.pem \
-key ./private/cakey.pem

最初にルート認証局を作った時のパスワードを入力すれば,後は同じ.

補足

ここでは実験のため,10年(-days 3650オプション)使える証明書等を作っているが,実際の運用でこれは長すぎる.2018年3月1日以降,SSL証明書の最大有効期間は2年となっている(それまでは3年).

SSL Certificates Will Now Be Capped At Two Years of Validity
SSL証明書の有効期限は2年に短縮される(2018年3月1日施行)

信頼できる各認証局はこれに従っていて,発行可能な証明書の最大有効期間を2年にしているようだ.
実運用なら最大で2年にすべきだが,実験だけなら10年であっても特に問題無く使うことができると思う.証明書の有効期間を見て,はじくシステムはそうそう無いと思う.

これからやること

  • [中間認証局を作る][link-int]
  • [サーバ証明書を作る][link-server]
  • [nginxでTLSを設定する][link-nginx]
  • [Webブラウザにルート証明書をインポートする][link-browser]
  • [クライアント認証][link-client]
3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?