2010/03/22

X11 debian nice

debian だと X11 の nice 値をどっかで適当に設定してくれてるはずなんですが
もーそんなのどこだったかなんて憶えてないよ教えて○○えもーん
というわけでググえもんに聴いてみました

XWindowの起動に失敗する。 Debian SargeからEtchへの移行 - 後編 - | 日記
dpkg-reconfigure x11-common すればいいそうです
何て基本的

で、実際にやってみると
  • 誰が X を立てられるか (root・console user・誰でも)
  • X の nice 値 (-10 から 0 推奨)
を聞かれました
debconf の設定次第でもっと色々聞かれるに違いありません

で、-10 で grep してみたところ
/etc/X11/Xwrapper.config:nice_value=-10
って出たのでこいつをいじればいいみたい

-10 にしてみました

2010/03/05

"-newkey ec"

楕円曲線暗号 (Elliptic Curve Cryptography, ECC) ってのがあります
公開鍵暗号の1つです
暗号使いたいといったら OpenSSL
OpenSSL なら ECC もばっちりに違いないと思い適当にコマンド叩きはじめました

Debian Lenny は OpenSSL 0.9.8g だそうです

とりあえず CSR 作る辺りの話ってのは幅広い暗号の話が? と思い
$ openssl req -help
unknown option -help
req [options] <infile >outfile
where options are
-inform arg input format - DER or PEM
(中略)
-newkey ec:file generate a new EC key, parameters taken from CA in 'file'
(後略)
"unknown option -help" とか言われてますが
"-newkey ec:file" で ECC な CSR が作れるっぽい!

そこで、ググってみましたところ
OpenSSLによる楕円曲線暗号の利用
え〜と、変な検索語使わなくても良かったんじゃないの?

楕円曲線暗号ってのは、楕円曲線の上で掛け算をするんですが
楕円曲線っての自体が沢山あるので先ずどれを使うか決めないといけません
どれでもいいかというとそういうわけではなく
ものによっては暗号としての強度が落ちてしまうそうなので
「これ使ってこうぜ!!」ってのが定められています

http://www.ietf.org/rfc/rfc4492.txt
http://www.ietf.org/rfc/rfc5480.txt
http://www.ietf.org/rfc/rfc5639.txt
あれ、なんか、一杯あるな、どれだ

で、最初にどの曲線使うか決めるわけですが
openssl に ecparam ってのがありまして
$ openssl ecparam -list_curves
secp112r1 : SECG/WTLS curve over a 112 bit prime field
secp112r2 : SECG curve over a 112 bit prime field
secp128r1 : SECG curve over a 128 bit prime field
secp128r2 : SECG curve over a 128 bit prime field
secp160k1 : SECG curve over a 160 bit prime field
secp160r1 : SECG curve over a 160 bit prime field
secp160r2 : SECG/WTLS curve over a 160 bit prime field
(後略)
と、扱える曲線のリストが出ます
で、実際にパラメータを出すには
$ openssl ecparam -name secp224r1
-----BEGIN EC PARAMETERS-----
BgUrgQQAIQ==
-----END EC PARAMETERS-----
とすると base64 された形で出てきます
これをファイルに入れといたりすれば OK

で、次に鍵を作りたいということで
$ openssl ecparam -name secp224r1 -genkey
-----BEGIN EC PARAMETERS-----
BgUrgQQAIQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MGgCAQEEHFaQDqPQ8x4NAr5Bz67BZcgqZurwgy4UGdlQ2OegBwYFK4EEACGhPAM6
AASNeby2ALikGQghKhN1a1SSvi1J+y1l55kE3AH1c4y+6LcesqdYKtkLt0P303p+
IH1Tj0J9MxqEJA==
-----END EC PRIVATE KEY-----
のように parameter と鍵が一緒に出せます

