ラベル apache の投稿を表示しています。 すべての投稿を表示
ラベル apache の投稿を表示しています。 すべての投稿を表示

2018年4月19日木曜日

今さらながら、Let's EncryptでSSL対応 + 自動更新

どうも、俺です。

今日は、随分前からWeb界隈でもてはやされているLet's Encryptの導入と自動更新設定についてメモ。

環境はCentOS6.9。たぶんCentOS7系でも一緒だと思う..。
Apache 2.4。

(1) certbotをダウンロード

$ wget "https://dl.eff.org/certbot-auto"

// certbot-autoを適当なPATHへ持っていく
# mv certbot-auto /usr/local/bin

// certbot-autoに実行権限を付与
# chmod +x /usr/local/bin/certbot-auto

(2) SSL証明書を作成

※注意 :この時点で対象サーバーにドメインが当たっていないと以下のコマンドは失敗します。

# certbot-auto certonly --webroot -w /www/path/to/public -d example.com --email info@example.com

うまくいくと
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-07-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
が表示されます。

(3) 証明書の確認

$ ls /etc/letsencrypt/live/example.com

README  cert.pem  chain.pem  fullchain.pem  privkey.pem


  • cert.pem ... 証明書
  • chain.pem ... 中間証明書
  • fullchain.pem ... 証明書と中間証明書とを一緒にした証明書
  • privkey.pem ... 秘密鍵

(4) Apache(2.4系)の設定

対象の.confファイル内に以下を記述。
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

※2.2系の場合は以下も記述。
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

(5) Apache再起動

# /usr/local/apache2/bin/apachectl restart

(6) Let's Encrypt 自動更新設定

Let's Encryptの証明書は3ヶ月で有効期限が切れます。
そのためcronで自動更新させましょう。
# vim /etc/crontab

30  5  *  *  1  root /usr/bin/certbot-auto renew -q --no-self-upgrade --post-hook "/usr/local/apache2/bin/apachectl restart"

↑毎週月曜AM5:30に更新コマンドを叩いています。
更新ができるようになる30日前になったら、証明書が更新されます。
-qオプション ... 出力なし。
--no-self-upgrade ... プログラムの新バージョンへの自動更新をしない。




以上でぇぇぇえぇぇす。

2015年9月2日水曜日

Apache(2.4系)のソースインストールで "checking for OpenSSL version >= 0.9.8a... FAILED"が出る

どうも、俺です。

Apacheをソースインストールするときにつまづいたのでメモ。
./configureした際に

checking for OpenSSL version >= 0.9.8a... FAILED
configure: WARNING: OpenSSL version is too old
no
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures

が出ちゃった場合。

# yum install openssl-devel

で解決!

※僕の場合、CentOS6.7 Apache 2.4.12でした。

以上でぇぇぇぇす。

2013年6月9日日曜日

apache付属のhtpasswdコマンドがなくてもBasic認証用ファイルを作る

どうも、俺@休みです。

Linuxサーバにnginx入れててBasic認証したいとき。

# vim /path/to/nginx.conf

-----------------------------
 78   location /secret {
 79       alias /home/foouser/secret_directory;
 80       autoindex on;
 81       auth_basic "member only";
 82       auth_basic_user_file /home/foouser/secrect_directory/.htpasswd;
 83   }
とかやると、
http://hoge.jp/secret以下にBasic認証がかかるようになります。
※.htpasswdファイルは外部から見れないようにする必要があります。

で、この.htpasswdファイルですが、apacheがインストールされている環境では
$ htpasswd -c /home/foouser/secret_directory.htpasswd username
で新規作成できますが、 「nginxしか入れてねぇし、apache入れるん面倒やで」という人は以下のコマンドでもOK。
echo "username:$(openssl passwd -crypt your_password)" >> /home/foouser/secret_directory.htpasswd
上記はcrypt暗号化ですが、他にも色々あるみたいです。
ココに答えが!


以上デェぇぇぇす。

