Windowsの証明書自動更新と認証proxyの罠(CryptoAPI)

過去にCentOS/RHEL5にてGlobalSignのルート証明書が期限切れとなる事態が起きました(参考: RHEL5/CentOS5でGlobalSignのルート証明書が有効期限切れで大騒ぎ)。一般的なGNU/Linuxディストリビューションでは、SSLのルート証明書等をパッケージとして配布しています。たとえばDebianではca-certificatesパッケージがそれに該当します。 かたやWindowsは、XPまではWindows Updateで最新の証明書セットを配布していました。しかしVista以降はマイクロソフトが各種証明局と連携して、自動的に更新する仕組みを導入しています。しかし、システムが利用するhttp proxyがユーザー認証つきの場合、これが動作しないということに最近気付きましたので、記録として残しておきます。 CryptoAPI SSL証明書の自動更新は、CryptoAPIのサービス、Cryptographic Servicesが行います。管理ツールのサービス一覧を見ると、このサービスが動作しているのがわかります。 まったく新規のWindows環境を用意して、台湾のVISA取得サービス(https://visawebapp.boca.gov.tw/BOCA_MRVWeb/subroot/MRVWeb0_form.jsp)にアクセスする場合を例示してみます。 新規のWindows環境では、台湾のルート証明書は古いものが搭載されています。前述のURLにアクセスすると、CryptoAPIサービスが新しい証明書(http://grca.nat.gov.tw/repository/CRL/CA.crl)を取得し、検証用のエンドポイント(http://gca.nat.gov.tw/cgi-bin/OCSP/ocsp_server.exe)で証明書が正しいことを確認した上で、OSの証明書ストアを新しいものに更新します。 困ったことに、CryptoAPIは認証つきhttp proxyを経由したアクセスをサポートしていません。これは仕様としてそうなっているようです。 したがって、認証つきhttp proxyしかない環境下では、SSL証明書の更新がうまく動作しません。 一つの対応策として、User-Agentが”Crypto-API”である場合に認証を不要とする方法があります。それ以外には、stone等を使って認証不要なhttp proxyをローカルに立ち上げるという手段も考えられます。  

Published
Categorized as その他

さくらVPSでLXCを使う(dummynet+bridge+proxy arp)

さくらインターネットの提供するVPSサービスではDebianが利用できます。VPSのホストはKVMで提供されているようです。VPSのインスタンス一つで別の仮想的な環境が欲しくなったので、LXCを使ってみました。 ループバックインターフェースを持つだけのホストは簡単に作れるのですが、VPSに割り当てられているNICインターフェースをブリッジにするわけにもゆきません。そこで今回はdummynetを利用してホストオンリーネットワークを構築してみました。 dummynetは物理NICとは結びつかない、完全なダミーのネットワークインターフェースを提供します。インターフェース名はdummy0などとなります。使うには単純にmodprobe dummy等としてdummy.koをロードするだけです。Debianで起動時に有効にするためには、/etc/modulesに一行”dummy”と追加しておけばよいです。 次にdummy0をLXCから使えるよう、ブリッジを作ります。 apt-get install bridge-utilsを実行してネットワークブリッジデバイスを扱うためのツール一式を入れておきます。次に/etc/network/interfacesに以下のような記述を追加します。 IPアドレスやネットワークは、別途自分が普段使う範囲とバッティングしない、適当なプライベートネットワークを設定してください。 この状態でifup br0を実行すれば、dummy0デバイスに紐づいたブリッジデバイスbr0が作られます。auto br0を入れてあるので、再起動時にも自動的にbr0がifupします。 この状態で、lxc-create等を使ってLXCコンテナのインスタンスを作成します。ただ、Debian wheezyのlxcパッケージはかなりbuggyで、あんまり動作が信用なりません。私は個人的にsidのlxcをバックポートしたものを使っています。 以下は私の作ったlxcコンテナのconfigの一部です。 私は、コンテナ側の/etc/network/interfacesにeth0のネットワーク設定を書いて設定しています。 基本的にはこれでホストオンリーな環境ができます。しかし、メンテナンス上コンテナ側でも毎日apt-getはしたいので、私の環境ではNAT(masquerade)をできるようにしています。 この時に問題になるのがarpとfowardingです。何も設定しない状態では、br0から外に出ることができません。 まずbr0でproxy arpを有効化します。設定方法はsysctlを使うか、echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arpを実行するかして有効化します。これでbr0から他のインターフェース(eth0等)へ届くようになります。起動時に有効にするためには、interfacesにさらなる設定を追加します。 次はforwardingです。これもprocでも設定できますが、私は以下の内容を書いたファイルを/etc/sysctl.d/ip_forward.confとしています。 最期にNATの設定です。/etc/iptables/rules.v4に以下のような行を書いておきます。コマンドであれば、iptables -A POSTROUTING -s 172.23.186.0/24 -o eth0 -j MASQUERADEという具合です。 これで、VPS上でも外部ネットワークに到達可能なLXCインスタンスを持つことができます。もちろん、静的NATを組み合わせれば、一部のポートをインターネット側で受けることもできます。

Published
Categorized as その他

Calibreの達人出版会ストアプラグインを作りたい

昨年は個人的な電子書籍元年でした。Kindle paperwhiteに始まり、Kobo touch、Lideoと3種類の電子ブックリーダーを購入してしまって、電子書籍の良いところ、悪いところも含めていろいろと肌で感じることができました。 これらの端末はみな、ストアとの連携機能を持っています。うっかり続き物を買ってしまうと、次々と続編をお勧めしてきたりして、なかなかあなどれません。 しかし、当然これらの端末に相互運用性などあるわけもなく、そうなると必然的にDRMのかかっていない書籍が欲しくなってきます。 国内の技術系電子書籍でこれらを満たすサイトとして、達人出版会があります。素晴らしい試みだと思います。 しかし達人出版会はその特性ゆえ、電子書籍端末との連携は望むべくもありません。 一方で、最近Calibreという電子書籍端末管理ソフトウェアを使い始めました。USB storageに見える端末(Kindle, Kobo)であれば統一的に扱うこともできます。 このソフトの特徴のひとつに、電子書籍販売サイトから書籍を検索する機能があります。今のところ日本のサイトには対応していないようですが、amazon.comやヨーロッパのamazonに対応しているので、プラグインさえ書けば対応は可能のようです。

Published
Categorized as その他

Windons7のVirtualBoxでデュアルブート用のraw partitionにあるLinuxを起動させる

修理に出していたノートPCが帰ってきたので、せっかくだからと今までデュアルブートにしていたWinodws7/Linuxのうち、Linux側をWindows7のVirtualBoxからも起動できるようにしようと思い立ち、やってみました。 まず、raw diskを認識させるためのvmdkファイルを作成します。具体的な方法はVirtualBoxのマニュアルに記載されています。VMBoxManageコマンドを使い、サブコマンドinternalcommands createrawvmdkを発行します。ディスクに直接アクセスするため、管理者権限が必要です。スタートメニューのアクセサリからコマンドプロンプトを右クリックして、管理者として実行を選択して、コマンドプロンプトを開きます。 VirtualBoxの各種コマンドには通常パスが通っていません。そこをカレントディレクトリとし、下記のコマンドを実行します。 C:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands createrawvmdk ^ -filename C:\VBox\rawdisk.vmdk -rawdisk \\.\PhysicalDrive0 ^ -partitions 3 -filenameには、vmdkファイルのパスを指定します。すでにファイルが存在しているとエラーになるので注意してください。-rawdiskには、Windows形式のデバイス指定を実行します。\\.は自分のコンピュータを意味し、PhysicalDrive0は0番目に接続されたディスクを意味します。どのディスクが何番目にあるかはdiskpart.exeで確認できます。必要なら、Linuxの入っているパーティション番号も確認します。-partitionsオプションを指定すると、そのパーティション以外にはアクセスできなくなるvmdkが生成されるので安心です。 C:\>diskpart Microsoft DiskPart バージョン 6.1.7601 Copyright (C) 1999-2008 Microsoft Corporation. コンピューター: KARL DISKPART> list disk ディスク 状態 サイズ 空き ダイナ GPT ### ミック ———— ————- ——- ——- — — ディスク 0 オンライン 112 GB 0 B ディスク… Continue reading Windons7のVirtualBoxでデュアルブート用のraw partitionにあるLinuxを起動させる

Published
Categorized as その他

OpenPGPの鍵でOpenSSHと接続する(GnuPG2利用)

OpenPGPの鍵は、GnuPG2に付属のgpg-agantと組み合わせると、sshの鍵としても利用が可能です。しかし、これに関する日本語の情報がどうもなさそうなので、ちょっとまとめてみます。GnuPG 2.0系を対象とします。2.1系はもっと扱いが楽そうなのですが、そちらはまだ開発版なので使っていません。 まず、自分自身のOpenPGPの鍵を用意します。普段からGnuPGを使っているなら、その鍵を利用できます。ない場合は新規に作成しましょう。もちろん、すでにGnuPG 2.0がインストールされていることが前提です。また、.gnupg/gpg.confにuse-agentを追加しておきましょう。 GnuPG – The GNU Privacy Guard Version 1.2 README GnuPG 鍵の作り方 – keysignparty-ja 次に、monkeysphereをインストールします。Debian stableならパッケージがあるのでaptで入れましょう。そして、ssh用のsubkeyを次のコマンドで生成します。 # 鍵長2048bitのRSA鍵を生成 $ monkeysphere gen-subkey -l 2048 subkeyの生成には時間とエントロピーが必要です。バックグラウンドで何か複雑な処理やdisk IOなどを発生させましょう。私の場合は、2GBぐらいのVorbis/Theoraファイルを適当にgrepさせていました。 今度はgpg-agentを起動します。gpg-agentはGnuPG2の一部ですが、Debianだとgpg-agentパッケージとして分離されていますので、これもaptで入れましょう。また、pinentryという、途中でパスフレーズを入力させるためのプログラムも必要です。tty向けのpinentry-curses, gtk2向けのpinentry-gtk2, qt/4向けのpinentry-qt/qt4パッケージがあります。環境に合わせて必要な方をいれましょう。 gpg-agentの引数は設定ファイル~/.gnupg/gpg-agent.confに書くことができます。以下は設定例です。 1行目はpinentry用のプログラムの指定です。環境に合わせて適切なものを選んでください。5行目は、GnuPG2が参照するための環境変数をファイルにも出力させるための設定です。6行目の設定は必須で、これを指定することでgpg-agentがssh-agentと同じ機能を提供してくれます。 ここまで設定したら、以下のコマンドを実行します(bash, zshの場合)。 $ eval `gpg-agent –daemon` これでgpg-agentがdaemonとして起動します。次に鍵の登録をします。これは普通にssh-addを実行すればよいです。OpenSSHの鍵があれば、普通にそれについてのパスフレーズも聞いてきます。この段階でOpenPGPの鍵も登録されます。登録されていることは、ssh-add -lで確認できます。 ハイライトされた部分がGnuPGの鍵です。パスフレーズは、必要になるときまで聞かれません。 ssh-add -Lを実行して、公開鍵を確認しましょう。 コメント部分にOpenPGPのidが書かれているのが公開鍵です。これをリモートホストの.ssh/authorized_keysに追記します。 あとは対象のサイトにsshで接続すると、pinentryプログラムが起動し、パスフレーズを要求してきますので、入力してログインしましょう。 DebianのGNOME2環境では、デフォルトでgpg-agentとは異なるagentが走っています。Programmierecke.NET – The Source of Programming Informationを参考にgnome-keyringを止めてください。 参考サイト SSH… Continue reading OpenPGPの鍵でOpenSSHと接続する(GnuPG2利用)

Published
Categorized as その他

私立プログラミングキャンプ参加 #upcamp

帰省する直前に、私立プログラミングキャンプに参加しました。もともと私は2008年の公式なプログラミングキャンプ講師をやっていたのですが、その後都合により参加できず、今年はとうとうプログラミングキャンプ自体がなくなってしまいました(それまではセキュリティキャンプと同時開催、というか名称が「セキュリティ&プログラミングキャンプ)。 Webにもあるように、過去のセキュリティ(&プログラミング)キャンプの参加者が主催されています。会場の確保等ファシリティの用意が大変だったと思いますが、ありがとうございます。 しかし、参加人数が多すぎたので会場のキャパシティが厳しく、私はLTで軽く話しただけで、夜にはかえってしまいました。なので、実質何もできていません。申し訳ないとは思いつつ、場を若い人に任せた方がいいかななと思っての処置です。 LTの発表資料は公開しています。実際に喋ったのは7ページ目まででした。

Published
Categorized as その他

名古屋へ帰省しました

ぎりぎりまで家で寝てから、実家へ帰省しました。前回の帰省のときにVPNの設定をしたので、ルータが死なない限りはまあ自宅のほうもなんとかメンテナンスできます。 この帰省中に、daionet.gr.jpのサーバを更新しようと思っています。まあCore2Duoでも速度的に困らないわけではないのですが、メモリがDDR2でちょっと高いので、安いメモリの使える最近の世代に変えたいところです。  

Published
Categorized as その他

今後のイベント予定

正確には、コメントspamすら来ないというべきか。一応英語版blogも用意してPlanet Debianに登録してあるんですが、なかなかの勢いでspamがやってきます。 もちろん普通のコメントも来ました。しかしこちらには何も来ない・・・まあいいんですけどね。というかあまりネタがないです。 直近のイベントとしては、私立・プログラミングキャンプ 2012 東京大会 – #upcamp が8/11-12にあります。もはやなくなってしまったプログラミングキャンプを有志で実現しようというものです。私立・プログラミングキャンプ 2012 京都大会 – #upcamp #upcampKansaiもあります。 他には、国際的なイベントとしてSoftware Freedom Dayが9/15にあります。FSIJとしてもイベントを実施する予定なのですが、いかんせんまだ詳細が決まっていません。とりあえずEkigaを使ってほかの拠点とビデオ会議をやりたい、という話は出ています。 Ustreamみたいなのを、自由ソフトウェアだけでやりたいですね。GNUstreamというか。