鍵だけ ecc.key というファイルに入れておいて
$ openssl ec -in ecc.key -param_out
read EC key
writing EC key
-----BEGIN EC PARAMETERS-----
BgUrgQQAIQ==
-----END EC PARAMETERS-----
と parameter を取り出すことも可能

じゃぁパラメータだけ出しても仕方なくない?
というとそうでもなくて、最初の req で出てきた -newkey で使えます
parameter の base64 を ecc.param ってファイルに入れといて
$ openssl req -new -newkey ec:ecc.param -nodes
Generating a 224 bit EC private key
writing new private key to 'privkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
や、まぁ、作っといて req に食わしてもいいんですが

CSR は CSR なんで、
あとはこれを RSA で署名してもいいし、ECC で署名してもいいし、
煮ても焼いても美味しく頂けます

2010/02/13

python epoll

「イベント〜?」「ドリブ〜ン!」

なんか、すっかり放置していました
私は GUI でチャットなどを作るはずだったのです
しかし全く着手せぬまま現在に至っています、ごめんなさい

そこで、少しだけ epoll 触っとこうと思うことにして調べました
How To Use Linux epoll with Python
何とも丁寧な説明がありました

とりあえず
  • select.epoll.register で file descriptor と何を監視するかを登録
  • select.epoll.poll で active なやつをとってくる
ってのだけ把握

というわけで、少し試してみることに
import socket
import select
from OpenSSL.SSL import Connection, Context, SSLv23_METHOD

fqdn = 'www.google.com'

s = socket.socket()
s.settimeout(0)

epoll = select.epoll()
epoll.register(s.fileno(), 2**11-1)

print epoll.poll(1)
s.connect_ex((fqdn, 443))
print "connect"
print epoll.poll(1)
ctx = Context(SSLv23_METHOD)
print "make Context"
print epoll.poll(1)
c = Connection(ctx, s)
print "make Connection"
print epoll.poll(1)
c.set_connect_state()
print "set connect state"
print epoll.poll(1)
c.do_handshake()
print "do handshake"
print epoll.poll(1)
x509 = c.get_peer_certificate()
print x509.get_subject()

で、結果がこちら
$ python test1.py 
[(3, 276)]
connect
[(3, 260)]
make Context
[(3, 260)]
make Connection
[(3, 260)]
set connect state
[(3, 260)]
Traceback (most recent call last):
File "test1.py", line 26, in <module>
c.do_handshake()
OpenSSL.SSL.WantReadError
non-blocking のまま handshake しようとして怒られました

select.EPOLLOUT = 4, select.EPOLLHUP = 16, select.EPOLLWRNORM = 256
みたいなんですけど、まぁ、OUT だけ見りゃいいのかな、この場合

教訓:「OpenSSL の handshake を呼ぶんなら blocking にしよう」
え、そこなの?

2010/02/09

ekrn.exe

パソコンが遅いんだけど何でかなと言われて調べました
taskmgr を開いてみるとプロセスが 2 つ暴走しています
1 つは Firefox でもう 1 つは ekrn.exe というもの

ウイルス!? と思って検索してみたところ
「ekrn.exe のCPU使用率が100%になるのは?」
NOD32 のエンジンらしい

にしても何故 Firefox とコンビで
Firefox はこの前 3.6 にしてみたんですが
自分の環境でも Google Apps で暴走してしまうようだったので
3.5 に戻してみたばかりでした
今回の環境も試しに 3.5 に戻してみたら一先ず解決しました

その後 NOD32 も version up されてたので更新
これでちょっと様子見てみることにしました

NOD32 はまぁいいんだけど Firefox が暴走するのがちょっと心配です
しかも Google Apps とは
「ちょっと人柱過ぎだから気をつけろ」
ということかもしれません

2010/02/05

erlang ssl_esock

HTTPS サーバーから証明書を取ってこようシリーズ
今回は Erlang です

Erlang の SSL な module はこちら
Erlang -- SSL Reference Manual
ざっと見ると getpeercert という関数があるのでこれっぽいです