2013年3月29日金曜日

CentOSにapache2.4.3をインストール

どうも、俺@寝る前です。

最近アプリ開発してばっかの俺が久しぶりにLinuxネタです。

2012/2月にapache2.4.1がリリースされて1年ちょっと経過し、
じわじわと情報が増えてきたところでようやく僕もapache2.4.3をインストールしてみました。
※2013/03/28時点での最新はv2.4.4

まずソースをDLして展開。
# wget 'http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.4.3.tar.gz'
# tar zxvf httpd-2.4.3.tar.gz
# cd httpd-2.4.3
これまでだと、このまま./configureしてたのですが、2.4からはそれはNGです。
INSTALLファイルにこう書いています。
Consider if you want to use a previously installed APR and 
APR-Util (such as those provided with many OSes) or if you 
need to use the APR and APR-Util from the apr.apache.org
project. If the latter, download the latest versions and 
unpack them to ./srclib/apr and ./srclib/apr-util (no 
version numbers in the directory names) and use 
./configure's --with-included-apr option.
つまり--with-included-aprオプションを使うならaprとapr-utilをDL&展開して
./srclib以下にapr と apr-utilという名前で置きなさい。
ということらしい。
# cd ./srclib
# wget wget http://ftp.tsukuba.wide.ad.jp/software/apache//apr/apr-1.4.6.tar.gz
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-util-1.5.1.tar.gz
# tar zxvf apr-1.4.6.tar.gz
# tar zxvf apr-util-1.5.1.tar.gz
# mv apr-1.4.6 apr
# mv apr-util-1.5.1 apr-util
あと途中でPCREも必要だと怒られたので入れておきます。
# wget 'ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz'
# tar zxvf pcre-8.32
# ./configure --prefix=/usr/local/pcre/v8.32
# make
# make install
ではapacheのインストールを行います。
※オプションは適宜ご自由に。
# ./configure --prefix=/usr/local/apache2/v2.4.3 --with-included-apr --enable-module=so --enable-mods-shared=most --enable-ssl --enable-rewrite --with-mpm=prefork --with-pcre=/usr/local/pcre/v8.32
--with-mpm=preforkオプションを付けておかないと、デフォルトでevent-mpmでインストールされてしまいます。

非同期で多アクセスには強いですが、僕のようなPHPerな開発者にはprefork-mpmがオススメです。
# make
# make install
これで上手くインストールされるはずです。

後は基本的にこれまでのバージョンのものと同じですが、apacheの設定ファイルなんかは
order allow,deny
allow from all
だったものが、v2.4からは
Require all granted
# 禁止の場合は
# Require all denied
になります。
さらには、192.168.0.10のみ許可する場合は

  Require ip 192.168.0.10

となり、逆に192.168.0.10のみ拒否する場合は

  Require all granted
  Require not ip 192.168.0.10


# または

  Require all granted
  
    Require ip 192.168.0.10
  

のようになります。
うーん、なぜ今さら変えてくるかapache.org。
これまでの書き方は非推奨となるそうで、一応まだ使えるみたいです。

あと、MaxClientsはMaxRequestWorkersに書き変わりました。


以上でぇぇぇぇす。

2011年11月11日金曜日

設定されたSSL鍵にパスフレーズが設定されているかどうか

どうも、俺@アプリ開発中です。
今日は、利用しているSSLの鍵にパスフレーズが設定されているかどうかを調べる方法についてめもめも。

例えば、apacheを再起動しなければならなくなった場合
そのapacheはSSL設定がされており、https:// なWEBサーバであると、再起動かけたとき

# /usr/local/apache2/bin/apachectl restart
Enter pass phrase for /path/to/ssl.key: 
のようにパスフレーズを求められて、
apacheが停止したところで止まってしまい、起動出来なくなってしまいます。これはエライコッチャ!

こんな場合は、事前にSSL鍵にパスフレーズが設定されているかどうかチェックしておきましょう。
まず、apacheのSSL設定ファイル(通常はhttpd-ssl.confかな)にあるSSLCertificateKeyFileを見て、SSL鍵パスを確認します。

