それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

Apache 2.4 + mod_ssl のソースからのインストールとオレオレ証明書

正直もうYUM(RPM)で導入すればええやん・・・と思いつつ確認だけした。

参考URL

環境

  • Amazon EC2
  • Red Hat Enterprise Linux Server release 7.2 (2016/03/03時点)
  • SELinuxはPermissiveにしといた

Apache 2.4 のインストール

事前準備

openssl-devel と、Development Tools (development) をインストールする。

# LANG=C yum grouplist hidden ids...Development Tools (development)  ...# yum install openssl-devel @development

ソースダウンロード

当然のごとく公式からダウンロードして展開する。Apache、APR,APR Util の3つ。

# mkdir -p /usr/local/src/apache ; cd $_# curl -L -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/httpd-2.4.18.tar.gz# tar zxvf httpd-2.4.18.tar.gz# cd httpd-2.4.18/srclib# curl -L -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-1.5.2.tar.gz# curl -L -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-util-1.5.4.tar.gz# tar zxvf apr-1.5.2.tar.gz# tar zxvf apr-util-1.5.4.tar.gz# ln -s apr-1.5.2 apr# ln -s apr-util-1.5.4 apr-util

configure の実行

お好みで configure オプションを付けて実行

# cd /usr/local/src/apache/httpd-2.4.18# ./configure \--prefix=/usr/local/apache2.4.18 \--enable-ssl ; echo $?

コンパイルとインストール

# make && make install ; echo $?

Apache 2.4 の初期設定

環境設定と起動スクリプトの準備

シンボリックリンクの作成

# cd /usr/local/# ln -s apache2.4.18 apache

systemdの設定ファイル作成と起動確認

# vi /etc/systemd/system/apache.service
[Unit]Description=The Apache HTTP Server[Service]Type=forking  EnvironmentFile=/usr/local/apache/bin/envvars  PIDFile=/usr/local/apache/logs/httpd.pid  ExecStart=/usr/local/apache/bin/apachectl start  ExecReload=/usr/local/apache/bin/apachectl graceful  ExecStop=/usr/local/apache/bin/apachectl stop  KillSignal=SIGCONT  PrivateTmp=true[Install]WantedBy=multi-user.target  

systemdのリロード

# systemctl daemon-reload

Apacheの起動と動作確認

# systemctl start httpd# curl localhost  =>It works!を確認

環境変数の設定と読み込み

めんどうなのでパスを通しとく

# echo "export PATH=${PATH}:/usr/local/apache/bin" >> ~/.bashrc# source ~/.bashrc

SSL証明書(オレオレ証明書)の作成

秘密鍵/公開鍵/サーバ証明書を作成・設置する。

秘密鍵の作成

# cd ~# mkdir sslkey# openssl genrsa -aes128 2048 > sslkey/server.key  =>パスフレーズは適当に入れて覚えとく

公開鍵(CSR)の作成

# openssl req -new -key sslkey/server.key > sslkey/server.csr  =>適当に入れる

サーバ証明書(CRT)の作成

# openssl x509 -in sslkey/server.csr -days 3650 -req -signkey sslkey/server.key  > sslkey/server.crt  =>適当(ry

サーバ証明書の設置

# cp sslkey/server.key sslkey/server.crt /usr/local/apache/conf

ApacheのSSL設定と動作確認

httpd.confを編集し、SSLに関する設定ファイルを読み込むように設定する。

# cd /usr/local/apache/conf# vi httpd.conf

後述する"ssl.conf"を読み込むように設定

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so  LoadModule ssl_module modules/mod_ssl.so  ...# Secure (SSL/TLS) connections#Include conf/extra/httpd-ssl.confInclude conf/ssl.conf  

テンプレの"httpd-ssl.conf"を元に"ssl.conf"を作成・編集

# egrep -v -e '^$' -e '^#' ./extra/httpd-ssl.conf > ssl.conf# vi ssl.conf

整形してパスを修正(2.4.18を削除)、DocumentRootなどはHTTPと共用する前提で無効にした。

Listen 443  SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4  SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4  SSLHonorCipherOrder on  SSLProtocol all -SSLv3  SSLProxyProtocol all -SSLv3  SSLPassPhraseDialog  builtin  SSLSessionCache        "shmcb:/usr/local/apache/logs/ssl_scache(512000)"  SSLSessionCacheTimeout  300<VirtualHost _default_:443>  #    DocumentRoot "/usr/local/apache/htdocs"#    ServerName www.example.com:443#    ServerAdmin you@example.com    ErrorLog "/usr/local/apache/logs/error_log"    TransferLog "/usr/local/apache/logs/access_log"    SSLEngine on    SSLCertificateFile "/usr/local/apache/conf/server.crt"    SSLCertificateKeyFile "/usr/local/apache/conf/server.key"    <FilesMatch "\.(cgi|shtml|phtml|php)$">        SSLOptions +StdEnvVars    </FilesMatch>    <Directory "/usr/local/apache/cgi-bin">        SSLOptions +StdEnvVars    </Directory>    BrowserMatch "MSIE [2-5]" \             nokeepalive ssl-unclean-shutdown \             downgrade-1.0 force-response-1.0    CustomLog "/usr/local/apache/logs/ssl_request_log" \              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"</VirtualHost>  

systemdのSSLパスフレーズ対応

起動時に都度パスフレーズを要求する場合

"systemd-ask-password" を実行するための適当なスクリプトを作成

# vi /usr/local/apache/bin/ssl-ask-passwd
#!/bin/shexec /bin/systemd-ask-password "Enter SSL pass phrase for $1 ($2) : "  

作成したスクリプトに実行権限を付与

# chmod +x /usr/local/apache/bin/ssl-ask-passwd

先に作成していた"ssl.conf"に組み込む

# vi ssl.conf

"|"の後にスペースなど挟まないよう注意

#SSLPassPhraseDialog  builtinSSLPassPhraseDialog |/usr/local/apache/bin/ssl-ask-passwd  

サービスの停止/起動を行い、パスフレーズが要求されること。停止/起動が正常に行われた事を確認

# systemctl stop httpd# systemctl start httpd

起動時のパスワード認証をスルーさせる場合

ほぼほぼ上記と同様だが、"systemd-ask-password" とは異なり、スクリプトに直接パスフレーズを書いて渡すようにする。※なんか気持ち悪いので下記では/root下にディレクトリを作成して配置した。

# mkdir /root/.secret/# vi ~/.secret/ssl-ask-passwd

"[password]"にSSL秘密鍵のパスフレーズを記入

#!/bin/shecho "[password]"  

実行権限を付与

# chmod +x ~/.secret/ssl-ask-passwd

先に作成した"ssl.conf"に組み込む

# vi ssl.conf

上記では"|"で渡したが、ここでは"exec:"でスクリプトを指定して実行させるようにする。

#SSLPassPhraseDialog  builtinSSLPassPhraseDialog exec:/root/.secret/ssl-ask-passwd  

サービスの停止/起動を行い、パスフレーズが要求されることなく。停止/起動が正常に行われた事を確認

# systemctl stop httpd# systemctl start httpd

以上