Apacheをhttpsでアクセスするための設定

仕事でHTTPサーバを運用するならやっぱり暗号化(SSL化)して運用したいよね、ってことで、ここではApacheをhttpsで運用するための設定、すなわちサーバ証明書を作成して設置する手順を解説します。
(2025/1/12: 更新しました)

mod_sslのインストール

Apache(httpd)をインストールした後で、ApacheのSSLモジュール mod_ssl を以下の通り、インストールしましょう。

# dnf -y install mod_ssl

サーバ証明書の作成

SSL通信に必要となるサーバ証明書を作成します。本来なら、信頼できる証明書発行機関(CA)から発行されたサーバ証明書を使用したいところですが、購入すると結構な費用がかかりますので、今回は自分自身で証明書を発行します(いわゆる「なんちゃって証明書」とか「オレオレ証明書」とか言われるやつです)。サーバ証明書の作成には3つのステップがあります。

1.秘密鍵の作成

最初に秘密鍵(この例のファイル名は server.key)をopensslコマンドを使って作成します。書式は以下の通りです。

openssl genrsa [オプション] [キーのビット数]

鍵長を2048ビット以上にするのが基本らしい..

キーのビット数を指定しないと1024ビットになるのですが、セキュリティの観点では奨励されておらず、2048または4096を指定するのが良いそうです。以下は2048ビットの長さの秘密鍵を作成する例です。

# openssl genrsa 2048 > server.key

セキュリティをより強固にしたい場合は秘密鍵を暗号化する

秘密鍵が盗まれたときにも悪用されないようにしたい場合は、秘密鍵を暗号化するのが良いでしょう。以下の例では、「-aes128」を指定して、生成した秘密鍵をAES128ビットで暗号化しています。-aes128の他に、-aes192, -aes256 というオプションもあります。

# openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
…………….+++++
…………………………………………………………………………….+++++
e is 65537 (0x010001)
Enter pass phrase:(ここでパスワードを設定する)
Verifying - Enter pass phrase: (もう一度パスワードを設定する)

上記の例のように、2回、パスワードの入力が求められるので、設定したいパスワードを入力して下さい。
ちなみに、このパスワードは秘密鍵を読み出すためのパスワードとなります。この記事を公開したときは、この方法で秘密鍵を作成していましたが、apacheを起動するときに、パスワードの入力が求められます。うーん、これって自動運転には向かないよなあ。。。なので、サーバ自身のセキュリティを強固にして、https用の秘密鍵は暗号化しないほうが現実的だと思います。
(公開当初に、この記事を読んでくださった方々、ごめんなさい..)
なので、シンプルに
openssl genrsa 2048 > server.key
と作成すればOKです。

2. CSRの作成

次にCSRを作成します。CSR(Certificate Signning Request: 証明書署名要求)は、SSL/TLS証明書を発行してもらうために認証局(CA)に送信するリクエストファイルです。CSRには、証明書を発行するドメイン名や組織名などの情報と、公開鍵が含まれています。公開鍵が含まれているので、1.で作成した秘密鍵とペアになるものです。

CSRの作成例を以下に示します。

