2012年 2月 の投稿一覧

Serversman@vpsにてSSLを設定する方法

このブログはServersman@vpsのCentOS上で動いています。
ブログの他にもいくつかサイトが有って、SSLの必要が出てきたので設定した方法を書きます。
また、証明書は独自の証明書(オレオレ証明書)を使います。

目次

  • mod_sslインストール
  • Makefileで証明書(.crt)ファイルの作成
  • Apache(mod_ssl)の設定

mod_sslインストール

[root@suusuke ~]# yum -y install mod_ssl

Makefileで証明書(.crt)ファイルの作成

[root@suusuke ~]# cd /etc/pki/tls/certs/
[root@suusuke certs]# make server.crt
umask 77 ; \
	/usr/bin/openssl genrsa -des3 1024 > server.key
Generating RSA private key, 1024 bit long modulus
.....++++++
.................................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
umask 77 ; \
	/usr/bin/openssl req -utf8 -new -key server.key -x509 -days 365 -out server.crt -set_serial 0
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Miyagi
Locality Name (eg, city) [Newbury]:Sendai
Organization Name (eg, company) [My Company Ltd]:suusuke
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Keisuke Suzuki
Email Address []:k.suke.suzuki@gmail.com

Apache(mod_ssl)の設定

バーチャルホストにて、複数サイトを運用しているので、バーチャルホスト毎に、httpd-vhosts-[サイト名]-ssl.confという設定ファイルにして個別に設定する。
まずは、ssl.confの<VirtualHost _default_:443\></VirtualHost>をコピーしてコメントアウトする。

[root@suusuke certs]# vi /etc/httpd/conf.d/ssl.conf 

#<VirtualHost _default_:443>
...
この間の設定を全部コピーしてコメントアウト
...
#</VirtualHost>

すでに、httpd-vhosts-[サイト名].confという名前でバーチャルホストを設定しているので、その設定ファイルをコピーしてhttpd-vhosts-[サイト名]-ssl.confという名前の設定ファイルを作成する。
また、ssl.confでコピーしたものを追記する。

[root@suusuke ~]# cp /etc/httpd/conf.d/httpd-vhosts.conf /etc/httpd/conf.d/httpd-vhosts-ssl.conf
[root@suusuke ~]# vi /etc/httpd/conf.d/httpd-vhosts-ssl.conf 

<VirtualHost *:443> ←ポート変更
    ServerName suusuke.info
    DocumentRoot /var/www/html
    ErrorLog logs/suusuke.info-error_log
    CustomLog logs/suusuke.info-access_log combined env=!no_log
    <Directory "/var/www/html">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

    #ここから-----------------------------------------------------------------------
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    <Directory "/var/www/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
    SetEnvIf User-Agent ".*MSIE.*" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_request_log \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    #ここまで-----------------------------------------------------------------------
</VirtualHost>

Apache再起動

[root@suusuke ~]# /etc/rc.d/init.d/httpd restart

https://suusuke.infoにアクセスしてsslでアクセスできることを確認してオーケー!

大量の.htpasswdを作成する方法

BASIC認証する際に.htacessで設定して、パスワードファイル(任意の名前).htpasswdを作成します。

大量のユーザーとパスワードを設定する場合はいちいちhtpasswdコマンドでユーザーを追加するのは大変です。

そんな時にはHtpsserというソフトを使うと簡単に大量のユーザーの.htpasswdファイルを作成できます。

Htpasserの詳細情報 : Vector ソフトを探す!.

使い方は非常に簡単で、ユーザー名とパスワードをタブ区切りのテキストで用意しておきそれをインポートすると.htpasswdファイルが出来上がります。

また、HtpasserはWindowsのソフトなのでMacやLinuxで生成する場合はこちらのshellを実行すると生成できるようです。
(userlistというファイルに[user]:[pass]というフォーマットでファイルを用意しておく)

#!/bin/bash

for fullname in `cat ./userlist` ; do
user=`expr $fullname : '\(.*:\)'`
user=`echo $user | sed 's/://'`
pass=`expr $fullname : '.*:\(.*\)'`

expect -c "
spawn htpasswd -d ./passwd-file $user
expect \"New password: \" ; send \""$pass"\r\"
sleep 1
expect \"Re-type new password: \" ; send \""$pass"\r\"
expect eof
" >> /var/log/adduser/passwd.log
done

phpでxmlを出力して受け取る方法

phpでxml関連のライブラリーは結構ありますが、一番手軽なのはPEARのXML_Serializerだと思います。
※Cakeとか、フルスッタクのフレームワークに入ってるxmlのコンポーネントがある場合はそちらのほうが手軽です。

目次

  • XML_Serializerインストール
  • XMLの出力
  • XMLの受け取り

XML_Serializerインストール

PEARでインストール

pear install XML_Serializer

手動でインストール

XML_Serializer.

からライブラリーをダウンロード、解凍して、適当な場所に保存する。

XML_UtilXML_Parserと依存しているので、合わせてダウンロードしてインストールしておく。
※PEARはインストール済みを想定。されてない場合は、インストールする必要がある。

XMLの出力

require_once 'XML/Serializer.php';

$data = array('aaa' => 'bbb', 'ccc' => 'ddd');

$options = array(
                 "indent"         => " ",
                 "linebreak"      => "\n",
                 "typeHints"      => false,
                 "addDecl"        => true,
                 "encoding"       => "EUC-JP",
                 "rootName"       => "result",
                 "defaultTagName" => "item",
                 );
$serializer = new XML_Serializer($options);
$status = $serializer->serialize($data);

if( $status === true ) {
    $xml = $serializer->getSerializedData();
    header ("Content-Type: text/xml; charset=EUC-JP");
    echo $xml;
    exit;
}
exit;

文字コードはEUC-JPに指定しています。

XMLの受け取り

require_once 'XML/Unserializer.php';

$header = array(
    "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]
);
$options = array(
    "http" => array(
        "method"  => "GET",
        "content" => http_build_query(array()),
        "header"  => implode("\r\n", $header)
    )
);

$api_uri = 'http://example.com/'; // xmlを出力するURL
$xml = file_get_contents($api_uri, false, stream_context_create($options));
$obj = new XML_Unserializer();

$obj->setOption("parseAttributes", true);

$status = $obj->unserialize($xml);
if ($status === true) {
    $xml_data = $obj->getUnserializedData();
    mb_convert_variables('EUC-JP', 'UTF-8', $xml_data);
    print_r($xml_data['item']);
}

exit;

こんな感じで、xmlを読み込むことができます。
オプションは

XML_Unserializer Options.

が参考になります。
ちなみに、file_get_contentsでGETでパラメータ付きリクエスト送りたい場合は、

file_get_contents() で GET リクエストを送る場合の値は URL に持たせる | ウェブル.

xmlを出力する方でBASIC認証を指定したい場合もあると思いますが、file_get_contentsではBASIC認証されたディレクトリのファイルも取得できます。

$header = array(
    "Authorization: Basic ".base64_encode("User:Pass"),
    "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]
);