仕事でHTTPサーバを運用するならやっぱり暗号化(SSL化)して運用したいよね、ってことで、ここではApacheをhttpsで運用するための設定、すなわちサーバ証明書を作成して設置する手順を解説します。
mod_sslのインストール
Apache(httpd)をインストールした後で、ApacheのSSLモジュール mod_ssl を以下の通り、インストールしましょう。
# dnf -y install mod_ssl
鍵ペアとサーバ証明書の作成
SSL通信に必要となる鍵ペアとサーバ証明書を作成します。本来なら、信頼できる証明書発行機関(CA)から発行されたサーバ証明書を使用したいところですが、購入すると結構な費用がかかりますので、今回は自分自身で証明書を発行します(いわゆる「なんちゃって証明書」とか「オレオレ証明書」とか言われるやつです)。
秘密鍵の作成
最初に秘密鍵(server.key)を以下の通り作成します。最後に2回、パスワードの入力が求められるので、設定したいパスワードを入力して下さい。
# 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: (もう一度パスワードを設定する)
公開鍵の作成
次に公開鍵(server.csr)を以下の通り作成します。入力事項はそれぞれ自分の情報として下さい。
Common Nameには、httpサーバにアクセスする際のサーバのURLを指定します。この例ではサーバのURLをFQDNでアクセスしたいのでood0.home.local を指定していますが、IPアドレスでアクセスしたいのであればIPアドレスを指定します。尚、ここで指定する文字列(FQDNまたはIPアドレス)は、Apacheの設定ファイル /etc/httpd/conf/httpd.conf のServerName行に定義したものと同じにしておく必要があります。
最後に、秘密鍵を作成したときに設定したパスワードを求められるので入力します。
# openssl req -new -key server.key > 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) [XX]:JP
State or Province Name (full name) []:Chiba
Locality Name (eg, city) [Default City]:Chiba-city
Organization Name (eg, company) [Default Company Ltd]:RunningDog Inc.
Organizational Unit Name (eg, section) []:Development Section
Common Name (eg, your name or your server's hostname) []:ood0.home.local
Email Address []:xxx@xxx.xxxxxxx.jp
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (秘密鍵を作成したときに設定したパスワードを入力する)
An optional company name []:
サーバ証明書(デジタル証明書)の作成
次にサーバ証明書(server.crt)を以下の通り作成します(サーバ証明書はデジタル証明書やSSL証明書と呼ばれることもあります)。ここでも最後に、秘密鍵を作成したときに設定したパスワードを求められるので入力します。
ちなみに、-days に指定する数字はサーバ証明書の有効期間となる日数です。途中で期限切れになるとアクセスエラーとなって困るのでデカい数字を指定しています(笑)。
# openssl x509 -in server.csr -days 365000 -req -signkey server.key > server.crt
Signature ok
subject=C = JP, ST = Chiba, L = Chiba-city, O = RunningDog Inc., OU = Development Section, CN = 192.168.1.204, emailAddress = xxx@xxx.xxxxxxx.jp
Getting Private key
Enter pass phrase for server.key:(秘密鍵を作成したときに設定したパスワードを入力する)
鍵ペアとサーバ証明書の設置
上記で作成した秘密鍵, 公開鍵, サーバ証明書 を /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/privates/
なぜこのディレクトリにしたかというと、/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
Enter TLS private key passphrase for 192.168.1.204:443 (RSA) : (ここで秘密鍵を作成したときに設定したパスワードを入力)
上記の通り、起動時にパスワードの入力が求められるので面倒なんですよね。
パスワードを自動入力する方法もあるみたいなので、興味のある方はインターネットで検索して調べてみて下さい。
httpsでURLにアクセスしてみよう
前述の通り、今回作成したのは「なんちゃって証明書」なので、httpsでアクセスしたときにはブラウザが警告を表示します。以下はchromeの画面です。
![httpsの警告画面](https://runningdog.mond.jp/blog/wp-content/uploads/2024/05/https-1024x669.png)
「詳細設定」をクリックすると、「ood0.home.local にアクセスする (安全ではありません)」というリンクが表示されます。この警告は無視してリンクをクリックすると、ood0.home.local のURLにアクセスすることができます。
![](https://runningdog.mond.jp/blog/wp-content/uploads/2024/05/https1-1024x669.png)
![](http://runningdog.mond.jp/blog/wp-content/uploads/2023/03/uroko-1-150x150.png)
イントラネットでの運用であれば、なんちゃって証明書で十分だと思うよ。。
コメント