電子署名の使用法

2008/09/02 未分類 spok

サンプルコード qd_send_mail型

Qdmailでは、S/MIME署名することができるのは、SMTP送信の場合のみです。
$param には、smtpの設定データが入っているものとします。
なお、サンプルのためパスワードをスクリプトに直接入れる形になっていますが、このパスワードは秘密鍵を守る重要なものです。ユーザーの責任において、厳重に管理する必要があります。

pfx形式

$option = array(
	'type'=>'text',
	'option'=>array(
		'sign'=>'s/mime',
		'certificateFilePath'=>'/usr/local/username/cert',
		'certificateTempPath'=>'/usr/local/username/cert/temp',
		'certificateFile'=>'cert_spok.pfx',
		'certificatePass'=>'your_password',
	),
	'smtp'=>$param,
);

$to = array('address@example.com','宛先日本語');
$body = <<<EOF
S/MIMEのテストです。
S/MIMEはメール全体を包んで、ハッシュ値(SHA1)を取り、それを秘密鍵で暗号化し、
さらに公開鍵といっしょにして送信するものです。
受け取ったメーラーは、独自に内容のハッシュ値を取り、公開鍵で解読したハッシュ値と比較します。
これが一致していれば、メールの内容は改ざんされていないことになります。

EOF;

$from = array('from@example','スポック');

qd_send_mail($option , $to , 'S/MIMEテスト' , $body ,  $from , 'test.jpg' );
certificateFilePath
certificateFilePathは、署名ファイルが置いてあるディレクトリです。
デフォルト(指定しない場合)では、windows環境の時(PHP_OSがWINの時)は、c:¥cert 、ウィンドウズ以外の時は、/user/local/cert となります。最後に、スラッシュ、バックスラッシュは付けないでください。
certificateTempPath
certificateTempPathは、署名ルーチンが使用するtempディレクトリです。
デフォルト(指定しない場合)では、windows環境の時(PHP_OSがWINの時)は、c:¥temp 、ウィンドウズ以外の時は、/tmp となります。最後に、スラッシュ、バックスラッシュは付けないでください。
注意点
相対パス指定にすると、apacheからみたルートディレクトリがカレントディレクトリとされて、意図と違うディレクトリを参照することになりますので、絶対パスで指定するのが無難です。

Tips!
例えば開発環境winと運用環境unixで、署名ディレクトリが異なる場合があるかと思います。その場合は、ソースコードの、$certificate_file_path_win と $certificate_file_path_unix の定義部分をそれぞれの環境に合わせて書き換えておけば、アプリケーションでパスを切り替える必要がありません。

署名ファイルディレクトリ省略型
署名ファイルディレクトリが初期設定のままでいい場合は下記のように省略できます。
$option = array(
	'type'=>'text',
	'option'=>array(
		'sign'=>'s/mime',
		'certificateFile'=>'cert_spok.pfx',
		'certificatePass'=>'your_password',
	),
	'smtp'=>$param,
);

ファイル.pem形式

署名が.pfx形式ではなく、.pem方式の場合は以下のように指定します。
.pem方式は、秘密鍵が平分で保存されています。.pemファイル自体の管理を十分に気をつけて下さい。

$option = array(
	'type'=>'text',
	'option'=>array(
		'sign'=>'s/mime',
		'certificateFilePath'=>'/usr/local/username/cert',
		'certificateTempPath'=>'/usr/local/username/cert/temp',
		'certificateFile'=>'cert_spok.pem',
		'privateKeyFile'=>'private_spok.pem',
	),
	'smtp'=>$param,
);
なお、デフォルトは、pem形式であり、何も指定しない場合は、 cert.pem , private.pem がデフォルトファイル名になります。

注意!

証明書ファイルから抽出される秘密鍵は、外部に漏らしてはいけないものです。抽出時のパスワードは必ず設定してください。また、pem形式の場合は、パスワード保護がきかない場合もあるので、certificateFilePathは、外部からアクセスできないディレクトリを指定することを強く推奨します。
また、tempディレクトリも外部からアクセスできないディレクトリを指定してください。

電子署名(S/MIME)

2008/09/02 未分類 spok
Qdmail 1.0.9bからは、電子署名ができます。これにより、よりセキュアなメールをQdmailから送信することができます。(なお、これは暗号化ではなく、署名です。)
1.0.9b現在は、S/MIME方式のみをサポートしています。

なお、この機能を使用するには、OpenSSLモジュールがPHPに組み込まれている必要があります。
また、現状では、SMTP送信でないと正しく送信できません。

電子署名でできること

  • メール本文が経路途中で改ざんされていないことを保証する(本文のみです。ヘッダーは対象外。)
  • 「あなたが」署名したメールであると証明できる(ただし、オレオレ証明書でないことが条件です。)
  • テキストメールだけでなく、HTMLメール、添付ファイルがあっても、その改ざんがないことを保証でききる
例)
三井住友銀行、東京三菱銀行などは、顧客に送るメールすべてにS/MIME方式による電子署名をしています。これにより、フィッシング詐欺などのリスクを減らしています。

条件

貴方(貴社)が、権威ある認証機関から正当な公開鍵証明書をもらっている必要があります。
といっても、制限付きながら私が無料でもらえるぐらいですから、理解さえすればそんなにハードルは高くありません。
商用で使う場合は、ベリサインなどの会社から有償で証明書を購入するのがよいでしょう。