# cat /usr/local/apache2/conf/extra/httpd-ssl.conf | grep SSLCertificateKeyFile
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/ssl.key"
例えばこのように出力されて、鍵ファイルのパスがわかります。

このファイルを openssl コマンドでパスフレーズ設定されているかどうか確認します。
# openssl rsa -in /usr/local/apache2/conf/ssl/ssl.key
とコマンドを打って
・パスフレーズ設定されている場合
Enter pass phrase for /usr/local/apache2/conf/ssl/ssl.key:
これは要注意です!

・パスフレーズ設定されていない場合
Writing RSA key
----- BEGIN RSA PRIVATE KEY -----
LKDFopa99yjkfslkKgudkdf...
のように鍵ファイルを表示できれば設定されていません!


これで、apache再起動時に焦ることもなくなりますね。
僕は、開発環境でパスフレーズ設定されたapacheを再起動してしまい、「あれぇ」となった事があります。

ちなみにパスフレーズ設定されたSSL証明書鍵のパスフレーズを解除してしまう方法ですが、(セキュリティ的に危ないので本番サーバとかでは要検討!)

// バックアップを取る
# cp ssl.key ssl.key.bak

// パスフレーズ解除
# openssl rsa -in ssl.key -out new_ssl.key
Enter pass phrase for ssl.key: // ここでパスフレーズを入力
です。
new_ssl.keyというパスフレーズの設定されていないSSL証明書鍵が出来ました。


以上でぇぇぇぇす。

2011年3月9日水曜日

apacheのリバースプロキシでSSL接続しちゃう

どうも、俺@仕事中です。

またまたハマりました。
タイトル通り、apache(2系)のリバースプロキシ機能を使ってローカル内のapacheにSSL接続しようと思ってハマりました。
ググったらたくさん参考資料出てくるんですけどね、、

イメージは
クライアントブラウザ →(SSL)→ Proxyサーバ[192.168.10.10] →(SSL)→ ローカルapacheサーバ[192.168.10.11]
です。

まずapacheをインストールする際に mod_proxyとmod_ssl、mod_proxy_connectが有効になっていないといけません。(多分、、)
# /usr/local/apache2/bin/httpd -l
で上記のモジュールが出てくれば問題ありませんが、なければapacheをインストールし直しましょう。
# ./configure --enable-module=so --with-included-apr --enable-proxy --enable-ssl --enable-proxy-connect
オプションは環境に合わせて変えてください。
# make && make install

では、まずhttpd.confでリバースプロキシの設定しましょう。
# vim /usr/local/apache2/conf/httpd.conf
----------------------------------------------
# 以下を追加
ProxyRequests off
ProxyPass / http://192.168.10.11/
ProxyPassReverse /http://192.168.10.11/
ProxyPassReverseCookieDomain mydomain local-domain
ProxyPassReverseCookiePath / /
<Proxy *>
 order deny,allow
 deny from all
 allow from xxx.xxx.xxx.0/24 ....# あとは適当に
</Proxy>
リバースプロキシだけの設定では以上です。

これからSSLの設定を行いましょう。
※証明書の作り方は以前(opensslを使って秘密鍵と証明書の作成)も書いたのでそちらも参照ください。

オレオレ証明書作ります。
まず、CA秘密鍵作成
# openssl genrsa -rand /var/log/messages -out ca.key 1024
-randオプションはランダムなデータを作成する元となるファイルを適当に選択。
次にCA証明書の署名要求作成
# openss req -new -key ca.key -out ca.csr
ここは色々質問されますが、内容は割愛します。
では次に証明書発行
# openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
これでCA証明書まで完成です。