左のコラムに ssl と ssl_new というのがありますが、これは
以前は SSL 関連でも全て OpenSSL を利用していたようで
connection を張ろうとしたりすると ssl_esock という subprocess が立ち
そいつに色々と仕事を任せていたようです
でも Erlang 的にはそこに C が入ってしまうので嬉しくありません

そこで cryptographic primitive な部分だけ OpenSSL を使って
connection の部分なんかを Erlang で実装したのが ssl_new のようです
cryptographic primitive は crypto って application を使います

で、application とか良く分かってないんですが
とりあえず start とかしといたらいいんでしょ、というのが次
-module(get_cert).
-compile(export_all).

get_cert(Host) ->
application:start(crypto),
application:start(ssl),
{ok, Sock} = ssl:connect(Host, 443, [{ssl_imp, new}]),
{ok, Der} = ssl:peercert(Sock),
{ok, Cert} = public_key:pkix_decode_cert(Der, otp),
ssl:close(Sock),
application:stop(ssl),
application:stop(crypto),
Cert.
ssl:connect の option に ssl_new を使うと伝え
ssl:peercert で証明書を DER で取り
public_key:pkix_decode_cert でそれを parse しています
otp ってあるのは parse の形式で、あと plain があります
それぞれ
-include_lib("public_key/include/public_key.hrl").
-include_lib("public_key/include/OTP-PUB-KEY.hrl").
的なことをしておけば読み易いです
かんたんなことしかしていませんね

で、動かしてみると
$ erl
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4 (abort with ^G)
1> get_cert:get_cert("blogger.com").

=INFO REPORT==== 15-Feb-2010::01:34:14 ===
application: crypto
exited: stopped
type: temporary

