はじめに
Web Speech APIを使ったアプリを作成しようとしたところ、セキュリティの関係でHTTPではマイクの許可がされませんでした。そこでHTTPS通信できる環境を構築しようと考えました。
SSL通信を行うためにSSLサーバ証明書を購入する必要がありますが、今回は自己証明書で代用します。
CentOS7.5にApache2.4をインストールするところから始めます。
詰まったこと
先に自分が詰まった部分を記載しておきます。
- ファイアウォールの設定をしていなかったこと
- SElinuxによるエラー
HTTPサーバの構築
まずはHTTPサーバの環境を構築します。
Apache2.4をインストール
yumを使ってインストールします。
CentOS6系は標準ではApache2.2までしかないので注意してください。
/* バージョン確認 */
# yum info httpd
...
バージョン : 2.4.6
...
/* Apache2.4インストール */
# yum -y install httpd
# httpd -version
Server version: Apache/2.4.6 (CentOS)
/* 自動起動設定 */
# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
/* Apache起動 */
# systemctl start httpd.service
ファイアウォールの設定
Apacheを起動したのにサイトが表示されないなと思っていたら、ファイアウォールで使用するポートの許可をしていませんでした。ついでにこの段階で443番ポートへの通信も許可しておきます。
/* firewalldにHTTP(80番ポート)への通信を許可する */
# firewall-cmd --add-service=http --zone=public --permanent
success
# firewall-cmd --reload
success
/* firewalldにHTTPS(443番ポート)への通信を許可する */
# firewall-cmd --add-service=https --zone=public --permanent
success
# firewall-cmd --reload
success
HTTPSサーバの構築
構築手順は以下のQiitaの記事を参考にしています。詳細な内容はこちらを参照ください。
参考:Apache httpdで作るHTTPSサーバ
sslのモジュールをインストール
# yum -y install mod_ssl
秘密鍵を作成
# openssl genrsa > server.key
CSR(証明書署名要求)を作成
CSRは公開鍵の情報と組織の情報を含みます。
# openssl req -new -key server.key > 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) [XX]:JP // 国名
State or Province Name (full name) []: // 都道府県名
Locality Name (eg, city) [Default City]: // 市町村名
Organization Name (eg, company) [Default Company Ltd]: // 空白
Organizational Unit Name (eg, section) []: // 空白
Common Name (eg, your name or your server's hostname) []:XXX.XXX.XXX.XXX // ipアドレス
Email Address []: // 空白
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
サーバ証明書を作成
# openssl x509 -req -signkey server.key < server.csr > server.crt
作成した鍵と証明書を適当な場所に配置
# mkdir /usr/local/ssl
# mkdir /usr/local/ssl/private
# mkdir /usr/local/ssl/cers
# mv server.key /usr/local/ssl/private
# mv server.crt /usr/local/ssl/cers
/* csrファイルの削除 */
# rm server.csr
パーミッションを設定
秘密鍵や証明書は誤って変更しないよう、所有者にのみ読取可能権限を付与します。
他のグループは一切の権限を付与しません。
# chmod 400 /usr/local/ssl/private
# chmod 400 /usr/local/ssl/cers
参考:CSP SSL
ssl.confを修正して鍵と証明書にパスを設定
# vi /etc/httpd/conf.d/ssl.conf
-----
# SSLCertificateFile /etc/pki/tls/certs/localhost.crt // コメントアウト
SSLCertificateFile /usr/local/ssl/cers/server.crt // 追加
# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key // コメントアウト
SSLCertificateKeyFile /usr/local/ssl/private/server.key // 追加
-----
/* Apache再起動 */
# systemctl restart httpd
作業は以上で終了です。
ブラウザにhttps://[IPアドレス]を入力して、アクセスできるか確認してみてください。
アクセスできますが、自己証明書なのでWarningが表示されます。
**これより下は備忘録の為に残しています。
etc/httpd/conf以下に証明書と鍵を配置した場合に起こった事象です。
Apache再起動時にエラーが発生
ssl.confを修正してパスを設定し、Apacheを再起動したところ、以下のエラーが発生しました。
Syntax error on line 101 of /etc/httpd/conf.d/ssl.conf:
SSLCertificateFile: file '/etc/httpd/conf/server.crt' does not exist or is empty
しかしパスは正しく、server.crtの中身も確かに存在します。
原因を調査したところ、SELinuxのアクセス制御機能が原因のようでした。
解決するためには次の方法があります。
- SELinuxの無効化(非推奨)
- 適切なSELinuxのポリシーを設定する
1. SELinux無効化(非推奨)
1つめはセキュリティ上よろしくないので非推奨です。
SELinuxをdisabledにします。
# vi /etc/selinux/config
-----
SELINUX=disabled
-----
/* 再起動 */
# reboot
2. 適切なSELinuxのポリシーを設定する
2つ目は適切なSELinuxのポリシーを設定する方法です。
参考:SELinux を使おう.使ってくれ
/*SELinuxのstatusを確認*/
# getenforce
Enforcing
/* タイプの確認 */
# ls -laZ /etc/httpd/conf
新規作成したディレクトリのタイプがunconfined_u...になっている
/* タイプの修正 */
# restorecon -RF /etc/httpd/conf
/* タイプの確認 */
# ls -laZ /etc/httpd/conf
新規作成したディレクトリのタイプがsystem_u...になっている
/* Apache再起動 */
# systemctl restart httpd
こうすることでエラーが解消され、HTTPSにアクセス可能となりました。