山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

テスト用 サーバ証明書(SSL証明書)の作成(完全版)

f:id:yyama1556:20190427175132j:plain

テスト用サーバ証明書(SSL証明書)の期限が切れてしまい、作り直す場面が忘れた頃にやってくるので複数のサイトを見なくても作れるようここにメモしておきたいと思います。

せっかくなので firefox でも警告がでないようにオレオレ証明書ではなく、ちゃんと(ちゃんとしてない!)認証局も作ってその認証局が署名した証明書を作ります。

参考:
なぜFirefoxは自己署名証明書をブロックするのか - Mozilla Flux

もちろんここで作る認証局の証明書自体はオレオレ証明書なので PC へのインストールは細心の注意を払って自己責任で行ってください。

(オレオレ証明書作る方法をブログで公開しても不正指令なんちゃら罪で逮捕されないよね?「技術者を萎縮させる」という意味を痛感している。ビビリw)

理屈はいいからやり方教えろ!という人は、能書き不要!の人向けを見てください。

環境

  • Windows7
  • OpenSSL 1.0.2r ※Apache HTTP Server2.4 に付いてきたやつを使いました。

openssl.exe が置かれているフォルダにどこからでもアクセスできるようにパスを通しておいてください。

大まかな作成手順

ここでは「hogefuga.co.jp」というサーバ用の証明書を発行する手順を紹介します。
次のような手順で証明書を発行します。

  1. 認証局用のフォルダ、ファイル準備
  2. 秘密鍵の作成。この秘密鍵は認証局と「hogefuga.co.jp」サーバの2つで利用します。(通常、認証局とサーバ保有者の組織は別々なのでもちろん別の鍵になります。)
  3. 認証局の署名リクエスト(CSR。Certificate Signing Request。)作成
  4. 認証局が署名リクエストに自分で署名(自己署名のためここで作られた証明書はオレオレ証明書と呼ばれる。)
  5. 「hogefuga.co.jp」用の署名リクエスト作成
  6. 認証局が「hogefuga.co.jp」用の署名リクエストに署名

認証局用のフォルダ、ファイル準備

認証局用のフォルダ作成

openssl の設定ファイル、openssl.conf に 認証局用のデフォルト設定が記載されています。

(私のように apache に付いてきた openssl を使うのであれば apache の conf フォルダに置いてあるはずです。)

今回は設定ファイルを変更したくないのでデフォルト設定に従ったフォルダ、ファイルを作ります。デフォルト設定は相対パスで記載されているので、起点となるディレクトリは自由に決められます。

私は C:\yyama\ca というフォルダを認証局用の起点フォルダとしました。その下に demoCA というフォルダも作ります。

署名に必要なファイルの作成

3ファイルほど作成します。

参考:
CA 構築のための OpenSSL の設定
NET::ERR_CERT_COMMON_NAME_INVALID なんだこれ? – Life is Real.
Chrome58で、HTTPSの自己証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる場合の対応

san 指定用ファイル

参考 URL に書かれているとおり、chrome では、証明書の CN (コモンネーム)ではなく SAN(Subject Alternative Name)でドメインが正当なものであることを判定するようです。

ファイル名はお好みで作ってください。私の場合、ファイル名とファイルの中身を以下のように作成し、 C:\yyama\ca 直下に格納しました。

hogefuga.san

subjectAltName=DNS:hogefuga.co.jp

DNS: より右側をドメイン名に合わせて変えてください。複数ある場合はカンマ区切りだそうです。

index.txt

署名の履歴などを保持するファイルです。openssl が勝手に追記していきます。空のファイルで demoCA 配下に作成しておきます。

このファイルに記載されている履歴と矛盾するような openssl コマンドを叩くとエラーになる場合があります。その場合、テスト環境であれば空ファイルに戻してしまうことで解消できたりします。

「矛盾するような openssl コマンド」とは、例えば「まだ有効期間中なのに証明書を再発行しようとした」など。
この場合は「ERROR:There is already a certificate /C=JP/ST=XXX/O=XXX/OU=XXX/CN=hogefuga.co.jp」のようなエラーがでます。

