LoginSignup
61
61

More than 5 years have passed since last update.

OpenSSLによるオレオレ認証局が署名した証明書の作成

Posted at

opensslコマンドを使って、オレオレ認証局(CA)を作成し、そのオレオレCAが署名した証明書を作成する流れについて、たまにやるけどすぐに忘れるのでまとめ。

CA証明書の作成

CAの秘密鍵の作成

RSA秘密鍵を作成する。

openssl genrsa 2048 > ca.key
  • -outでファイルを指定しても、標準出力をリダイレクトでファイルに書き込んでもどちらでもよい

-----BEGIN RSA PRIVATE KEY-----で始まるファイルができる。-----BEGINで始まるファイルはPEM形式のファイルである。鍵や証明書のファイルによく使われる拡張子にはばらつきがあり、.pemとか.derというのはファイルのエンコーディングを表しているが、.crt.cer.key.csrというのはファイルの内容を表している。

秘密鍵の内容を確認する。

openssl rsa -text -noout -in ca.key

公開鍵の作成

秘密鍵から公開鍵を作成する。この後この公開鍵を直接使うわけではないのでオプション。

openssl rsa -in ca.key -pubout -out ca-public.key

-----BEGIN PUBLIC KEY-----で始まるファイルができる。

(参考)

-puboutではなく-RSAPublicKey_outを指定すると、RSA PUBLIC KEYができる。PUBLIC KEYの場合は先頭の32文字にRSAかDHかECかを示す情報がついているが中身は同じであり、先頭の32文字を取り除いて改行をそろえれば同じになる。

(参考)

よくSSHの公開鍵認証のセットアップで使うssh-keygenコマンドで鍵ペアを生成した場合、id_rsaはPEM形式だが、id_rsa.pubはOpenSSHの独自形式のファイルである。このファイルは以下のコマンドでPEM形式に変換できる。

ssh-keygen -f id_rsa.pub -e -m pem

-m pemRSA PUBLIC KEYになる。-m pkcs8だとPUBLIC KEYになる。-m ssh2あるいは-mを指定しない場合はSSH2 PUBLIC KEYになる。

証明書署名要求の作成

秘密鍵から証明書署名要求(CSR)を作成する。

openssl req -new -key ca.key -subj "/CN=rootca" > ca.csr
  • -subjを指定しない場合は対話式での入力になる

-----BEGIN CERTIFICATE REQUEST-----ではじまるファイルができる。

CSRの内容を確認する。

openssl req -text -noout -in ca.csr

証明書の作成(認証局による公開鍵への自己署名)

証明書署名要求に秘密鍵で署名する(自己署名)。

openssl x509 -req -in ca.csr -signkey ca.key -days 10000 -out ca.crt 

-----BEGIN CERTIFICATE-----ではじまるファイルができる。

証明書の内容を確認する。

openssl x509 -text -noout -in ca.crt

(参考)

証明書署名要求の作成と証明書の作成をまとめてやる場合は以下。

openssl req -x509 -new -nodes -key ca.key -subj "/CN=rootca" -days 10000 -out ca.crt
  • -x509はOutput a self-signed certificate instead of a certificate request.
  • -nodesはDo not encrypt private keys.(不要?)
  • -days-x509と一緒に使う

証明書の作成

秘密鍵の作成

秘密鍵を作成する。

openssl genrsa 2048 > server.key

内容を確認する。

openssl rsa -text -noout -in server.key

公開鍵の作成

秘密鍵から公開鍵を作成する(オプション)。

openssl rsa -in server.key -pubout -out server-public.key

証明書署名要求の作成

証明書署名要求を作成する。

openssl req -new -key server.key -subj "/CN=servername" > server.csr

CSRの内容を確認する。

openssl req -text -noout -in server.csr

(参考)

マルチドメイン証明書用のCSRを作成する場合は、Subject Alternative Namesのx509v3拡張属性を使う必要があり、以下のようにする。

csr.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
CN = servername

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = othername1
DNS.2 = othername2

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
openssl req -new -key server.key -config csr.conf -out server.csr

設定値の詳細は以下を参照。

証明書の作成(認証局による公開鍵への署名)

証明書を作成する(CAの秘密鍵で証明書署名要求に署名する)。

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 10000 -out server.crt

x509v3拡張属性を使う場合は-extensions v3_ext-extfile csr.confを指定する。

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 10000 \
  -extensions v3_ext -extfile csr.conf \
  -out server.crt

証明書の内容を確認する。

openssl x509 -text -noout -in server.crt

(参考)

証明書と秘密鍵をまとめてp12形式で保管する。

openssl pkcs12 -export -inkey someserver.key -in someserver.crt -out someserver.p12

(参考)

秘密鍵にパスフレーズを付与(暗号化)する。

openssl rsa -in someserver.key -aes256 -out someserver-enc.key

パスフレーズを付与するとファイルが以下のようになり暗号化されていることがわかる。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B8B08D49647D820B416C1C6B45607BDC

(以下省略)

参考リンク

61
61
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
61
61