次はサーバ用証明書を作成しましょう。
まずサーバ用秘密鍵を作ります
# openssl genrsa -rand /var/log/maillog -out server.key 1024
↑と一緒ですね。
次にサーバ証明書の署名要求を作ります
# openssl req -new -key server.key -out server.csr
これも↑と一緒。
次にシリアルを記述した適当なファイルを作成
# echo 01 > ca.serial
では証明書を発行しちゃいましょう
# openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -in server.csr -out server.crt
出来ました!

これを適当な場所へコピー(移動)します。
# cp server.crt /usr/local/apache2/conf/ssl/server.crt # ←サーバ証明書
 # cp server.key /usr/local/apache2/conf/ssl/server.key # ←サーバ秘密鍵
ふぅ。


最後にapacheの設定です。
# vim /usr/local/apache2/conf/httpd.conf
-----------------------------------------------
<IfModule mod_ssl.c>
 Include conf/ssl.conf
</IfModule>

 # vim /usr/local/apache2/conf/ssl.conf (必要な部分のみ抜粋)
----------------------------------------
Listen 443
<VirtualHost _default_:443>
SSLCertificateFile /usr/local/apache2/conf/ssl/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server.key
<VirtualHost>

#SSLCACertificatePath /usr/local/apache2/conf/ssl.crt いらない!?
#SSLCACertificateFile /usr/local/apache2/conf/ssl-bundle.crt いらない!?

#SSLVerifyClient require いらない。クライアントの認証が必要であれば付ける
#SSLVerifyDepth 1 いらない

SSLProxyEngine on
ProxyPass / https://192.168.10.11/ # ローカルのapacheが例えば4444ポートでSSLを動かしてる場合は ProxyPass / https://192.168.10.11:4444/ね
ProxyPassReverse / https://192.168.10.11/ # こっちも ProxyPassReverse / https://192.168.10.11:4444/ね
出来ましたー!!

起動!!
# /usr/local/apache2/bin/httpd -k start -DSSL
たぶんパスフレーズ聞かれるので応えてあげてね。
ちなみにパスフレーズを聞かれるのが面倒な人は
# vim /usr/local/apache2/conf/ssl.conf
----------------------------------------------
SSLPassPhraseDialog exec:/usr/local/apache2/bin/pp-exec
# パスフレーズを入力するためのダイアログタイプ。builtin(デフォルト)またはexec。
で、
# vim /usr/local/apache2/bin/pp-exec
------------------------------------------
#!/bin/sh
echo "パスフレーズ"
だぜ!



以上でぇぇぇぇぇぇぇぇぇぇぇす。

2010年11月26日金曜日

apacheのrewriteでドメイン変更に対応する

どうも、俺@仕事中です。

今日はタイトルの通り、apacheのmod_rewriteを使ってサイトのドメイン変更に対応する方法についてメモめも。
さらにそのサイトは「*(ワイルドカード)」によるサブドメイン設定がされておりその対応もしなければなりません。

ドメインは
old.jp → new.jp に変更するものとします。
DNSゾーン設定は以下のような感じで
1.2.3.4は仮のサーバIPのつもり
@ IN A 1.2.3.4
* IN A 1.2.3.4


つまり
old.jpでアクセスのあったものはnew.jpにリライトし
foo.old.jpでアクセスのあったものはfoo.new.jpにリライトしたいのです。

apacheのRewriteモジュールはインストールしておいてね。


では設定方法について
# vim /usr/local/apache2/conf/httpd.conf
--------------------------------------------
1 RewriteEngine On
2 Rewrite Cond %{HTTP_HOST} ^(.*)old\.jp [NC]
3 RewriteRule ^(.*)$ http://%1new.jp$1 [R=301,L]
これでapache再起動でOKです。
正規表現はかなり適当なので実運用する場合はも少し丁寧に書いたほうが良いと思います。

ポイントは3行目の
^(.*)$ http://%1new.jp$1
の部分です。
「%1」は2行目のRewriteCondeで設定した正規表現の文字グループを後方参照する場合に使えます。
もちろん複数ある場合は %2,%3..とつづきます。

これで完成ーばんざあぁぁぁぁぁあぃ!

