カテゴリ: プログラミング, API, C/C++, Javascript/Java, PHP, CakePHP, WSH/VBScript

ページ: 1 2 3 4 5 6 7 8 9 10 11 ... 16 >>

S/MIME 暗号化メール送信コンポーネント for CakePHP

パーマリンク 2010/06/05 23:00:00 著者: kumaold メール
カテゴリ: プログラミング, PHP, CakePHP

前回、S/MIME 暗号化メール送信の概要と下準備について書きました。
このメールをPHPから送信してみるのが今回の目的です。

ところが・・・いくら探しても公式の openssl_pkcs7_encrypt() サンプルソースを使ったページしか見つかりません。
そんなに新しい技術でもないのに、実際にやってみる人が少ないのでしょうか。


仕方ないのでドキュメントを読み進めながらクラスを自作することにしましたよ。

特に添付ファイルを取り扱ったS/MIME暗号化メールは参考資料がまったくなく、どうしようもないので実際のメールのソースと比較しながら書きました。


10時間ほど頑張った結果、それなりのものができたのでひとつ公開します。
CakePHP のコンポーネントですが、手を加えれば他にも流用できると思います。

DL: EncryptMailComponent (ZIP/1.45KB)


まず、解凍したファイルを cakephp/app/controllers/components/ に設置。
利用するコントローラ内のコンポーネントに以下を追加。

var $components = array ('EncryptMail');

コントローラ内では必要に応じてこのように記述します。
添付ファイルも複数送信が可能です。

// 本文(テキスト)を記述
$body = 'テストメール' . "\n";
$body .= 'こちらが本文' . "\n";

// 添付ファイルを (ファイル名 => データ) の配列で指定
$attach = array(
    '日本語ファイル名.txt' => 'テスト添付データ',
);

// 追加のメールヘッダ
$add_headers = array(
    'From' => 'from@example.com');
);

// 公開鍵証明書のパス
$this->EncryptMail->key_path = TMP . 'mail/key.pem';
// 平文メッセージの仮保存パス (パーミッション606)
$this->EncryptMail->msg_path = TMP . 'mail/msg.txt';
// 暗号メッセージの仮保存パス (パーミッション606)
$this->EncryptMail->enc_path = TMP . 'mail/enc.txt';
$this->EncryptMail->body = $body;
$this->EncryptMail->attach = $attach;  // 省略可
$this->EncryptMail->to = 'to@example.com';
$this->EncryptMail->subject = 'S/MIME 送信テスト';
$this->EncryptMail->add_headers = $add_headers;  // 省略可
// メール送信成功時 true
if ($this->EncryptMail->send()) {
    echo "送信成功\n";
} else {
    echo "送信失敗\n";
}

最初は公開するつもりがなかったので一部適当な作りのところがありますが、どうぞご自由に改良などしていただいて結構です。
 

今夜わかるメールプロトコル (Network)今夜わかるメールプロトコル (Network)

翔泳社 2005-06-17
売り上げランキング : 49886
おすすめ平均

S/MIMEによるメール暗号化

パーマリンク 2010/06/04 23:59:00 著者: kumaold メール
カテゴリ: プログラミング, PHP

超久々にまともなPHP技術ネタでお送りします。


さて、とある案件を片付けるのに個人情報などを扱うため、データ添付メールを暗号化して送信する必要が出てきました。

ただのファイル暗号化なら割と簡単ですが、今回はS/MIMEによる公開鍵暗号で受信者を限定とすることで強固なセキュリティが確保できます。


そこでまず必要になるのが公開鍵証明書です。
本来ならベリサインなどの信頼あるCAによる署名がなされたものの方ががいいですが、無料で取得できるのもいくつかあります。

たとえば、こちらCOMODO社の Free Secure Email Certificates など。

申請フォームから必要事項を記入後にメールが送られてきます。
メール記載のURLにアクセスし、確認のメッセージで許可するとブラウザに個人用証明書がインストールされます。

証明書の確認方法は、Firefox では「ツール」→「オプション」→「詳細」→「暗号化」→「証明書を表示」→「あなたの証明書」→「表示」でこうなればOK。

見てのとおり有効期限は1年間のため、都度更新が必要です。

この「詳細」タブにある「エクスポート」で暗号化に必要な公開鍵証明書のみを抽出保存しておきます。保存形式は X.509証明書(*.PEM) です。

IEや他社メーラなど他のソフトでも使用できるよう、証明書一覧の「バックアップ」より一旦秘密鍵を含むPKSC12ファイル(*.p12)に一緒に出力しておきましょう。


X.509証明書の方はメール送信者に配布し、証明書に記載のメールアドレス宛に送るメールの暗号化に使用されます。

