自己署名証明書(別名はオレオレ証明書)を作成してみた。

HTTPS通信の際に使用するサーバー証明書は認証局の署名が必要です。自身で署名したものを自己署名証明書と言います。自分で認証するのでオレオレ証明書とも呼ばれています。自己署名証明書を作ってみたので、そのやり方を書いておきます。

実施した環境はCentOS7でOpenSSLがインストール済みです。

まずは、秘密鍵を作成します。

$ openssl genrsa -out server.key

opensslコマンドのオプションの意味です。

  • genrsa・・・ RSA秘密鍵を作成します。
  • -out・・・出力ファイルの指定をします。

鍵長はデフォルトでは2048bitです。ローカルディレクトリに server.key という名前の秘密鍵が作成されます。

次に、証明書署名要求(Certificate Signing Request)の作成を行います。証明書署名要求はCSRとも呼ばれます。

$ openssl req -new -key server.key -out server.csr

  • req・・・ 証明書署名要求の処理を行います。
  • -new・・・ 新しい証明書要求を生成します。
  • -key・・・ 秘密鍵を指定します。
  • -out・・・出力ファイルの指定をします。

CSRは認証局の署名のない状態のサーバー証明書です。秘密鍵から公開鍵の生成は可能でCSRには公開鍵が含まれます。通常のサーバー証明書はこのCSRを認証局に提出して、公開鍵が正当なものであるという署名をしてもらいます。

なお、CSRの作成時は対話形式となり入力が必要になります。自己署名証明書であれば入力が必要なものは Common Name のところで他のものは未入力(リターンキーの押下)で構いません。Common Name には www.dummy.com と入力しています。以下は実行時のものです。


$ openssl req -new -key server.key -out server.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]:
State or Province Name (full name) [Some-State]:
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) []:www.dummy.com
Email Address []:

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

ローカルディレクトリに server.csr という名前の証明書署名要求が作成されます。

最後に、証明書署名要求に署名をします。自分の秘密鍵を使って署名する(自分で認証していると言い張る)のでオレオレ証明書とも呼ばれるのだと思います。

$ openssl x509 -req -days 3650 -signkey server.key -in server.csr -out server.crt

  • x509・・・ X.509のフォーマットでサーバー証明書を作成します。
  • -req・・・ 証明書署名要求の読み取りをします。
  • -days・・・ 証明書の有効期限の日数を指定します。
  • -signkey・・・証明書に署名する秘密鍵を指定します。
  • -in・・・ 読み取る証明書署名要求を指定します。
  • -out・・・出力ファイルの指定をします。

-signkey オプションで指定する秘密鍵は通常は認証局の秘密鍵ですが、自己署名証明書の場合は自分の秘密鍵です。ローカルディレクトリに server.crt という名前のサーバー証明書が作成されます。

このサーバー証明書と秘密鍵をウェブサーバーに設定するとHTTPS通信が可能になります。Nginxの場合は ssl_certificate ディレクィブと ssl_certificate_key ディレクィブになります。

CentOS7にNginxをソースコードからインストールしてみた。

CentOS7のNginxのバージョンが古いためアンインストールしてから新しいバージョンをソースコードからインストールしてみました。新しいバージョンは 1.27.2 になります。作業はrootユーザーで行います。

まずは古いNginxをアンインストールします。

# yum remove nginx

アンインストールができたらソースファイルを格納するディレクトリに移動します。

# cd /usr/local/src

ソースファイルをダウンロードします。今回は 1.27.2 ですが、バージョンは必要に応じて書き換えてください。

# wget https://nginx.org/download/nginx-1.27.2.tar.gz

ダウンロードしたソースファイルを展開します。

# tar zxvf nginx-1.27.2.tar.gz

展開したら解凍したディレクトリに移動します。

# cd nginx-1.27.2

ここで ./configure を実行するのですがパラメーターの指定があります。もともと古いNginxがパッケージインストールされていたのですが、同じところにインストールされるようパラメーターを指定します。具体的には以下で実施しました。改行をして見やすくしていますが実際は1行です。