2010年7月15日木曜日

apacheにmod_rewriteを追加する。

どうも、俺@連続投稿です。

apacheに組み込まれているモジュールを確認する場合は
# httpd -l
Compiled in modules:
core.c
mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile
...
で確認できます。今日は「やべっ!RewriteEngine使うためのmod_rewrite入ってねーじゃん!」という場合どうするかのメモです。

まぁ、簡単なのはapacheを --enable-rewrite 追加して再インストールで良いのですが、再インストールできないような場合(例えばapacheを止められないような場合)。

まず適当なDirを作成
# mkdir /usr/local/apache2/my_dir
し、rewrite用のプログラムファイルを持ってきます。
# find /usr/local/src/httpd-2.2.6/ -name "*rewrite*"
/usr/local/src/httpd-2.2.6/modules/mappers/mod_rewrite.lo
/usr/local/src/httpd-2.2.6/modules/mappers/libmod_rewrite.la
/usr/local/src/httpd-2.2.6/modules/mappers/mod_rewrite.exp
/usr/local/src/httpd-2.2.6/modules/mappers/.libs/libmod_rewrite.a
/usr/local/src/httpd-2.2.6/modules/mappers/.libs/libmod_rewrite.la
/usr/local/src/httpd-2.2.6/modules/mappers/.libs/mod_rewrite.o
/usr/local/src/httpd-2.2.6/modules/mappers/mod_rewrite.o
/usr/local/src/httpd-2.2.6/modules/mappers/mod_rewrite.c
/usr/local/src/httpd-2.2.6/modules/mappers/NWGNUrewrite
...
たくさん出てきます。
ココで必要なのは
「mod_rewrite_c」と「mod_rewirte.h」の2つです。(たぶん

# cp /usr/local/src/httpd-2.2.6/modules/mappers/mod_rewrite.c /usr/local/apache2/my_dir
# cp /usr/local/src/httpd-2.2.6/modules/mappers/mod_rewrite.h /usr/local/apache2/my_dir
します。

次にビルドします。
# cd /usr/local/apache2/my_dir
# /usr/local/apache2/bin/apxs -c mod_rewrite.c
とすると
# ls -la
drwxr-xr-x 2 root root 4096 Jul 15 18:54 .libs
-rw-r--r-- 1 root root 154702 Jul 15 18:53 mod_rewrite.c
-rw-r--r-- 1 root root 1340 Jul 15 18:53 mod_rewrite.h
-rw-r--r-- 1 root root 822 Jul 15 18:54 mod_rewrite.la
-rw-r--r-- 1 root root 324 Jul 15 18:54 mod_rewrite.lo
-rw-r--r-- 1 root root 197344 Jul 15 18:54 mod_rewrite.o
-rw-r--r-- 1 root root 0 Jul 15 18:54 mod_rewrite.slo
とたくさんファイルが出来上がります。
次にインストールです。
 # /usr/local/apache2/bin/apxs -i -a -n rewrite mod_rewrite.la
完了です。

あとはhttpd.confをいつものように編集すれば完了です。


以上でぇぇぇえぇす。

2010年6月28日月曜日

apacheで「child pid xxxx exit signal File size limit exceeded (25)」エラーがでる

どうも、俺@仕事中です。

昨日とあるWEBサーバでページが表示されない事件が発生しました。
色々調べていると、apacheのerror_logに題名の
[notice] child pid 11737 exit signal File size limit exceeded (25)
のエラーが大量に、、、。

何のこっちゃ!?でしたが、とりあえず何かのファイルサイズがでかすぎる!という意味みたい。
ログファイルを見ていると、phpのエラーログが
$ ls -l php_error_log
-rw-r--r-- 1 nobody root 2147483647 Jun 21 10:30 php_error_log
で止まっている。
中身がとあるNOTICEレベルのエラーがずらーり。
というわけで
# mv php_error_log php_error_log.0 && touch php_error_log && chown nobody php_error_log
してapacheを再起動したら正常に稼働しはじめました。

Linuxには2GBの制限問題というものがある、と初めて知りました。
参考:Linuxで2GBを超えるファイルを作れない::0と1の欠片


まぁ、単純にファイルを削除するとかファイル名を変えるとかで対応できますが、32BitのLinuxOSだと問題ありそうです。
apacheのコンパイル時に
# CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ./configure --prefix=/usr/local/apache2
とかやれば2GBの問題はなくなるそうです。
参考:httpdで2GBを超えるファイルのリクエストに対応する方法::サラダ(*)

以上でぇぇぇえす。

2010年5月11日火曜日

httpd.confで HostnameLookups off が効かない

どうも俺@仕事中です。
今日はapacheの設定ファイルhttpd.confに
HostnameLookups off
と書いているのにIP逆引きされてしまう場合の対処法について。

解決法はズバリ、httpd.confや.htaccessまたはその他apacheの設定ファイルのどこかに
allow from localhost
allow from example.co.jp
などドメインを書いていたらそれを削除!です。

または
allow from 127.0.0.1 # localhost
などと同一行にコメントでドメインを書いている場合もそうみたいです。

apacheのバージョンは2.2.8です。


ここに同じことが書かれてありました。
M.C.P.C.:APacheでHostnameLookups offでもログにホスト名が記録される場合

以上でえぇぇえぇす。

2010年1月19日火曜日

apacheのRewriteEngine設定

こんにちわ、俺@仕事中です。
暇なんじゃないですよ。

今日はApache(2.0.59)のRewrite設定でハマったのでメモメモ。

Rewriteを有効にするには、apacheをインストールする時のconfigureオプションに
--enable-rewrite
をつけてmakeし、
httpd.conf(または.htaccess)に
RewriteEngine On
を書きます。

その後で「RewriteCond」と「RewriteRule」を書いてリダイレクトさせる条件やリダイレクト先などを書きます。
RewriteCond [値] [条件]
RewriteRule [URL正規表現] [Rewrite変換後]
RewriteCondは「ある条件を満たした場合にRewriteRuleを適用させる」という事をします。
例えばUser-AgentにDoCoMoが含まれていた場合に、http://foo.com/val_a/val_b を http://foo.com?a=val_a&b=val_bにRewriteさせるには、
RewriteEngine On
RewriteCond ${HTTP_USER_AGENT} DoCoMo
RewriteRule /(.*)/(.*) ?a=$1&b=$2
こんな感じです。(※未検証)

${HTTP_USER_AGENT}のように、利用できる環境変数は他にも
${HTTP_REFERER} ${HTTP_HOST} ${REMOTE_ADDR} ${SCRIPT_FILENAME} ${QUERY_STRING}
などなど多くあります。

一般的にRewriteは
http://foo.com/val_a/val_b/ というURLを http://foo.com/?a=val_a&b=val_bというURLに書き換えるために利用される事が多い(SEO対策など)のですが、今回ハマったのが
http://foo.com/val_a/?b=val_b というURLを http://foo.com?a=val_a&b=val_bというURLに書き換えようとした時です。
単純に、
RewriteRule ^/(.*)/\?b=(.*) /$1/$2
のようにしたのですが全く反映されません。
Rewriteログを取るために
RewriteLog logs/rewrite_log
RewriteLogLevel 3
とかやって見たのですが全然分かりませんでした。

Rewirteは「?(クエスチョンマーク)」がURL中にあると、それ以降をQuery_Stringとしてちょん切ってしまうので、「?(クエスチョンマーク)」以降のURLは解釈されないようなのです。
というので、上記のRewriteの場合は
RewriteRule ^/(.*)/(.*) /?a=$1&${QUERY_STRING}
として何とか対応しました。


いやー面倒でしたー。

2009年2月28日土曜日

apacheのカスタムエラーレスポンスについてメモ

この概要は表示できません。投稿を閲覧するには ここをクリック してください。