2011年5月23日月曜日

1台のサーバでApacheを複数動かす

Windowsでの話です。
今回は、Apache + ssl を使ってブラウザとサーバの間の通信を暗号化しているWebアプリケーションサーバに、もうひとふんばりしてもらいたい。
つまり、port=443を解放してHTTPS通信を可能にしているWebアプリケーションサーバに、別ポートも解放してHTTP以外の通信を暗号化してほしいということです。

どうすれば、実現可能なのだろうか。
単純に、Apacheを複数動かせば良いのではないか?
本当にそれで出来るの?調べてみると、実現できそうでした。
もちろん、Apacheのインストーラを使っての作業では無理なので、多少コマンドを叩いてもらい必要があります。

今回使うコマンド(サービスに登録する)
> cd ${Apacheの環境変数}¥bin
> apache -k install -n “${サービス名}” -f “${Apache設定ファイルのディレクトリ}”


今回の作業としては、下記のことをしました。
① c:¥Program Files 以下のApacheフォルダをコピーするなりして二つ作成
            例) Program Files --- Apache2.2
                                        |- Apache2.2_copy

    ② httpd.conf の書き換え(今回はsslの設定もあり、httpd-ssl.confも書き換えた)
            ・ポート番号がかぶらないこと
            ・ディレクトリに気をつけること

    ③ サービスに登録
            それぞれのApacheのフォルダ以下のbinに移動して
            > apache -k install -n “Apache2.2_copy” -f “conf/httpd.conf”

    サービスを削除するには、下記のコマンドで良い
            > apache -k uninstall -n “Apache2.2_copy”


    1つのApacheフォルダに、httpd.confの名前だけを変更する方法もあるみたいです。
    (というか、こっちのほうが使われている??)
            apache2.2 --- httpd.conf
                             |- httpd2.conf

            > apache -k install -n “apache_httpd” -f “conf/httpd.conf”
            > apache -k install -n “apache_httpd2” -f “conf/httpd2.conf”


    Apacheを複数起動させる以外にも方法はありそうです。
    まだまだApacheを分かってないので、これから学んでいきます。

    2011年5月17日火曜日

    Geolocation API で現在位置をGoogleMapに表示

    Geolocation API は、内蔵GPSデバイスを使用して位置を特定するAPIです。位置情報を扱うAPIはHTMLにはなかったのですが、HTML5のGeolocation API によって標準化されました。Firefox3.6以上・Google Chrome 5以上などで利用できます。

    注意しておくべきなのは、全てのデバイスで使用できるわけではありません。搭載されているソフトウェアやハードウェアによります。また、位置情報はユーザが許可しない限り取得されません。

    <!doctype html>
            <head>
                    <meta charset=“UTF-8” />
                    <title>Geolocation test</title>
                    <script type=“text/javascript” src=http://maps.google.com/maps/api/js?sensor=true></script>
            </head>
          
            <body>
                    <h1>Geolocation test</h1>
                    <div id = “status”>位置情報取得中...</div>
                    <div id = “gmap” style=“width:900px;height:900px;”></div>
                  
                    <script>
                            var mapOptions = {
                                    zoom: 13,
                                    mapTypeId: google.maps.MapTypeId.ROADMAP
                            };
                            var map = new google.maps.Map(document.getElementById(“gmap”), mapOptions);
                            var infowindow = new google.maps.InfoWindow();
                          
                            if (navigator.geolocation) {
                                    navigator.geolocation.getCurrentPosition(
                                            function(position){
                                                    var lat = position.coords.latitude;
                                                    var lng = position.coords.longitude;
                                                    var time = position.timestamp;
                                                    var currentPosition = new google.maps.LatLng(lat, lng);

                                                    document.getElementById(“status”).innerHTML = “位置情報取得しました”;
                                                    map.setCenter(currentPosition);
                                                    contentString = “現在値”;
                                                    infowindow.setContent(contentString);
                                                    infowindow.setPosition(currentPosition);
                                                    infowindow.open(map);
                                    }, function(error){
                                                            document.getElementById(“status”).innerHTML = “error : “ + error.code;
                                    }
                                    );
                            } else {
                                    document.getElementById(“status”).innerHTML = “Geolocation APIに対応してません”;
                            };
                    </script>
            </body>
    </html>

    <解説>
    ■Google Mapを使用するためには、下記を追加します
    <script src=“http://maps.google.com/maps/api/js?sensor=true”></script>

    ■getCurrentPositionメソッド
    現在位置を取得するメソッドであり、戻り値はありません。
    引数は3つとれます。
    第一引数:位置情報が格納したPositionオブジェクト(位置情報と取得した時間)が渡される
    第二引数:エラー情報を格納したPositionErrorオブジェクトが渡される
    第三引数:精度や有効期間を格納したPositionOptionsオブジェクトが渡される


    実際にここから現在位置を取得してみましょう。
    FireFox3.6以降、GoogleCrome11.0.696.68以降で動いたのを確認しています。
    新しいブラウザはGeolocationの規格に対応するようになってきていますが、一部ブラウザでは位置情報を取得できないものもあります。


    位置情報アプリはこれから様々な用途で利用されるでしょう。
    例えば、地震被災者の居場所を特定する地震安否確認、自分の位置も確認できる道案内アプリ、友達がどこにいるのか情報を求める友達場所検索アプリなどなど。

    こんな面白そうなJavaScript APIを見つけてしまったので、JavaScriptもこれから学ぼっと。

    参考URL :
    http://code.google.com/intl/ja/apis/maps/documentation/javascript/basics.html

    2011年5月16日月曜日

    オレオレ認証局の構築

    SSL証明書 (Secure Sockets Layer Certificate) は、HTTP通信を安全にする以外にも、POPやIMAP、SSLトンネルなど暗号化を必要とする間で安全に鍵を交換する手段としても利用されます。
    その、SSL証明書はクライアントが信頼する認証局 (Certificate Authority) によって署名を受ける必要があります。
    認証局は第三者機関であると思われがちですが(僕は最近までそうだと思っていました・・・)、自前で認証局を構築して、自分でSSL証明書に署名することもできます。

    今回PerlでSSL認証局を作ります。
    まず、openssl-perl と Perl をインストールしましょう。

    # yum -y install openssl-perl
    # yum -y install perl

    ■証明書と秘密鍵を作成する
    CA.plのあるディレクトリは、/etc/pki/tls/misc です。
    そのディレクトリに移動し、CA.plを実行します。

    # cd /etc/pki/tls/misc
    # perl ./CA.pl -newca

    CA certificate filename (or enter to create)

    Making CA certificate ...
    Generating a 1024 bit RSA private key
    ...........................++++++
    ..++++++
    writing new private key to ‘../../CA/private/cakey.pem’
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    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]:Japan
    string is too long, it needs to be less than 2 bytes long
    Country Name (2 letter code) [GB]:JP
    State or Province Name (full name) [Berkshire]:Tokyo
    Locality Name (eg, city) [Newbury]:Yukigaya
    Organization Name (eg, company) [My Company Ltd]:Tokyo-institute
    Organizational Unit Name (eg, section) []:computer-Sience^[[D^[[D^[[D^[[D^[[D^[[D^[[A
    Common Name (eg, your name or your server’s hostname) []:Shindo
    Email Address []:dummy@dum.com

    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Using configuration from /etc/pki/tls/openssl.cnf
    Enter pass phrase for ../../CA/private/cakey.pem:
    19870:error:28069065:lib(40):UI_set_result:result too small:ui_lib.c:849:You must type in 4 to 8191 characters
    Enter pass phrase for ../../CA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
    Serial Number:
    d2:e7:af:e1:a5:3d:df:82
    Validity
    Not Before: May 16 15:31:32 2011 GMT
    Not After : May 15 15:31:32 2014 GMT
    Subject:
    countryName = JP
    stateOrProvinceName = Tokyo
    organizationName = Tokyo-institute
    organizationalUnitName = Computer-Sience
    commonName = Shindo
    emailAddress = dummy@dum.com
    X509v3 extensions:
    X509v3 Subject Key Identifier:
    76:09:6C:71:94:82:1C:5B:00:73:BC:58:F6:9A:88:D2:82:41:1D:E2
    X509v3 Authority Key Identifier:
    keyid:76:09:6C:71:94:82:1C:5B:00:73:BC:58:F6:9A:88:D2:82:41:1D:E2
    DirName:/C=JP/ST=Tokyo/O=Tokyo-institute/OU=computer-Sience/A/CN=Shindo/emailAddress=dummy@dum.com

    serial:D2:E7:AF:E1:A5:3D:DF:82

    X509v3 Basic Constraints:
    CA:TRUE
    Certificate is to be certified until May 15 15:31:32 2014 GMT (1095 days)

    Write out database with 1 new entries
    Data Base Updated




    /etc/pki/CA の以下に証明書(./cacert.pem)、秘密鍵(./privete/cakey.pem)が作られます。

    # cd /etc/pki/CA
    # ls -la

    drwxr-xr-x 6 root root 4096 5月 17 00:37 .                   
    drwxr-xr-x 7 root root 4096 5月 17 00:36 ..
    -rw-r--r-- 1 root root 3530 5月 17 00:37 cacert.pem
    -rw-r--r-- 1 root root 716 5月 17 00:37 careq.pem
    drwxr-xr-x 2 root root 4096 5月 17 00:36 certs
    drwxr-xr-x 2 root root 4096 5月 17 00:36 crl
    -rw-r--r-- 1 root root 3 5月 17 00:36 crlnumber
    -rw-r--r-- 1 root root 134 5月 17 00:37 index.txt
    -rw-r--r-- 1 root root 21 5月 17 00:37 index.txt.attr
    -rw-r--r-- 1 root root 0 5月 17 00:36 index.txt.old
    drwxr-xr-x 2 root root 4096 5月 17 00:37 newcerts
    drwxr-xr-x 2 root root 4096 5月 17 00:36 private
    -rw-r--r-- 1 root root 17 5月 17 00:37 serial


    この操作の後に秘密鍵のパーミッションを400に設定し、他の利用者によって署名されることを防ぎましょう

    # chmod 400 ./private/cakey.pem

    ここまでの操作で、認証局を構築することができました。次にサービスで実際に使用する鍵を作成します。

    ■SSL証明書の生成
    # cd /etc/pki/tls/misc
    # ./CA.pl -newreq-nodes

    Generating a 1024 bit RSA private key
    .................................................................++++++
    .................................++++++
    writing new private key to ‘newkey.pem’
    -----
    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]:Tokyo
    Locality Name (eg, city) [Newbury]:Yukigaya
    Organization Name (eg, company) [My Company Ltd]:Tokyo-Institute
    Organizational Unit Name (eg, section) []:ComputerSience
    Common Name (eg, your name or your server’s hostname) []:lovemoe
    Email Address []:dummy@lovemoe.hm

    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Request is in newreq.pem, private key is in newkey.pem





    ■SSL証明書の署名
    次に、自分で発行リクエストにサインしてSSL証明書を作成します。

    # ./CA.pl -newreq-nodes

    Generating a 1024 bit RSA private key
    .................................................................++++++
    .................................++++++
    writing new private key to ‘newkey.pem’
    -----
    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]:Tokyo
    Locality Name (eg, city) [Newbury]:Yukigaya
    Organization Name (eg, company) [My Company Ltd]:Tokyo-Institute
    Organizational Unit Name (eg, section) []:ComputerSience
    Common Name (eg, your name or your server’s hostname) []:lovemoe
    Email Address []:dummy@lovemoe.hm

    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Request is in newreq.pem, private key is in newkey.pem
    [root@lovemoe misc]# pwd
    /etc/pki/tls/misc
    [root@lovemoe misc]# ./CA.pl -sign
    Using configuration from /etc/pki/tls/openssl.cnf
    Enter pass phrase for ../../CA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
    Serial Number:
    fc:23:2a:16:f5:0e:e2:f2
    Validity
    Not Before: May 16 15:50:01 2011 GMT
    Not After : May 15 15:50:01 2012 GMT
    Subject:
    countryName = JP
    stateOrProvinceName = Tokyo
    localityName = Yukigaya
    organizationName = Tokyo-Institute
    organizationalUnitName = ComputerSience
    commonName = lovemoe
    emailAddress = dummy@lovemoe.hm
    X509v3 extensions:
    X509v3 Basic Constraints:
    CA:FALSE
    Netscape Comment:
    OpenSSL Generated Certificate
    X509v3 Subject Key Identifier:
    51:71:F6:7C:34:E9:47:67:16:81:B4:81:83:0C:81:BE:FB:CE:1B:FB
    X509v3 Authority Key Identifier:
    keyid:A0:1C:E0:19:3D:43:BF:45:73:DA:73:59:63:A7:15:36:0F:EA:12:79

    Certificate is to be certified until May 15 15:50:01 2012 GMT (365 days)
    Sign the certificate? [y/n]:y


    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    Signed certificate is in newcert.pem
    You have new mail in /var/spool/mail/root



    ひとまず、認証局を作成する手順まで。
    Apacheを使って、https通信を可能にする設定は次回にでも。


    今、つまづいているところは、Javaを使ってのサーバ同士のhttps通信のさいに、エラーがでること。
    “クライアント証明書がない” みたく言われます。
    1. クライアント証明書をなしで、エラーが出ない方法はあるのか
    2. 1が無理ならクライアント証明書を作る (Javaのソースが広く出回っているので簡単?)

    参考)ネットワークセキュリティHacks (0’REIEEY出版)

    2011年5月8日日曜日

    twitterのXMLを処理する

    ブームに乗り遅れた感はありましたが、XMLを勉強しました。
    twitterのXML情報を読み込んで、プログラミングを実装します。

    当初の目的としては、TwitterのXML情報を読み込んで、Tweetを発信した位置情報を返し、今あの人がどこにいるのかを探すツイセキッターたるものを実装しようとしていました。
    しかし、XMLの中身を調べてみると、発信した位置情報を示す箇所は見当たらず(当然だな)、諦めました。

    なので、ツイッターで発信したツイートをコマンドラインに表示するプログラミングを書くことにしました。

    さすが、Perl。すでにモジュールが広まっていました。
    XML::FeedとURIをcpanでインストールして、以下のプログラミングを書くだけです。


    #!usr/bin/perl

    use strict;
    use warnings;
    use XML::Feed;
    use URI;
    binmode STDOUT, “:utf8”;

    my $user_id = ‘hogehoge’;
    my $url = “http://twitter.com/statuses/user_timeline/${user_id}.atom”;

    my $feed = XML::Feed->parse( URI->new( $url ) )
    or die XML::Feed->errstr;
    for my $item ( $feed->entries ) {
    print $item->content->body, “\n”;
    }



    XML::Feedは下記に対応しています。Tweeterにとどまらず幅広い使い方が可能です。
    ・RSS 0.91
    ・RSS 1.0
    ・RSS 2.0
    ・Atom


    参考:http://fleur.hio.jp/perldoc/mix/lib/XML/Feed.mix.html

    2011年5月5日木曜日

    アニメ『電脳コイル』 磯光雄

    アニメ全26話をぶっとおしで見ました。

    PastedGraphic-2011-05-5-20-34.jpg

    まず、このアニメを知るためにはAR (Augmented Reality) についての知識が必要です。
    ARという考え方が現れる以前は、VR (Virtual Reality) という技術が話題になっていました。
    VRとは、仮想空間に現実も持ってくるという考え方です。
    例えば、コンピュータ上に現実に近い存在を作り出し、立体的に見たり、動かしたりします。

    一方で、ARとは、現実空間の中に仮想を持ち込むという考え方です。
    ARが注目されるきっかけとなったのは、iphoneアプリの「セカイカメラ」ではないでしょうか。
    セカイカメラとは、街中でiphoneのカメラ越しに現実の風景を覗くと、エアタグと呼ばれる情報が表示されます。
    このエアタグは、ユーザがコメントを付けることが可能なので、ユーザ同士で情報交換が行えるというわけです。

    アイデア次第では、価値の高いサービスやエンターテイメントを提供することができます。どのように発展するかは、まだまだ未知数ですが、ARは高い可能性を秘めたものとして注目されています。


    さて、この技術が『電脳コイル』のどこに使われているのか?
    このアニメは、「電脳」と呼ばれる技術が一般的に普及している世界で、「電脳メガネ」によって現実世界に重ねて表示され操作できる近未来を描いています。
    「電脳」は、子供でも当たり前のごとく扱っていて、日常生活に欠かせないものになっています。
    ごく普通の小学生の主人公が、「電脳メガネ」に振りまわされ、問題を解決していくアニメです。

    この「電脳メガネ」こそがARという考え方が使われています。
    電脳メガネを通してでしか見ることができない電脳ペット。
    教科書や電話も仮想であり、電脳メガネを通して使うことができます。

    システムを使うがゆえに起こるバグも忠実に再現されています。
    電脳ペットや電脳空間に浸食・破壊するバグと、役に立つ機能を持った宝石に似たバグが存在し、そのバグを徹底的に駆除するサッチーという違法電脳体駆除ソフトもありで、IT・システム関連の話をかじったことがある人なら誰しもが食いつく内容だと思います。


    ここ最近、まわりにアニメ詳しい人が多いので、多かれ少なかれ影響を受けています。
    この作品に関しては、メガネだから良いんだよ、と主張する方もいました。
    アニメって奥が深いんだなと、関心する今日このごろ。