# openssl req -new -key server.key > server.csr
Enter pass phrase for server.key: ★1
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) [XX]:JP ★2
State or Province Name (full name) []:Chiba ★3
Locality Name (eg, city) [Default City]:Chiba-city ★4
Organization Name (eg, company) [Default Company Ltd]:RunningDog Inc. ★5
Organizational Unit Name (eg, section) []:Development Section ★6
Common Name (eg, your name or your server's hostname) []:ood0.home.local ★7
Email Address []:xxx@xxx.xxxxxxx.jp
★8

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

入力内容説明
★1 pass phrase for server.key秘密鍵をaes128等で暗号化した場合は、最初に秘密鍵を読み出すためのパスワードの入力が求められます。暗号化していない場合は求められません。
★2 Country Name (2 letter code) 国を示す2文字です。日本ならJPです。
★3 State or Province Name (full name)米国なら州名、日本なら都道府県名です。
★4 Locality Name (eg, city)例えば、市名です。
★5 Organization Name (eg, company) 組織名です。会社名や学校名等です。
★6 Organizational Unit Name (eg, section)部門名です。省略してもOKです。
★7 Common Name (eg, your name or your server's hostname)httpsにアクセスするときに指定するFQDNまたはIPアドレスを入力してください。
★8 Email Address管理者のemailアドレスです。省略してもOKです。
★9 A challenge password 入力不要です。かつて証明書の管理や再発行のプロセスで使用していたパスワードで、現在では使われなくなっているとのこと。
★10 An optional company name証明書内に含めることができる追加の組織情報です。省略してもOKです。クライアントが証明書の詳細情報を参照するときに、この情報も表示されるので、同じ組織でも証明書を使い分けるときに入力すると良いでしょう。
3. サーバ証明書(デジタル証明書)の作成

最後にサーバ証明書(server.crt)を以下の通り作成します(サーバ証明書はデジタル証明書やSSL証明書と呼ばれることもあります)。

# openssl x509 -in server.csr -days 3650 -req -signkey server.key > server.crt
Signature ok
subject=C = JP, ST = Chiba, L = Chiba-city, O = RunningDog Inc., OU = Development Section, CN = ood0.home.local
Getting Private key

Enter pass phrase for server.key: (秘密鍵を作成したときにaes128等で暗号化している場合は、設定したパスワードを入力する)

ちなみに、-days に指定する数字はサーバ証明書の有効期間となる日数です。途中で期限切れになるとアクセスエラーとなって困るので、十分にデカい数字を指定して下さい(上記では約10年を指定しています)。

鍵ペアとサーバ証明書の設置

上記で作成した秘密鍵, CSR, サーバ証明書 を /etc/pki/tls/certs/ に格納します。

# cp -p /root/sbin/server.csr /etc/pki/tls/certs/
# cp -p /root/sbin/server.crt /etc/pki/tls/certs/
# cp -p /root/sbin/server.key /etc/pki/tls/private/

なぜこのディレクトリにしたかというと、/etc/httpd/conf.d/ssl.conf を見たときに、証明書を格納するディレクトリが /etc/pki/tls/certs/ だったからです。

上記の通り格納した秘密鍵とサーバ証明書のパスを /etc/httpd/conf.d/ssl.conf の以下の行に定義します。
こちらがサーバ証明書の定義。

SSLCertificateFile /etc/pki/tls/certs/server.crt

こちらは秘密鍵の定義です。

SSLCertificateKeyFile /etc/pki/tls/private/server.key

Apacheを再起動する

上記の作業が完了したら、以下の通りApacheを再起動して下さい。

# systemctl restart httpd

秘密鍵を作成したときにaes128等で暗号化した場合は、以下のようにApache再起動時に設定したパスワードの入力が求められます。起動時にパスワードの入力が求められるので面倒なんですよね。

# systemctl restart httpd
Enter TLS private key passphrase for ood0.home.local:443 (RSA) : (秘密鍵を作成したときにaes128等で暗号化している場合は、設定したパスワードを入力する)

httpsでURLにアクセスしてみよう

前述の通り、今回作成したのは「なんちゃって証明書」なので、httpsでアクセスしたときにはブラウザが警告を表示します。以下はchromeの画面です。

httpsの警告画面

「詳細設定」をクリックすると、「ood0.home.local にアクセスする (安全ではありません)」というリンクが表示されます。この警告は無視してリンクをクリックすると、ood0.home.local のURLにアクセスすることができます。

イントラネットでの運用であれば、なんちゃって証明書で十分だと思うよ。。

広告主へのリンク

ミニPCのお勧め

おウチでLinuxを勉強するのに、ミニPCはどうですか。
仮想環境(KVM)使えば、仮想マシンを複数起動できますし、とても安価にシステム構築の練習ができます。ミニPCはとっても静かで消費電力も小さいので部屋で常時起動させています。

コメント

タイトルとURLをコピーしました