serial ファイル

シリアルナンバーを記録するためのファイルです。openssl が勝手に変更していきます。拡張子はありません。中身を「01」としdemoCA 配下に作成します。

秘密鍵の作成

コマンドプロンプトを起動し「C:\yyama\ca」など認証局用のフォルダに移動します。

次のコマンドで秘密鍵を作成します。パスフレーズを聞かれますので適当に打ちます。

openssl genrsa -aes128 2048 > server.key

テスト用だし、パスフレーズは邪魔にもなるので除去します。

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

これで秘密鍵の完成です。

認証局の署名リクエスト作成

続いて認証局の証明書を作成するにあたり、まず署名リクエスト(CSR)を作成します。

openssl req -new -key server.key > ca.csr

いろいろ聞かれるので適当に答えましょう。ただし Common Name は証明書を作成したいサーバと異なる名前にします。ここでは「hogefuga.co.jp」とは異なる「yyamaca.co.jp」としました。

入力例です。

C:\yyama\ca>openssl req -new -key server.key > ca.csr
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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Edogawaku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:yyama
Organizational Unit Name (eg, section) []:system
Common Name (e.g. server FQDN or YOUR name) []:yyamaca.co.jp
Email Address []:

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

認証局が署名リクエストに自分で署名

オレオレ署名を行います。

openssl x509 -in ca.csr -days 3650 -req -signkey server.key > ca.crt

作られた ca.crt が認証局の証明書です。

「hogefuga.co.jp」用の署名リクエスト作成

認証局用の署名リクエスト作成とほぼ同じです。出力するファイル名だけと異なります。

Common Name は証明書を作成したいサーバのドメインを入力してください。(私は例として「hogefuga.co.jp」としました。)

openssl req -new -key server.key > server.csr

認証局が「hogefuga.co.jp」用の署名リクエストに署名

自己署名とは異なるやり方になります。

openssl ca -in server.csr -keyfile server.key -cert ca.crt -outdir . -out server.crt -days 3650 -extfile hogefuga.san  -policy policy_anything

本当に作っていいか聞いてくるので2回ほど y と打ちます。

server.crt が作成された「hogefuga.co.jp」の証明書です。

これで証明書が完成しました。お疲れ様でした。

能書き不要!の人向け!

上級者向け。以下のコマンドやコメント中の指示に従えば1分で作れますw。フォルダ名やファイル名は適宜変えてください。

REM CA 用フォルダ作成
mkdir C:\yyama\ca

REM フォルダ移動
cd C:\yyama\ca

REM demoCAフォルダ作成
mkdir demoCA

REM san ファイル作成
echo subjectAltName=DNS:hogefuga.co.jp> hogefuga.san

REM 【手作業】C:\yyama\ca\demoCA\index.txt という空のファイル作れ。Windowsで空ファイルをコマンドで作るのメンドイ。

REM serial ファイル作成
echo 01> demoCA\serial

REM 秘密鍵作成
openssl genrsa -aes128 2048 > server.key

REM 秘密鍵のパスフレーズ除去
openssl rsa -in server.key -out server.key

REM CA用CSR作成
openssl req -new -key server.key > ca.csr

REM CA用CSRに自己署名
openssl x509 -in ca.csr -days 3650 -req -signkey server.key > ca.crt

REM サーバ用CSR作成
openssl req -new -key server.key > server.csr

REM CAによる署名
openssl ca -in server.csr -keyfile server.key -cert ca.crt -outdir . -out server.crt -days 3650 -extfile hogefuga.san -policy policy_anything

参考ににしたサイト。

秘密鍵からパスフレーズを取り除く - Qiita
オレだよオレオレ認証局で証明書つくる - Qiita
SSLを利用するための自己証明書(オレオレ証明書)の設定メモ - Qiita

暗号技術入門 第3版

暗号技術入門 第3版

食べる!SSL! ―HTTPS環境構築から始めるSSL入門

食べる!SSL! ―HTTPS環境構築から始めるSSL入門

Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで

Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで