🔑

オレオレ認証局の作成

2024/04/07に公開

はじめに

OpenSSLオレオレ認証局(自己認証局)を構築して署名などの作業をしたので残しておきます。

前提環境

OS:Red Hat Enterprise Linux 8.6 (Ootpa)

OpenSSLインストール手順

OpenSSLのインストール手順は下記コマンドです。

# RHE
# dnf -y install openssl
# Ubuntu
$ sudo apt -y install openssl

インストールしたopensslのバージョンはopenssl versionコマンドで確認できます。

# openssl version
OpenSSL 1.1.1k  FIPS 25 Mar 2021

本記事の環境は2023年の7月頃に準備したのが関係しているのか、1.1.1になっています。
リリースに関する最新情報はOpenSSL Release Strategyにあります。

自己認証局の作成

前準備

OpenSSLがインストールされていない場合は、上記手順でインストールします。
次に使用するディレクトリを作成します。

# mkdir -p /etc/pki/CA/private
# cd /etc/pki/CA

認証局の秘密鍵の作成

秘密鍵にパスフレーズをつける場合は暗号化アルゴリズムを指定します。本手順では-aes256を指定しています。
パスフレーズを聞かれるので入力します。

# openssl genrsa -out ./private/cakey.pem -aes256 4096

Generating RSA private key, 4096 bit long modulus (2 primes)
.........................................++++
................................................................................................++++
e is 65537 (0x010001)
Enter pass phrase for ./private/cakey.pem:
Verifying - Enter pass phrase for ./private/cakey.pem:

作成した秘密鍵の情報を表示するには下記コマンドで表示できます。

# openssl rsa -text -noout -in ./private/cakey.pem

認証局のCSR(証明書署名要求)の作成

下記コマンドでCSRを作成します。コマンドを実行するとパスフレーズを聞かれるので入力します。

# openssl req -new -key /etc/pki/CA/private/cakey.pem -subj "/C=JP/ST=Tokyo/L=Chuo-ku/O=MyRoot/OU=Ca/CN=My Root CA" -out /etc/pki/CA/cacert.csr

Enter pass phrase for /etc/pki/CA/private/cakey.pem:

作成したCSRは秘密鍵の時と同じように表示できます。reqであることに注意してください。

# openssl req -text -noout -in /etc/pki/CA/cacert.csr

認証局のサーバ証明書の作成

下記コマンドで先ほど作成したCSRに署名し、サーバ証明書を作成します。
このコマンドでもパスフレーズを聞かれるので入力します。

# openssl x509 -days 1825 -in /etc/pki/CA/cacert.csr -req -signkey /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem

Signature ok
subject=C = JP, ST = Tokyo, L = Chuo-ku, O = MyRoot, OU = Ca, CN = My Root CA
Getting Private key
Enter pass phrase for /etc/pki/CA/private/cakey.pem:

上記コマンドで作成されたサーバ証明書の内容は下記コマンドで表示できます。

# openssl x509 -in /etc/pki/CA/cacert.pem

その他

ほかに必要なディレクトリなどを作成します。

# mkdir /etc/pki/CA/newcerts
# touch /etc/pki/CA/index.txt
# echo 00 > /etc/pki/CA/serial

今までに作成したフォルダ構成は/etc/pki/tls/openssl.cnf設定ファイル内の設定値と合うように作成しています。

dir             = /etc/pki/CA
private_key     = $dir/private/cakey.pem
certificate     = $dir/cacert.pem
new_certs_dir   = $dir/newcerts
database        = $dir/index.txt
serial          = $dir/serial

CSRへの署名

他サーバーから受け取ったCSRへは下記のコマンドで署名をします。
最近のブラウザではCNではなく、SANの設定値を参照するので、san.txtで設定するようにします。

# echo "subjectAltName = DNS:test.co.jp" > san.txt
# openssl ca -extfile san.txt -in <input file> -policy policy_anything -out <output file>

その他

opensslコマンドではbase64エンコードや暗号化なども可能なので、今後更新していきたいと思います。

参考

Discussion