SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-01-08(Mon) 続・Maveでデジタル署名付きメールを検証する

  先日、改めて「Maverick」に移行したのだが、早速新しいメールを読み出さなくなってしまっていた。OSサポートという仕事柄、何か障害が起こると、瞬時に頭の中に思い当たる点がリストアップされてしまう性分である。そして案の定、リフレッシュトークンの期限切れであった。アクセストークンの有効期限は1時間だが、リフレッシュトークンの有効期限は7日間らしい。むー、そういうのヤメようよ。

  結局、自分で先日の記事を読み返し、リフレッシュトークンを再発行して対処したが、週に一度くらいなら我慢するかなぁ。それとも、もう少し手順を簡略化できる方法もありそうなので、来週までにそれをやってみるかな。また、面白そうな課題が出てきたな。他に取り組みたい課題もあるのだけれどな。ウキウキ。

  そういう一方で、また気になる点を見つけてしまった。署名付きメールの署名が検証できなかった(署名が不正である)という「?」マークが出ている。どちらも銀行のメールだ。

.. 300 住信SBIネット銀  Fri, 29 Dec 20:01   9K w? +出金のお知らせ
.. 650 service@smbctb.c Sat, 14 Oct 17:18  11K .? +SMBC信託銀行 カードご利用のお知らせ

  先日、Maveでデジタル署名付きメールを検証する機能はガッチリと作ったはずなのだが、何がおかしいのだろうか。検証をやりなおす手順を実行してみると「送信元が署名者と一致していない」というエラーが出た。

Digital Signature is NOT Valid. reason=[Sender does not match Signer.]

  まったくしょーがないなー、などと呟きつつ原因調査に取り組み始める自分である。ウキウキ。早速、署名の検証部分の処理を抜き出して現象を再現してみる。

require 'openssl'
mail = 'xxxxxxxx.eml'
pkcs7 = OpenSSL::PKCS7.read_smime(open(mail).read)
pkcs7.certificates.each {|cert|
    print(cert.to_text)
    puts('-' * 80)
    cert.subject.to_a.each {|name|
        name[0] == 'emailAddress' and p ['emailAddress', name[1]]
    }
    puts('=' * 80)
}

  以下のような結果が得られた。

$ ./smime_dec.rb
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            3f:07:9c:34:1b:03:0c:e0:bd:b0:42:f1:93:43:b2:a4:17:30:b1:50
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, O=Cybertrust Japan Co., Ltd., CN=Cybertrust Japan SureMail CA G4
        Validity
            Not Before: May 15 07:55:52 2023 GMT
            Not After : Jun  9 07:55:16 2024 GMT
        Subject: C=JP, ST=Tokyo, L=Minato-ku, O=SBI Sumishin Net Bank, Ltd.,, OU=System Department02, CN=SBI Sumishin Net Bank post_master
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Certificate Policies: 
                Policy: 1.2.392.200081.1.24.1
                  CPS: https://www.cybertrust.ne.jp/ssl/repository/index.html
            X509v3 Subject Alternative Name: 
                email:post_master@netbk.co.jp
            Authority Information Access: 
                CA Issuers - URI:http://crl.cybertrust.ne.jp/SureMail/smcag4/smcag4.crt
--------------------------------------------------------------------------------
================================================================================

  やはり、メールアドレスが検出されない。と、思ったら「SubjectAlternative Name」というところに入っているようだ。

            X509v3 Subject Alternative Name: 
                email:post_master@netbk.co.jp

  SBI銀行だけでなく、SMBC銀行も同様だった。

            X509v3 Subject Alternative Name: 
                email:service@smbctb.co.jp

  オレオレ証明書は「SubjectのemailAddress」の側にだけ入っている。

        Subject: C=JP, ST=Aichi, L=Nagoya, O=ITLine Inc., CN=Furutanian/emailAddress=furutanian@itline.jp

  が、会社から支給されている証明書は両方に入っているので、どっちも間違いというわけではなさそうだ。

        Subject: C=JP, ST=Tokyo, L=Minato, O=xxx, OU=xxx/emailAddress=xxxxxx@xxx.xxx
            X509v3 Subject Alternative Name: 
                email:xxxxxx@xxx.xxx, othername:<unsupported>

  よくわからんが、両方に対応しときゃいいだろう。やや雑だが以下のコードを追加した。

            begin
                pkcs7 = OpenSSL::PKCS7.read_smime(File.open(path).read)
                addrs = []; pkcs7.certificates.each {|cert|
+                   cert.extensions.each {|ext|
+                       ext.to_h['oid'] == 'subjectAltName' and ext.to_h['value'] =~ /mail:([^,]+)/ and addrs << $1
+                   }
                    cert.subject.to_a.each {|name|
                        name[0] == 'emailAddress' and addrs << name[1]
                    }

  改めて、検証をやりなおす手順を実行してみると「Message is Signed.」と表示され、「?」マークが「C」マークに変わった。

.. 300 住信SBIネット銀  Fri, 29 Dec 20:01   9K wC +出金のお知らせ
.. 650 service@smbctb.c Sat, 14 Oct 17:18  11K .C +SMBC信託銀行 カードご利用のお知らせ

  と、いうわけで、今回の盆栽の剪定作業はこれにて完了である。