Apacheでオレオレ証明書を発行して自分を証明したい

けんたろー

2023.03.24

195

こんにちは。けんたろーです。

今日は、ターミナルなどなにも触ったことのない未経験者がDockerやらubuntuやらApacheやらと初めて耳にする単語に苦戦しながら、コンテナ内でApacheへの接続確認作業をやった時の記録を残したいと思います。

今回はオレオレ証明書を使用し、SSL接続確認は、web ブラウザではなく、curlコマンドで確認する。

この記事は、これから未経験でエンジニア業界に入ってみたいなって考えている方に初手はこういうことするのかと(1つの例に過ぎないですが)感じてもらえればと思います。

Docker image,container作成

Dockerfileを基にDocker imageを作成していきます。

今回は簡単に以下のような形でDockerfileを作成しました。

#ベースになるコンテナ
FROM ubuntu:16.04

#システムのパッケージをアップグレード、apache2、nginxパッケージをインストール
RUN apt-get update && apt-get upgrade -y && \
apt-get install apache2 -y
RUN apt-get update && apt-get install -y -q nginx

#コマンドの指定
CMD ["/usr/sbin/apachectl","-DFOREGROUND"]


それでは、作成したDockerfileを使ってDockerイメージを作成します。

Dockerfileのあるディレクトリに移動して、Dockerビルド(Dockerイメージを作成するコマンド)を実行します。

$ docker build -t <Dockerイメージ名> <Dockerfileが存在するディレクトリ>)

これでDockerイメージが作成できました。

このDockerイメージを使用して、コンテナを起動します。

#今回は443番ポートでポートマッピングする必要があったので443番ポートにしてます。
$ docker run -it --name <Dockerイメージ名> -p 443:443


以上でDocker image,container作成完了。

Apacheでオレオレ証明書を発行

秘密鍵の作成

セクション1で作ったコンテナの中に入りApacheでオレオレ証明書を発行したいと思います。

まず、秘密鍵の作成。

# cd /etc/ssl/private
openssl genrsa -aes256 -out server.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...................................................++++
....++++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

CSRの作成

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
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) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

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

証明書の作成

今回は10年持つ証明書

# openssl x509 -in server.csr -out ../certs/server.crt -req -signkey server.key -days 3650
Signature ok
subject=C = JP, ST = Tokyo, L = AdachiKu, O = Internet Widgits Pty Ltd, CN = localhost
Getting Private key
Enter pass phrase for server.key:

Apacheの設定

# vim /etc/apache2/sites-available/default-ssl.conf 

#32, 33行目
SSLCertificateFile      /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key

SSL設定

# a2ensite default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2

# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2

FQDN を指定

このままcurlコマンド実行すると、ServerName を指定しろとエラーが出ちゃいます。

なので、/etc/hosts/etc/apache2/apache2.confに指定していきます。

# vi /etc/hosts
127.0.0.1	localhost

::1	localhost ip6-localhost ip6-loopback

fe00::0	ip6-localnet

ff00::0	ip6-mcastprefix

ff02::1	ip6-allnodes

ff02::2	ip6-allrouters

172.17.0.2	www.myserver.hoge


# vi /etc/apache2/apache2.conf

# 一番最後に
ServerName      www.myserver.hoge

ServerNameを指定してあげることで、正確な通信経路を確立することができます。


curlコマンド確認

以上を設定することで、

$ curl https://www.myserver.hoge


確認完了です。

最後に

自分はエンジニアになって3ヶ月ほどの新米です。

まだ、なにをするにも未熟で足りない部分が多くしんどくなることもありますが、挑戦したことに間違いはなかったと思っています。

早く一人前になれるように、もっと質の高いブログかけるように日々精進します。

ありがとうございました!

この記事をシェアする