=INFO REPORT==== 15-Feb-2010::01:34:14 ===
application: ssl
exited: stopped
type: temporary
{'OTPCertificate',
{'OTPTBSCertificate',v3,134060097170805708820381,
{'SignatureAlgorithm',{1,2,840,113549,1,1,5},'NULL'},
{rdnSequence,
[[{'AttributeTypeAndValue',{2,5,4,6},"US"}],
[{'AttributeTypeAndValue',
{2,5,4,10},
{printableString,"Google Inc"}}],
[{'AttributeTypeAndValue',
{2,5,4,3},
{printableString,"Google Internet Authority"}}]]},
{'Validity',
{utcTime,"091222015844Z"},
{utcTime,"101222020844Z"}},
{rdnSequence,
[[{'AttributeTypeAndValue',{2,5,4,6},"US"}],
[{'AttributeTypeAndValue',
{2,5,4,8},
{printableString,"California"}}],
[{'AttributeTypeAndValue',
{2,5,4,7},
{printableString,"Mountain View"}}],
[{'AttributeTypeAndValue',
{2,5,4,10},
{printableString,"Google Inc"}}],
[{'AttributeTypeAndValue',
{2,5,4,3},
{teletexString,"*.blogger.com"}}]]},
(あと長いんで略)
こんな感じで X.509 を parse してくれてます

ちなみに public_key の Reference は
Erlang -- public_key
にあって
例えば pem_to_der ってのを使えば PEM の PATH 与えて
DER で返してくれるなんてのも分かります

2010/01/25

pdf 署名

PDF に署名したいなーって思いました
ググりました

Adobe Acrobat 使えばいいみたいなんですが
手元にあるのが弱いバージョンだからなのか
Reader と上手く連携してないからなのか
何だか良く分かりません

っていうか Linux とかでしたいじゃん

で、これですね
MOONGIFT: » PDFに署名をする「PortableSigner」:オープンソースを毎日紹介
Java で書かれてるようなので Linux でもいけそうだ!
と言いながらとりあえず Windows XP で試してみたんですが
インストールして Readme を参照して JCE というのを入れてみたら
しっかり署名することができました
簡単!
まぁ、きっと Acrobat を使うともっと凄いこと色々できるんだろうなぁ

で、Acrobat で開くと
「文書の証明の完全性が不明です。作成者が検証できませんでした。」
って出ます。
これはルート証明書から署名した証明書まで辿れなかったってことだろう
と思ったんでちょっと仕組みを調べてみました。

といっても、メニューの「文書」に「信頼済み証明書」ってのがあって
それ開いて表示を「証明書」にすれば良かっただけなんですが。
で、そこには Adobe Root CA ってのしかありません。
ん〜? と思って他のも調べてみると Reader の 8 までは Adobe Root CA のみ
9 になると色々と第三者機関の証明書も入っていました。

全ての信頼の起点はこれなの? と思いもう少し調べてみると
Windows であれば
[編集] -> [環境設定] -> [セキュリティ] -> [詳細環境設定]
と進んで [Windows 統合] ってところで
片っ端からチェックすればいいみたい。
Windows で信頼されているルートを Reader でも信頼することになります。

んでは、信頼済みな証明書ってのは何のことなの? って思ったので
更にしつこくググってみたら
Adobe - Certified Document Services (CDS)
に辿り着きました。

なるほど、Microsoft の場合は
Microsoft Root Certificate Program
Firefox の場合は
Mozilla CA Certificate Store Information
で採用されていないといけないわけですが
Adobe Reader に関してもそういうのがあるってことですね。
でも Adobe の少なくないの?

PDF の方が色々用途があったり署名が頻繁だからなのか
商品ラインナップも個人用とか法人用とかあったりして
署名できる回数も決まってたりで複雑そうでした。
タイムスタンプとかその辺良く分かってないんですが。
同じ Adobe でも Air 用の Code Signing とかとは勝手が違うみたい。
ビジネスとか法律の香がしてきました。

2010/01/23

cario letter a4 lenny

実家にはパソコンがあるんですがプリンタがありません
母親が印刷したいと言いだしました
何なら印刷して送ってこいという勢いです
しかし我が家にもプリンタは無いのです

近頃のコンビニは凄いよなと思いつつ
最寄りのコンビニであるセブンイレブンのページを見ると
コンビニでのサービス ネットプリント 富士ゼロックス
ネットにファイル上げといてコンビニで印刷できるみたいです
ちなみに、我が家の最寄りのコンビニは USB メモリが挿せます

印刷したい内容はメールでもらっていたので Firefox から PDF に
で、ゼロックスのページのアカウント取って
先ずは添付されてた画像を登録したら用紙聞かれたので A4 を選択
次に PDF をアップロードしたらエラーに
「使える用紙は A4 とかだよ」
なんて言ってきます
$ pdfinfo mozilla.pdf 
Creator: cairo 1.7.4 (http://cairographics.org)
Producer: cairo 1.7.4 (http://cairographics.org)
Tagged: no
Pages: 1
Encrypted: no
Page size: 612 x 792 pts (letter)
File size: 73537 bytes
Optimized: no
PDF version: 1.5
あら、確かに letter になってるわ

何で画像のときは紙のサイズ聞いてきたのにさ、と思いつつ
Firefox の印刷画面をもう一度見ると確かに紙の指定のラジオが無い
昔はあった気がするんだけどと思いつつググりました
「firefox 印刷 pdf letter a4」で検索したんだけど良く分からず
「cario letter a4 lenny」で検索すると
#383455 - firefox: prints always in letter format - Debian Bug report logs
うん、なんか、皆悩んでいらっしゃる

斜め読みしても何かあーだこーだ言ってるっぽくって
最後まで斜めってしまったら prefs.js とか言っている
そーかーと思って about:config 開いて letter で検索して
出てきたの片っ端から A4 にしてやったら無事 A4 になりました

ちょっと、乱暴だったかしらと反省
最悪の場合
$ ps2pdf -sPAPERSIZE=a4 mozilla.ps mozilla.pdf
かなーと思ってたんで、よかった