自堕落な技術者の日記

自称テレビっ子。ほとんど飲んでるか喰ってるかですが、タマに(趣味の)PKI・SSL・署名・認証・プログラミングの話があったり無かったり

Windowsルート証明書の更新プログラム(2009.09)の続き

随分前のブログにWindowsルート証明書更新プログラムの事を書いたわけですが、iPhoneのルートってどうなんだろうと思って調べているうちに、そもそも、このWindowsのプログラムで登録されているCAの数っていくつなんだろうと思ったわけです。

WindowsのCAのまともな資料はこれになります(PDF)。

一つ一つ数え上げるのも大変なので、一旦PDFをテキストに変換してハッシュアルゴリズムでカウントすることにしました。










署名のハッシュアルゴリズム
MD211
MD541
SHA1231
SHA21
SHA25615
SHA3844
総数303


というわけでWindowsルート認証機関として登録されている認証局の総数は303なようです。

では、iPhone (3.0 or 3.1)はというと331みたいです。30も増えちゃってますね。どんなとこが増えているのか機会があったら紹介したいと思います。

ではでは

PythonのGoogle Calendar Data APIを使ってみた

自分のオフィスでは、社員共通のスケジュール管理はサイボウズOffice6を使っています。利用者のコメントなんか見ていると他の製品やサービスとの連携は難が多いようです。

最近、iPhoneを手に入れまして、スケジュール管理は「さいすけ」が評判がいいようなので、基本的には無料アプリばっかりで通していたんですが、これだけは買ってしまいました。
さいすけ

さいすけはGoogleカレンダーと同期ができて、iPhoneでちまちまスケジュール入力するよりも、パソコンでGoogleカレンダーに入力する方が大量にスケジュール入力するときは楽です。

さて、これらのスケジュールの同期を取る場合、

  • サイボウズはスケジュールをCSVテキスト形式でインポート、エクスポートできる。

  • GoogleカレンダーはRFCにもなっているiCalendar形式でインポート、エクスポートできる。

  • さいすけはGoogleカレンダーとボタン一つで同期できる。


ということで何とか同期はできそうです。

ツールとしてはogawaさんのcybozu2icalというオープンソースがあるんですが、自分のcygwin環境ではうまくインストールすることができませんでした。

仕方なく、とりあえず以下の3つのスクリプトを作りました。

サイボウズのスケジュールのCSVエクスポート
サイボウズのスケジュールのエクスポートをブラウザからでなくコマンドラインから行えるようにしたスクリプト。開始月と期間の指定ができる。
csvの差分ファイル作成ツール
サイボウズのスケジュールをCSVでエクスポートした際、同じ期間で古いのと新しいのとを比較して、追加になったイベントのCSV、削除になったイベントのCSVを生成するスクリプト
サイボウズのCSVからGoogleのiCalendarに変換する
サイボウズのCSV形式のファイルからGoogleカレンダーでインポートできるiCalendar形式に変換するツール

両方ともPerlのText::CSV_XSモジュールを使った簡単なものです。

これで、サイボウズに新規に登録されたものだけを、Googleカレンダーにインポートして登録するところまではでき、さいすけとも同期が取れました。

でも、サイボウズでキャンセルになったスケジュールをGoogleカレンダーで削除するところは標準機能だけではダメなようです。

仕方なく調べてみると、Google Calendar Data APIというのがあって、カレンダーなんかも操作でき、Java、.NET、Python、PHP、Objective-C、JavaScriptなど様々な言語をサポートしていることがわかりました。

自分としてはキャンセルされたスケジュールの削除だけが、とりあえずできればよいので、簡単そうなPythonを使ってみることにしました。

ここからgdata-2.0.5.zipというPythonのライブラリを落とします。

Python 2.2以上に対応しているそうで、cygwinでは2.5.2だったので問題ありませんでした。インストールは以下で終わりです。

% unzip gdata-2.0.5.zip
% cd gdata-2.0.5
% ./setup.py install


さて、簡単なところからGoogleカレンダーの登録されているイベントを表示するようなサンプルを動かしてみようと、一覧表示部分を抜き出して実行しましたがダメでした。

#!/usr/bin/python
import gdata.calendar.service
client = gdata.calendar.service.CalendarService()
client.email = 'あなたのアドレス@gmail.com'
client.password = 'パスワード'
client.source = 'Google-Calendar_Python_Sample-1.0'
client.ProgrammaticLogin()
feed = client.GetOwnCalendarsFeed()
for i, an_event in enumerate(feed.entry):
 print '\t%s. %s' % (i, an_event.title.text,)
 for p, a_participant in enumerate(an_event.who):
  print '\t\t%s. %s' % (p, a_participant.email,)
  print '\t\t\t%s' % (a_participant.name,)
  print '\t\t\t%s' % (a_participant.attendee_status.value,)


AttributeError: 'CalendarListEntry' object has no attribute 'who'


動かないサンプルなんか入れとくな〜〜〜っ!!!と怒りの気持ちをおさえつつ、queryなら動くようなのでちょっと手直しして