PKSC12ファイルはさらに秘密鍵を含むファイルで、メールの復号化に使用されるため厳重に管理する必要があります。メール受信PCにインストールします。


先ほどエクスポートしたPKSC12ファイルをIEにインポートすることで、Outlook Express では自動的に暗号化メールが送信できます。

メールの新規作成画面で右上にある「暗号化」ボタンを押すだけで、そのメールの内容は暗号化して送信されます。

暗号化メールを受信するとこのようにその旨のメッセージが表示されます。


ちなみに秘密鍵を保持していない人が受信するとこうなります。
ソースを見るとヘッダ文字列以外はすべて暗号化されてまったく見えません。


ということで、これがS/MIMEによるメール暗号化の概要です。
ここまでは実践されている方も多く、いろいろと参考にさせていただきました。

これをPHPでやってみようというのが今回の本題です。
詳しいことは次回の投稿で。

4883731669インターネット暗号化技術―PKI、RSA、SSL、S/MIME、etc.
ソフトリサーチセンター 2002-05
売り上げランキング : 540463
おすすめ平均

type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

住所抽出ライブラリを試してみる

パーマリンク 2010/03/19 20:16:09 著者: kumaold メール
カテゴリ: サーバ関係, プログラミング, PHP

新しい仕事の案件を片付けるのに、何かしらの方法で文章中から住所らしいものを抜き出すという処理が必要になり、どう実装しようか悩んでおりました。

そんなときに、Perl にあるライブラリの Geography::AddressExtract::Japan がすごいという記事を読み、試してみることにしました。

cotalog - Geography::AddressExtract::Japan を使って住所抽出


といったものの、普段 PHP 使いが Perl を使うはずもなく、このライブラリのインストールには苦労しました。

こちらのページが非常に参考になります。(ちょうどCentOS 5環境なので)

M.C.P.C. - Geography::AddressExtract::JapanをCentOS4に入れる

Perl は入っているものとして、はじめに Subversion のインストール

[root@kuma ~]# yum install subversion

CPAN(要初期設定)にて inc::Module::Install をインストール

途中で yes/no を聞いてくるところは、関連モジュールをインストールするかなので、基本的にはそのまま Enter キーでおk。

[root@kuma ~]# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install inc::Module::Install

最初から入れるとかなり時間がかかるが気長に20分くらい放置。
おわったら CPAN からは exit で一旦抜けます。

つぎに、適当なディレクトリを作成し、Subversion にてリポジトリをローカルに落としてきます。

[kuma@kuma ~]# mkdir tmp
[kuma@kuma tmp]# cd tmp
[kuma@kuma tmp]# svn checkout http://svn.coderepos.org/share/lang/perl/Geography-AddressExtract-Japan
[kuma@kuma tmp]# cd Geography-AddressExtract-Japan/trunk

このままビルド、といいたいところですが、perl Makefile.PL でエラーと怒られて続行することができません。

まずは Makefile.PL の7行目をコメントアウトします。

[kuma@kuma trunk]# vi Makefile.PL
build_requires(Test::More => 0.42);

# build_requires(Test::More => 0.42);

これでおそらく止まることなく Makefile.PL が実行できます

[kuma@kuma trunk]# perl Makefile.PL
[kuma@kuma trunk]# make
[kuma@kuma trunk]# make test

するとここでまたまたエラーが出て止まりました。
今度はライブラリが足りなかったようです。

エラーが発生した部分のソースを見て、この2つを追加で入れておきます。

UNIVERSAL::require
Class::Accessor::Fast

make test をすると、サンプルのプログラムが走ります。
それが確認できたら root に切り替えて make install で完了。

[kuma@kuma trunk]# su -
[root@kuma trunk]# make install

これで導入作業はすべて完了しました。

サンプルプログラム

#!/usr/local/bin/perl

use strict;
use Geography::AddressExtract::Japan;
use open ":encoding(utf8)";
use encoding "utf8", STDIN => "utf8", STDOUT => "utf8";

my $addr = <STDIN>;
my $t = Geography::AddressExtract::Japan->extract($addr);

print map { $_->{"city"} . $_->{"aza"} . $_->{"number"} . "
"; }@{$t};

これでコマンドラインからこのようにすることで、住所抽出ができます。

perl ./try.pl<<EOF
ここに住所・地名を含む文章を流し込む
EOF


Web ベースでのサンプルを作ってみました。
Geography::AddressExtract::Japan - Perl/PHPテスト

 

初めてのPerl 第5版初めてのPerl 第5版
近藤 嘉雪

オライリージャパン 2009-10-26
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

1 2 3 4 5 6 7 8 9 10 11 ... 16 >>

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年4月
 << <   > >>
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

検索

XMLフィード

16ブログ     powered by b2evolution free blog software