オレオレ証明書構築ハンズオン


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

「オレオレ証明書つくりたいんだよね」とChatGPT先生に尋ねたら、「怪しいことを言い出したぞコイツ」と思われて精一杯の言葉を尽くして止められました。こちらも言葉を尽くして説明したら、勘違いしていたことを認めて優しく教えていただきました。
自分の非を認めて、優しく説明してくれるだなんて神かよお前さん。

ということでオレオレ証明書を導入するたびに先人のブログを検索する作業もそろそろ解放されたいという意を込めて、ブログにして手順をまとめる。

構成

構成図

※図のオレンジ枠部分はテスト用の構築部分である。

生成ファイル一覧

4.certificate.crt(サーバ証明書)については、認証局で生成後 Web サーバに渡されるものだが、今回のオレオレ認証では同じサーバを利用しているため実際の受け渡しは生じない。

図の番号 ファイル名 ファイル内容
1 private.key (Webサーバ)秘密鍵
2 request.csr (Webサーバ)CSRファイル
3.1 ca_private.key (オレオレ認証局)秘密鍵
3.2 ca_certificate.crt (オレオレ認証局)自己署名証明書
4 certificate.crt (オレオレ認証局 → Webサーバ)サーバ証明書

構築順序

①秘密鍵の生成
②CSR (Certificate Signing Request) の生成
③自己署名による証明書(自己署名証明書)の生成
④サーバ証明書の作成

テスト(図のオレンジ枠部分)

①(Webサーバ・オレオレ認証局サーバ)で、簡易的なWebサーバ設定
②クライアントサーバからアクセス

構築

1.秘密鍵の生成(Webサーバ)

private.keyという秘密鍵を生成する

$ sudo openssl genpkey -algorithm RSA -out private.key
.....................++++++
....++++++

現在のファイル作成状態

private.keyが新規で作成されている

$ ll
-rw-r--r-- 1 root root 916  9月 15 22:02 private.key

2.CSR (Certificate Signing Request) の生成(Webサーバ)

opensslを利用してCSRを生成する

コマンドオプション
オプション 内容
req 証明書署名要求(CSR)や自己署名証明書の生成を行うためのサブコマンド
-new 新しいCSRを生成
-key private.key SRの生成時に使用する秘密鍵の指定
-out request.csr 生成されるCSRの出力先ファイル名を指定

※テスト用のためCSR作成時に聞かれる情報については全て何も記載をしないで作成

$ sudo openssl req -new -key private.key -out request.csr
~~~~~~~~~~~~
省略
~~~~~~~~~~~~
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

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

現在のファイル作成状態

request.csrが新規で作成されている

$ ll
-rw-r--r-- 1 root root 916  9月 15 22:02 private.key
-rw-r--r-- 1 root root 599  9月 15 22:10 request.csr

3.自己署名による証明書(自己署名証明書)の生成(オレオレ認証局)

3.1.認証局(今回の構築では同じサーバ内にある)用の秘密鍵を生成

$ sudo openssl genpkey -algorithm RSA -out ca_private.key
..................................++++++
..................++++++

現在のファイル作成状態

ca_private.keyが新規で作成されている

$ ll
-rw-r--r-- 1 root root 916  9月 15 22:20 ca_private.key
-rw-r--r-- 1 root root 916  9月 15 22:02 private.key
-rw-r--r-- 1 root root 599  9月 15 22:10 request.csr

3.2.認証局(今回の構築では同じサーバ内にある)用の自己署名証明書を作成

opensslを利用してCSRを生成する

コマンドオプション
オプション 内容
req 証明書署名要求(CSR)や自己署名証明書の生成を行うためのサブコマンド
-new -x509 新しい自己署名証明書を生成
-days 3650 自己署名証明書の有効期限。仮に10年(3650日)と設定
-key ca_private.key 署名に使用する秘密鍵
-out ca_certificate.crt 生成された自己署名証明書の出力名

※テスト用のため自己署名証明書の作成時に聞かれる情報については全て何も記載をしないで作成

$ sudo openssl req -new -x509 -days 3650 -key ca_private.key -out ca_certificate.crt
~~~~~~~~~~~~
省略
~~~~~~~~~~~~
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

現在のファイル作成状態

ca_certificate.crtが新規で作成されている

