SSL(httpsプロトコル)を利用するには、ルート証明機関からサーバ証明書を拾得しなければなりません。が、これの年間維持費はだいたい500ドルくらい掛かります。ADSL自前鯖でSSLをサポートしようとするとこのコストが一番の壁。ところが電話(携帯可)があれば無料で正規の(USERTrust発行の)証明書を貰えるサービスが世の中にはあったりします。それが「FreeSSL」http://www.freessl.com/。以下には http://pc2.2ch.net/test/read.cgi/php/1016169881/38-56 での投稿内容をまとめておきます。
% openssl genrsa -des3 -out hogehoge.key 1024“-des3”ってつけるとパスフレーズを聞かれるんで適当に打つ。証明書を使う時には必ずこのパスフレーズが必要になるんで注意。Apache 立ち上げる時にも聞かれるんで、PC起動時にはコンソールに貼り付く必要アリ。“-des3”付けないと暗号化されないんでそんな必要はなくなるけど、証明書と対になるRSAキーを取られるだけでその証明書を誰でも使えるようになる。(あんまりお薦めできない)
% openssl req -new -key hogehoge.key -out hogehoge.csrなんか英語で質問されるんで適当に答えること。質問と典型的な答えは以下の通り。
mkdir /usr/local/apache2/conf/ssl.crt mkdir /usr/local/apache2/conf/ssl.key
cp hogehoge.key /usr/local/apache2/conf/ssl.key/
cat > /usr/local/apache2/conf/ssl.crt/hogehoge.crt (ターミナルに CRT をコピペ) -----BEGIN CERTIFICATE----- MIID/zCCAuegAwIBAgIEAIW1CTANBgkqhkiG9w0BAQQFADCBozELMAkGA1UEBhMC (中略) yMtv+gZCk8O1DI6x9jXI44axqw== -----END CERTIFICATE-----
/usr/local/apache2/bin/apachectl startssl(start じゃなくて、startssl)ここで、鍵を作ったときに設定したパスフレーズを入力。パスフレーズがあっていれば起動する。
で。これは一応試験サービスという位置付けらしく、年間35ドルの格安コースが主力商品らしい。手順は同一でクレジットカード関係の入力欄が増えているだけ。(03/05/25時点では“Order NOW!”のボタンが見つからなくなっている)
2chで使われているトリップ(ひとりキャップ)は、投稿前でも事前に知ることができます。名前欄中の「#」文字以降を次の Perl スクリプトに通しましょう。
#!perl -w
# 2chtrip.pl
die( sprintf "usage: %s <tripkey>\n", __FILE__ ) unless @ARGV;
my $tripkey = $ARGV[0];
my $salt = substr substr( $tripkey, 1, 2 ) . "H.", 0, 2;
$salt =~ tr{:;<=>?\@[\\]^_`}{ABCDEFGabcdef};
$salt =~ s{[^./0-9A-Za-z]}{.}g;
my $trip = substr crypt( $tripkey, $salt ), -10;
printf "◆%s", $trip;
1;
__END__
2ch の cript 関数は 56bitDES です。MD5 で実装されてたら当然結果は違います。
実際にこれを他の CGIに実装する場合は、名前中の「◆」は「◇」に置換するといった偽称対策が要ります。むしろ表示の際に「◆」の代わりに「#」を使ったほうが簡単でしょうね。トリップキーを取り出す時点で「#」は名前中から既に取り除かれてるはずですから。
ついでに、2ch の ID表示はこんな感じ。
use Digest::MD5;
use Digest::MD5 qw(md5_hex);
sub get_2ch_id {
my $bbskey = shift;
my $rand = shift;
my $ip = $ENV{'REMOTE_HOST'};
my $day = ( localtime )[3];
my $md5 = Digest::MD5->new();
my $ipmd5 = substr( md5_hex( $ip ), -4 );
$md5 -> add( $ipmd5 );
$md5 -> add( $bbs );
$md5 -> add( $day );
$md5 -> add( $rand );
my $id = substr( $md5->b64digest, 0, 8 );
return $id;
}
# printf "ID:%s", &get_2ch_id( 'bbskey', 'rand' );
#
# bbskey は板の名前
# rand は /dev/rand から読み出した16バイトの乱数文字列
# ただし ( localtime )[3] の値がおなじ間は変化しない(再利用する)こと。