# ./configure
 --prefix=/etc/nginx
 --sbin-path=/usr/sbin/nginx
 --modules-path=/usr/lib64/nginx/modules
 --conf-path=/etc/nginx/nginx.conf
 --error-log-path=/var/log/nginx/error.log
 --http-log-path=/var/log/nginx/access.log
 --pid-path=/var/run/nginx.pid
 --lock-path=/var/run/nginx.lock
 --http-client-body-temp-path=/var/cache/nginx/client_temp
 --http-proxy-temp-path=/var/cache/nginx/proxy_temp
 --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
 --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
 --http-scgi-temp-path=/var/cache/nginx/scgi_temp
 --user=nginx --group=nginx --with-compat
 --with-file-aio
 --with-threads
 --with-http_addition_module
 --with-http_auth_request_module
 --with-http_dav_module
 --with-http_flv_module
 --with-http_gunzip_module
 --with-http_gzip_static_module
 --with-http_mp4_module
 --with-http_random_index_module
 --with-http_realip_module
 --with-http_secure_link_module
 --with-http_slice_module
 --with-http_ssl_module
 --with-http_stub_status_module
 --with-http_sub_module
 --with-http_v2_module
 --with-mail
 --with-mail_ssl_module
 --with-stream
 --with-stream_realip_module
 --with-stream_ssl_module
 --with-stream_ssl_preread_module
 --with-http_v3_module
 --with-openssl=/usr/local/src/openssl-3.0.15

若干独自の追加があるので補足をしておきます。

NginxがHTTP/3に対応するように --with-http_v3_module を指定しています。ただし ngx_http_v3_module は現時点では実験的なものらしく自己責任です。また OpenSSLに静的リンクさせるため --with-openssl=/usr/local/src/openssl-3.0.15 も指定しています。--with-openssl を使用する場合はOpenSSLのソースファイルのダウンロード、および --with-http_ssl_module の指定もあわせて必要です。

そのほかは一般的なパラメータ指定です。

./configure が終わったらmakeを実行します。

# make

makeは少し時間がかかります。コンソール画面にもログがかなり出ます。終わるのを待ちます。makeが終わってからインストールを行います。

# make install

インストールが終わったらNginxのバージョンを確認してみます。

# nginx -V

結果はこんな感じです。


# nginx -V
nginx version: nginx/1.27.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 3.0.15 3 Sep 2024
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx ・・(省略)・・ --with-openssl=/usr/local/src/openssl-3.0.15

Nginxの制御をするためにユニット定義ファイルを作成します。作成する場所は /etc/systemd/system 配下です。

# cd /etc/systemd/system

パッケージインストールした場合のユニット定義ファイルは /usr/lib/systemd/system 配下となるのですが、今回は独自にユニット定義ファイルを用意するので /etc 配下の方にしました。

ユニット定義ファイルの名前は nginx.service として以下の内容を書き込みます。

# vi nginx.service


[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

ユニット定義ファイルが作成できたらsystemdに読み込ませます。

# systemctl daemon-reload

ちなみに今回はわけあってNginxのポートを80から2000に変更しています。ですので以下の作業を追加しています。ポートの変更がない方はここの部分は読み飛ばしてください。

/etc/nginx/nginx.conf の修正
serverディレクティブの listen を2000に修正。

firewalldの穴あけ(ポート2000を通すようにする)。
# firewall-cmd --add-port=2000/tcp

なおfirewalldの設定を戻す(ポート2000を通さないようにする)は以下です。
# firewall-cmd --remove-port=2000/tcp

準備が出来たらNginxを起動させます。

# systemctl start nginx

ブラウザから「http://xxx.xxx.xxx.xxx:2000/」(xxxはIPアドレス)を指定して Welcome to nginx! が表示されれば成功です。

追記
古いNginxをアンインストールすると /etc/logrotate.d 配下のlogrotateのコンフィグファイルが nginx.rpmsave にリネームされます。logrotateは拡張子が .rpmsave のものを除外するのでlogrotateの対象にするには .rpmsave を取り除くと対象になります。