#!/usr/bin/python
# coding: cp932
import gdata.calendar.service
client = gdata.calendar.service.CalendarService()
client.email = 'あなたのGmailアドレス'
client.password = 'パスワード'
client.source = 'Google-Calendar_Python_Sample-1.0'
client.ProgrammaticLogin()

query = gdata.calendar.service.CalendarEventQuery('あなたのGmailアドレス', 'private', 'full')
query.max_results = 50

feed = client.CalendarQuery(query)
for i, an_event in enumerate(feed.entry):
 title_u8 = an_event.title.text
 title = unicode(title_u8, 'utf-8').encode('cp932', 'replace')
 when = an_event.when
 print '件名: %s' % (title,)
 print '場所: %s' % (an_event.where[0].value_string,)
 print '詳細: %s' % (an_event.content.text,)
 print '日付: %s - %s' % (when[0].start_time, when[0].end_time,)
 print '参照: %s' % (an_event.GetEditLink().href,)
 print ''


実行してみるとカレンダーに登録されたイベントが表示されます。

件名: 仕事始め
場所: None
詳細: None
日付: 2010-01-04 - 2010-01-05
参照: http://www.google.com/calendar/feeds/○×1

件名: PKI定点観測
場所: None
詳細: None
日付: 2010-01-18 - 2010-01-19
参照: http://www.google.com/calendar/feeds/○×1


さて本題のカレンダーのイベントの削除ですが、消したいと思うイベントをクエリや件名などで絞り込んでから、実際に消すにはイベントan_eventに対して以下を実行すればオーケーです。

client.DeleteEvent(an_event.GetEditLink().href)


サイボウズからエクスポートされたCSVに対して、差分生成ツールによりスケジュールの更新によりキャンセルされたイベントのCSVは出てくるので適当に処理して、上のDeleteEventメソッドを実行してやればよいわけです。

APIを勉強した今では、登録も削除もAPI使った方が一貫性があるような気もしますが、とりあえず目的は達成されたので、時間が取れるまではこれで凌ごうと思っています。

ではでは、













連載:PAdES(PDF長期署名)について(第2回) PDF署名とは

前回に引き続き今回はPAdES(PDF長期署名)の解説の第二回目として「PDF署名の拡張であるPAdESを説明する前に、そもそもPDF署名とは」という事について説明してみたいと思います。

