e-Govで電子申請(一括申請)するためのプログラム作成に関する覚書
This item was created at 2010/11/21 00:00:00
e-GovユーザーのTakashi.Uです。
今年からe-Gov(電子申請)で一括申請が始まりました。複数の届出をまとめて一括で届けることが出来るという便利なサービスですが、通常の電子申請のようにブラウザ上で操作して行うのではなく、対応アプリ(様々専門アプリがあるようです)を使用しなければならず、若干残念なことになっています。
この度、残念な状況を打破すべく重い腰を上げてe-Gov一括申請をすることにしました。島根県民・松江市民なので当然にRubyを使ってということになります。躓いたり、理解するのに時間がかかったりしたところがあったので、覚書としてこのエントリーに記したいと思います。
『仕様公開 | e-Gov電子申請システム一括申請について』
http://shinsei.e-gov.go.jp/menu/interface/
仕様や電子証明書のサンプルが配布されています。こちらの仕様書に基づいてプログラムを作成します。
で、肝心な覚書ですが、次のことを列挙しておきたいと思います。
- RubyとOpenSSLでの署名について
- XMLの正規化について
RubyとOpenSSLでの署名について
Ruby(1.9.2)とOpenSSLで電子署名をするわけですが、opensslライブラリを使用するとすごく簡単に署名できます。ちなみにWindowsなのでRuby Installerを使わせていただいています。簡単に導入できてすごく良いです!
Ruby Installer
http://rubyforge.org/projects/rubyinstaller/
署名のコードですがこんな感じです。
require 'openssl' require 'base64' digester = OpenSSL::Digest::SHA1.new pkcs12 = OpenSSL::PKCS12.new(File.open(key),password) sig = Base64.encode64(pkcs12.key.sign(digester,str))
こんな感じであっさりと署名ができちゃいます。簡単ですね。
変数は次のものを想定しています。
- key → .p12ファイル
- password → 上記鍵のパスワード
- str → 署名したい文字列
仕様書にあるX509Certificate要素は次のコードで求めることができます。
cer = Base64.encode64(pkcs12.certificate.to_der)
これまた簡単です。
XMLの正規化について
XMLの正規化を行う必要があります。XMLの正規化に関することは検索すればたくさん出てきます。
今回は、XMLを自分でイチから作らなければならなかったことと、RubyではXML正規化ライブラリを見つけられなかったことから、自分で作るXMLを正規化された状態にしておくという方針でいきました。
その際、特に注意しなければならなかったこと(嵌ったこと)は名前空間が継承されることです。不勉強なので知りませんでした。
【参考】Place Under Glacier: canonicalization and xml:id
http://veritas-vos-liberabit.com/mt/archives/2004/06/canonicalizatio.html
具体的には、次のXML(一部)があったとします。
<Signature xmlns="http://www.w3.org/…" Id="…">
<SignedInfo>
…
e-Govの仕様書によれば、署名対象はSignedInfoエレメントになります。しかし、そのまま署名してはダメです。名前空間の部分を継承しなければなりません。(もちろん、他の正規化要件も満たす必要があります。)
というわけで、署名対象のSignedInfoエレメントは次のようになります。
<SignedInfo xmlns="http://www.w3.org/…"> …
これで、e-Govのシステムのチェックを通すことが出来ました。めでたしめでたし。