[ec2-user@ip-192-168-10-107 ~]$ ll
-rw-r--r-- 1 root root 867  9月 16 11:03 ca_certificate.crt
-rw-r--r-- 1 root root 916  9月 15 22:20 ca_private.key
-rw-r--r-- 1 root root 916  9月 15 22:02 private.key
-rw-r--r-- 1 root root 599  9月 15 22:10 request.csr

4.サーバ証明書の作成(オレオレ認証局)

opensslを利用してCSRを生成する

コマンドオプション
オプション 内容
-req 入力ファイルがCSRであることを表示
-days 365 証明書の有効期間を365日に設定
-in request.csr 使用するCSRの名前を指定
-CA ca_certificate.crt どの CA 証明書を使用して CSR を署名するかを指定
-CAkey ca_private.key CA 証明書に関連付けられた秘密鍵を指定
-set_serial 01 新しい証明書のシリアル番号を設定
-out certificate.crt 出力される証明書の名前

$sudo openssl x509 -req -days 365 -in request.csr -CA ca_certificate.crt -CAkey ca_private.key -set_serial 01 -out certificate.crt
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting CA Private Key

現在のファイル作成状態

certificate.crtが新規で作成されている

[ec2-user@ip-192-168-10-107 ~]$ ll
-rw-r--r-- 1 root root 867  9月 16 11:03 ca_certificate.crt
-rw-r--r-- 1 root root 916  9月 15 22:20 ca_private.key
-rw-r--r-- 1 root root 749  9月 16 11:27 certificate.crt
-rw-r--r-- 1 root root 916  9月 15 22:02 private.key
-rw-r--r-- 1 root root 599  9月 15 22:10 request.csr

挙動の確認(図のオレンジ枠部分)

※再掲

構成図

生成ファイル一覧

図の番号 ファイル名 ファイル内容
1 private.key (Webサーバ)秘密鍵
2 request.csr (Webサーバ)CSRファイル
3.1 ca_private.key (オレオレ認証局)秘密鍵
3.2 ca_certificate.crt (オレオレ認証局)自己署名証明書
4 certificate.crt (オレオレ認証局 → Webサーバ)サーバ証明書

1.(Webサーバ・オレオレ認証局)簡易的なWebサーバ設定

Pythonのhttp.serverを使用してHTTPSサーバを起動
以下、参考として利用した、シェルスクリプトを記載

$ cat https_server.py 
import http.server
import ssl

server_address = ('', 4443)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               certfile='certificate.crt',
                               keyfile='private.key',
                               server_side=True)

print("Serving HTTPS on port 4443...")
httpd.serve_forever()

上記シェルスクリプトを実行してHTTPSサーバを起動する

sudo python3  https_server.py

2.クライアントサーバからアクセス

2.1.オレオレ認証局)自己署名証明書を配置

ca_certificate.crtをクライアントサーバに配置

2.2.curlコマンドによる確認

curl -k https://192.168.10.107:4443コマンドを実行
証明書の検証をスキップするため -k オプションを利用する。

2.3.下記レスポンスで成功

※Webサーバ・オレオレ認証局側のSGで4443ポートを許可する必要あり

$ curl -k https://192.168.10.107:4443
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href=".bash_history">.bash_history</a></li>
<li><a href=".bash_logout">.bash_logout</a></li>
<li><a href=".bash_profile">.bash_profile</a></li>
<li><a href=".bashrc">.bashrc</a></li>
<li><a href=".python_history">.python_history</a></li>
<li><a href=".rnd">.rnd</a></li>
<li><a href=".ssh/">.ssh/</a></li>
<li><a href=".viminfo">.viminfo</a></li>
<li><a href="ca_certificate.crt">ca_certificate.crt</a></li>
<li><a href="ca_private.key">ca_private.key</a></li>
<li><a href="certificate.crt">certificate.crt</a></li>
<li><a href="https_server.py">https_server.py</a></li>
<li><a href="private.key">private.key</a></li>
<li><a href="request.csr">request.csr</a></li>
</ul>
<hr>
</body>
</html>

さいごに

生成するファイルが多く、何が何のために利用するのかが分かりずらいですが、ある程度は整理することができました。
これを見ながら、将来の自分がオレオレ証明書を作るかと思うと時間の節約にも一役買えたのではないかと思います。

そして最後に「オレオレ」詐欺はダメ絶対 !

Last modified: 2023-09-16

Author