以降深堀していくPAdESについて理解できる程度に、なるべく簡単に(できればわかりやすく(^^;)説明していこうと思います。PDF署名については素人なので素人目線になると思いますが、間違いなどあったらコメントでご指摘いただければと思います。

Adobe Acrobat 9を使った署名の生成



PDFファイルの生成に最もよく使われているAdobe Acrobatを使えば、PDFファイルに電子署名をつけることができます。下の画面はAdobe Acrobat 9 Standardで署名される前のPDFファイルを開いてみた例です。ツールバーに署名のボタンがあるのがわかります。
pdfsig01

この署名ボタンを押せば、自分用の証明書と鍵を使って電子署名をつけることができます。

PDFにつけられる署名には見た目で区別して以下の2つの種類の署名があります:
・可視署名:署名したというしるしが文書中に入れられ印刷される署名
・不可視署名:署名したというしるしが印刷上表示されない署名

不可視署名されたPDFファイルをAcrobat Reader 9で開いてみると、こんな感じ。ページの中には署名が付いていることの印はなくドキュメントの上に署名が正しければ水色のツールバーが表示されます。
pdfsig03


可視署名の例はこんな感じ。ドキュメント上の水色のツールバーに加えて右側に署名したという印がついています。
pdfsig02


署名されたPDFファイルが書き換えられていた場合、水色のバーの左側に赤いバツ印がつくので、「あぁ、これは改ざんされているな」とひと目でわかるようになっています。
pdfsig04


PDFファイルの中身



PDFは実は中身はほとんどテキストファイルになっていて、ワードパットなどで見る事ができます。
pdfsig05


PDF署名の仕組み


PDF署名をざっくりと簡単に説明している図が下です。テキストで構成されているPDFのデータの途中に署名を差し込み、これによりPDFの内容を署名で保護します。
pdfsig06


PDFではページなどドキュメントオブジェクトとして扱いますが、署名もまた署名オブジェクトとして扱います。概ね以下のような形式のデータとなっており、署名に関する補足的な情報も含まれています。
18 0 obj <<
 /Type/Sig
 /Filter/Adobe.PPKLite
 /SubFilter/adobe.pkcs7.detached
 /Contents <署名値>
 /ByteRange [署名対象範囲(前開始 前長さ 後開始 後長さ)]
 /ContactInfo(電話連絡先)
 /Location(署名地)
 /M(署名日)
 /Name(署名者名)
 /Reason(署名理由)
 >>
 endobj

/Contentsの署名値の部分はPKCS#1署名(生の公開暗号による署名データ)もしくはS/MIMEメールなどで使われているPKCS#7署名またはCMSと呼ばれるASN.1バイナリ形式の署名データを16進数表現で格納します。

PDFの署名対象範囲(ByteRange)とPKCS#7署名値(Contents)の関係


署名ディクショナリの"/Contents"の値にPKCS#1かPKCS#7の署名フォーマットで署名が格納されているわけですが、どの部分を署名対象としているかを表しているのが"/ByteRange"のプロパティです。

PKCS#7の分離署名(detached署名)をContentsに入れるとして、PKCS#7署名データがどのように設定されるかを図で説明しましょう。
pdgsig_a01

(1)ページデータの最後あたりに署名オブジェクト(/Type/Sig)を入れるとして
(2)事前にPKCS#7署名データのサイズより大きめに領域を確保しておき
(3)ByteRangeを計算し
(4)ByteRangeで指定された2つの範囲を署名対象としてPKCS#7署名を生成
(5)生成されたPKCS#7署名を16進数表現にして/Contentsに設定
という流れになります。

入れられるPKCS#1署名、PKCS#7署名にバリエーションありすぎ


上の図ではPKCS#7を想定して書きましたが、PKCS#1であっても同じようなものです。中に署名を格納する方法に様々なバリエーションがあります。RFC3161ベースのタイムスタンプトークンを格納することもできます。

・生の属性を含まないPKCS#1署名
・署名属性、非署名属性を持たないPKCS#7署名
・署名属性、非署名属性を持つPKCS#7署名orCMS
・署名属性、非署名属性を持つタイムスタンプ付きPKCS#7署名orCMS

署名者(の証明書)の特定がしにくいものもあったりするので、欧州電子署名指令に合うように、署名者の特定をなるべく厳密にできるようにPKCS#7、CMSもしくはCAdES長期署名のプロファイルを定めたのがPAdES(PDF長期署名)ということになります。

さて、今回はPDF署名の中身はPKCS#7もしくはCMS署名フォーマットで、どんなふうに埋められているのかってことが、なんとなくお分かりいただけたでしょうか。

PAdESの入り口に入って行きたいとおもいます。PDF署名で補足したほうがよさそうな事を思い出したら、また書いてみたいと思います。

ではでは、、、

う〜〜ん、ちょっと熱っぽい、、、




参考リンク


PDF署名で参考になりそうなリンクを記しておきます。
・Adobe Acrobat 9 Standard オンラインマニュアル
・アンテナハウス PDF電子署名入門(2008.08.24)
PDF 1.7の仕様は元々Adobe社が作成したものですが、これがISO 32000-1の国際標準にもなっています。Adobeのサイトでダウンロードできますので、仕様の詳しい部分を知りたい場合にはこちらもご覧ください。

小布施蔵 J - Sogga pere et fils

78699e1e.jpg
8d373e37.jpg
0d55f6af.jpg
昨晩は寒かったのでですね。巣鴨でデ協のワーキングがあった後、いつもの店にいきました。飲んだのはこんなの。

・日高見 吟醸
・小布施蔵 J - Sogga pere et fils
 と、熱燗

日高見はスッキリと夏にいいかんじでした。でもう一本が数量限定で入荷したという小布施蔵。長野の小布施ワイナリーで作っている日本酒なんだそうです。ボトルもワインみたいでおしゃれ。味は、なんかくせが無くフルーティーな感じで本当に白ワインっぽい。女性が好きそうな感じでした。

いつものように日本酒の瓶の写真を取らしてもらおうと、持ってきてくれた女性スタッフに「写真撮らしてもらっていいですか?」と聞いたら、自分の写真を撮るのかと勘違いしたらしく、ちょっとポーズとってくれてたのに、瓶を撮りだしたので戸惑ってたそうです。(私は瓶に夢中で気づかなかった)図々しくスタッフさんの写真撮らしてもらえばよかったなぁ、、、トホホ

その後、ちょっと時間も早かったので吉田類おすすめの千成にも行きました。楽しみにしていた自家製梅酒は無くて濁り酒を飲みました。焼きビーフン美味しかったです。Kさん、Mさんはその後緑茶サワーを飲んでいましたが、私はヘロヘロになってしまったので、やめときました。

神保町 肉屋の正直な食堂

8c3c5805.jpg今日は飲んだ翌日だったので、ちょっとおなかが空いてしまい、フライ盛り合わせが食べたいなぁと神保町ムッシュの方に向かってみました。随分歩いたのにう〜〜ん無いみたい。なんでだろ。

仕方なく、(時間も無いので)「肉屋の正直な食堂」で本当は春雨ヌードルみたいなのが食べたかったんだけど券売機の後ろの人のプレッシャーに負けてしまいテキトーに豚肉の韓国風炒めみたいなやつを食べました。

後でグーグルで調べてみたら、ムッシュはいつの間にやら閉店してしまったそうで、跡地には「麺屋33」というラーメン屋になってしまったそうです。コストパフォーマンスの高いフライ盛り合わせは良かったし、オーソドックスな洋食屋だっただけに残念だなぁ、、、
最新記事
Categories
Archives
記事Google検索

本ブログ内をGoogle検索
Twitter
Yahoo!アクセス解析
<<  December,2009  
S M T W T F S
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
QRコード
QRコード


Cities I've visited.
  • livedoor Readerに登録
  • RSS
  • livedoor Blog(ブログ)