【Apache】オレオレ証明書を鍵から作ってくよ!

Linux
この記事は約6分で読めます。

環境

  • OS
cat /etc/os-release | grep -i pretty
> PRETTY_NAME="Ubuntu 20.04.6 LTS"

※特別な記述がない限り、基本的にスーパーユーザー権限(root)での説明となります。

はじめに

以前は ubuntu20.04 に apache をインストールしたときに、同時にインストールされる snakeoil証明書 を使って https通信を実現したが、その snakeoil証明書 を自前で作ってみようという話です!

手順

  • openssl パッケージをインストール
apt install -y openssl
ケン
ケン

公開鍵・秘密鍵といったキーペアを生成するのに使うよ!

  • ディレクトリ移動
cd /etc/ssl/pricate
  • まず最初に秘密鍵を作っていく!
openssl genrsa -aes128 -out server.key 2048
> パスワードを作ってねと言われるので、任意のものを2回入力
  • 存在確認
ls -la | grep server.key | wc -l
> 1
  • ↑で生成した秘密鍵をパスワードなしで使えるように以下を実行
openssl rsa -in server.key -out server.key
> ↑で設定したパスワードを入力
ケン
ケン

これを実行することによって、apache の再起動とかでいちいちパスワードを聞かれることがなくなるので楽になるだけ。なので、やらなくてもぶっちゃけいいです!

  • 認証局(オレオレなので自サーバー)に対する証明書発行要求書を作成
openssl req -new -key server.key -out server.csr -subj "/C=JP/ST=Minatoku/L=Tokyo/O=hoge.inc/CN=local.oreore.com"

server.key(秘密鍵) を用いて、server.csr(証明書発行要求書) を発行するというコマンド。
-subj 以降は対話形式で聞かれるのでそこで回答してもいいですが、ここではワンライナーで一括で設定しています。ちなみに分解すると以下のようになります。

C=JP                ← Country Nameなので、JPと入力
ST=Minatoku        ← State or Province Nameなので、港区と入力(なんでもいい)
L=Tokyo             ← Locality Name (eg, city)なので、Tokyoと入力(なんでもいい)
O=hoge.inc          ← Organization Nameなので、hoge.incと入力(なんでもいい)
CN=local.oreore.com ← httpsアクセスするドメイン名(後述のvirtualhostで設定するドメインを指定)
  • 存在確認
ls -la | grep server.csr | wc -l
> 1
  • 秘密鍵と証明書発行要求書の二つを使って、サーバー証明書を発行する
openssl x509 -in server.csr -out server.crt -req -signkey server.key
  • 存在確認
ls -la | grep server.crt | wc -l
> 1
  • SSLを実現するにあたってすべてのファイルがそろった。
ls -la /etc/ssl/private
-rw-r--r-- 1 root root     1192 Aug 23 22:57 server.crt ← ★サーバー証明書
-rw-r--r-- 1 root root      993 Aug 23 22:56 server.csr ←   証明書発行要求書
-rw------- 1 root root     1679 Aug 23 22:53 server.key ← ★サーバー秘密鍵
ケン
ケン

これらを使って virtulahost の設定をしていくよ!

3つのファイルがあるけど使うものには★を付けています

Virtualhostの設定

  • 設定ファイルを開く
vi /etc/apache2/sites-available/oreore.conf
  • 以下を記述
<IfModule mod_ssl.c> ← apacheモジュールであるsslが有効になっていたらという条件分岐
    <VirtualHost *:443> ← portは443
        ServerName local.oreore.com # ← ドメイン名を指定
        DocumentRoot /home/hogehoge/oreore # ← ドキュメントルートを指定

        SSLEngine on # ← SSLを使いますよ、という指定
        SSLCertificateFile /etc/ssl/private/server.crt # ← サーバー証明書
        SSLCertificateKeyFile /etc/ssl/private/server.key # ← サーバー秘密鍵

        DirectoryIndex index.html # ← URLでファイル名まで指定されなかったときにデフォルトで見に行くファイル
        <Directory /home/hogehoge/oreore>
            Options -Indexes FollowSymLinks
            AllowOverride None
            Require all granted # ← ここ重要!
        </Directory>

    </VirtualHost>
</IfModule>
  • 設定ファイルチェック
apachectl configtest
> Syntax OK
  • ドキュメントルートとファイル作成
mkdir -p /home/hogehoge/oreore && echo 'oreore' > /home/hogehoge/index.html
  • SSL モジュールを有効化
a2enmod ssl
  • さっきの virtualhostファイルを有効化
a2ensite oreore
  • apache 再起動
systemctl restart apache2
  • ホストOSの hostsファイル に追記
IPアドレス local.oreore.com
例えば、
192.168.4.2 local.oreore.com
↑といった感じ
  • ポートスキャンで443ポートが開いているか確認する
nc -vz 192.168.4.3 443
> Connection to 192.168.4.3 443 port [tcp/https] succeeded!
  • ブラウザでアクセスする
https://local.oreore.com

おわりに

無事ブラウザで oreore というテキストが表示されましたか?
openssl を使って自己署名証明書を作ってSSL通信までを実現しました!

ubuntu20.04 で apache をインストールしたら同時にインストールされる snakeoil証明書 を使っても簡単に同じことができます。↓記事参照

本番環境での certbot の記事も書いているのでぜひ!

コメント