ようこそゲストさん

CPA-LABテクニカル

2008/09/04(木) 電子署名ではまったopenssl_pkcs7_sign。また改行コードかよ。

PHPのopenssl_pkcs7_signでS/MIMEの電子署名をして、送信したところ、OoutlookExpressでは、「メッセージが改ざんされています。」のエラーがでた。
秀丸メールや、Beckeyではエラーが出ない。なんでやねん。とかなり長考。

そこで、OutlookExpressから電子署名付きで送ったメールと、openssl_pkcs7_signで作成したメールの中身を比べてみた。
様々な違いがあったのだが、結局、原因は、以下のとおり。
メッセージ本文の最後の行に改行がついているかいないか
だった。(PHP4.2.5)
つまり、openssl_pkcs7_signは悪くない(この場合は)。
ただ、openssl_pkcs7_signに突っ込んだメール本文の最後に改行がない場合、OutlookExpressでは、メッセージの検証ができないようだ。

よくみるとPHPマニュアルにつぎの記述があった。
It's probably worth noting that I had a great deal of difficulty getting either Mozilla 1.4 or Outlook Express 6 to verify signatures generated by openssl_pkcs7_sign() until I added a newline (\n) to the beginning of the message I was signing. Not sure why that is, but as soon as I made that change all problems disappeared.
openssl_pkcs7_sign-PHPマニュアル

実はこれは読んでいたのだけど、私の英語力が弱く、the beginning of the message I was signingのことを、「サインした文章、つまり本文の先頭に改行を付けたらうまくいく」と解釈し、本文の先頭につけてみたのだけれど何も変化なく、???の状態だった。
今でも自信がないけれど、これは署名の最初に改行を付けろ、という意味のようだ。うう、どうせなら、本文の最後に改行を入れろ、と書いて欲しかった。。。。

PHPとメールの相性の悪さ

PHPは、UNIX文化で育っているため、改行コードがLFのみで考えられていることが多い。
openssl_pkcs7_signが改めてつける改行コードは皆、LFだ。
メッセージ本文はCRLFで渡しても、だ。
そして、インターネットメールの標準は、CRLF。
これだから、様々な文字化けやら、不具合が起きることが多い。
ああ、今回も改行コードひとつで何日無駄にしたことか。。。。
お願いだから、オプションで改行コードを選ばせてくれ。


それにしてもインターネット文化はUNIX系列の人達が培ってきたものなのに、どうして改行コードはこうなっちゃったのでしょうね。

そしてQdmailは、、、

S/MIME対応したのはいいけれど、改行コードがLFとCRLFで入り乱れたものになってしまい、ううう、大変気持ち悪い(S/MIMEにしない限り気持ち悪いことはないです。)

まもなく、S/MIME署名対応バージョンをリリースできると思います。現在、いくつかテスト中。

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/0178/tb/