電子署名(MIMEの実処理)

 MIMEとはデータの小包や内容物に付加して複数の種類のデータをひとまとめにするための「インデックス」だと前回書きました。

 商取引に関するデータなどには「電子署名」と「見積書」などテキスト以外のデータが同時に送受信されることが多々あります。つまり、電子署名を含み、かつマルチパートのデータを送受信することになります。

 電子署名を含み、かつマルチパートのデータの送受信というと二重にややこしいように思えますがそんなことはありません。電子署名はテキストデータなので、通常のマルチパートのデータを送受信するのと何も変わらず扱うことができます。ただ、電子署名がダイジェストを生成する範囲が明示されるという違いのみです。

 ここで、いまいちど、MIME mutipartデータのやりとりについておさらいしてみます。

1. メールの場合(POP/SMTP/IMAP)

 電子メールはヘッダー(メールの配送情報など)とボディー(メール本文)から構成される下記に示すような複雑なテキストデータであり、これをメーラー(メールを表示するソフトウェア)がPOPやIMAPで受け取って我々が普段見ている状態で表示します。メール本文に「テキスト」と「画像」のように複数の要素が含まれる場合、ボディーはMIME multipartのフォーマットに準拠してテキストで記載されます。画像もBase64エンコードされたテキスト形式で記述されます。

 このMIME multipartフォーマットのデータは送信側のメーラーで自動生成され、受信側のメーラーで自動解読されるので我々は普段は特にこのフォーマットでデータを生成するコードを書く必要はありません。もし手作業で生成・解読したい場合はmb_encode_mimeheaderなどの関数を使って実装することはできますが、実際にそのような必要性に遭遇することはほぼないでしょう。

 なお、テキストへの電子署名の項目でも述べましたが、メールの文面に対して電子署名を生成する場合にも「どこからどこまでを対象に電子署名を生成したか」でダイジェスト値が変わってしまうという微妙な問題があります。ですので、メールの電子署名生成には「S/MIME(Secure/Multipurpose Internet Mail Extensions)」という方式で「どこからどこまで」を明確にした状態で電子署名が生成され、送信するデータの中に署名が込められます。

(例)テキストと添付ファイルを含むメールデータの生データ:

 上記のメールデータがメーラーに表示されると下記のようになります。つまり、メールに含まれるMIME multipartデータのデコード処理はサーバーでではなくメーラーというメールクライアントが行うため、基本的にサーバーでMIME multipartデータのデコード処理をする必要性はほとんどありません。

テキストと添付ファイルを含むメール(上記の生データをメーラーで見た状態):

2. POSTの場合(HTTP)

 メールのMIME multipartデータのハンドリングはメーラーが処理してくれますが、ではHTTP通信で送受信する場合はどうしたら良いでしょうか?

ケース1: ブラウザからサーバーへマルチパートのデータを送受信する

 ブラウザからサーバーにマルチパートのデータを送受信する場合はHTMLのフォームを用いてPOST送信を行うことがほとんどだと思います、その際、複数のパラメータをPOSTするには単純なHTMLで下記のように書けます。

 下記のようにgetallheaders()で取得されたヘッダー情報(マルチパートであることを示すContent-Typeもデータの境目を示すboundaryも自動的に付加されている)

 POSTされたファイルの情報は$_FILESに格納されている。

 POSTされたパラメータ(文字列)の情報は$_REQUESTに格納されている。

ケース2: サーバー間でマルチパートのデータを送受信する

 サーバー間でマルチパートのデータを送受信する場合も特に難しいことはありません。よくある方法としては下記のようにcUrlで複数のパラメータを要素として持つ配列をPOSTしてあげれば良いだけです。

 画像の送り方ですが、「@」に「/usr/tmp/image_2.jpg」のようなパスを記述してファイルのまま送ることも可能で、この場合は受信側の$_FILESにファイルの情報が格納されます。また、ファイルをBase64エンコードしたテキストとして送ることも可能であり、その場合は受信側の$_REQUESTにファイル自体が格納されます。


 普段何気なく使っているブラウザやウェブサーバにはたくさんの処理機能があらかじめ含まれていてありがたいですね。

0
Would love your thoughts, please comment.x
()
x