SVX日記
2005-01-16(Sun) タマ消たSVX
今日はちょっとした成り行きから家具屋に向かう。適当に見て回った帰り、あまりにも遅いGTRをスッとパスしたら突然メーターパネルに赤いインジケータが!! ブレーキ!? ブレーキトラブル!? と思いきや、ストップランプのタマ切れである。あー、びっくりした。
しかし、スッと抜き去ったGTRを後ろに従えて、ストップランプがタマ切れしているという状況はなんともシマらない。ちょうど16号を走っていることだし、そのままスーパーオートバックスへ向かうコトにした。駐車場にとめて状況を確認。あぁ、確かに切れてるわ。
店内のランプ売り場に行く。最近はLEDだのなんだのイロイロな種類のタマが並んでいるが、フツーのタマはきわめて安い。2つで\357である。SVXのテールは4灯で、左右の明るさが違うのもカッコわるいので2個入っているのはウレシイ。しかし、せっかくなのでちょっと変わったモノを取り付けてみたい気もする。なんぞないものか。
周りはすっかり暗くなっていたが、SVXのトランクを開け、裏の生地をちょっとめくったら、簡単にランプにアクセスできた。暗くてよく見えないが、手探りで交換できるほど簡単。縁起物なので両方交換しておく。作業完了。
2006-01-16(Mon) tdiaryのコメントスパムを排除してみる
当ブログはtdiaryというブログシステムを利用しているが、このtdiaryというブログシステムには「ツッコミ」を入れられるという特徴がある。日記の1日のエントリごとに、小さな掲示板が付いているというようなモノなのであるが、掲示板であるから余計な書き込みをする輩が現れる。面倒なことはキライだし、アホな書き込みも「枯木も山の賑わい」と、基本的に放置の方向で運営してきたが、怪しげな薬品の広告スペースとかに使われたり、私信のチャットに使われたりしだすと、さすがに見苦しさに余る。
こーゆー時にはIPアドレスで制限したりするのが、基本的な対処であるが、IPアドレスでの制限は大抵はドロ沼になる。書き込む方は基本的に攻撃側であり、防御側が屈するまで、気の済むまで攻撃できるんだから当然である。IPを変えるなんざ、いとも簡単なことであり、そりゃ効き目があるわけがないのである。
基本的に、攻撃もしくはどちらかというとダークな行動をする輩はスキルが低いことが多い。以前にFOMAの端末のボタンに直に配線をつなぐ改造を加え、端末をPCから制御して迷惑メールを出しまくっていた業者が摘発されたというニュースを見たが、その改造のアホさには目を見張るものがあった。端末のボタンへの配線が2本ずつあったのである。どうやら彼らには「GND」という概念がないらしい。同様に推測すると、以前に悪いことするために「サリンちゃん」なんていう妙薬を作り出した団体があり、ニュースでは「高度な技術を持つエリートを擁している」などとして扱われていたが、パンピーからは高度な技術にみえても、きっとフツーの薬品エンジニアからはなんでもないことなんじゃねーかと思う。まっとーな人間なら、ハナっからあんな団体に属したりしませんって。
脱線したが、よーするに、そのようなダークな輩に正義のエンジニア(?)が負けるなどということはあってはならないコトなのである。ちゅーわけで、なんかいい方法はないかと考えていたのだが、あった。tdiaryの場合、うっとおしいコメントがあったら、管理画面でチェックボックスを外すことで非表示にできるのであるが、これをデフォルトにしてしまえばいいのである。そうすりゃ書き込まれた後に管理者が確認して、内容によって表示したり、放置したりすることができる。なんだ、簡単だ。いわゆる、オプトアウトでなく、オプトイン方式にすりゃいいのである。
通常であれば、簡単な変更ではあっても、そのような変更は不可能なところであるが、ウチは自宅サーバであり、tdiaryはRubyで書かれたオープンソースアプリであり、オイラはRubyプログラマである。チョイチョイと直してしまえばいい。
colinux:/home/mitsu/public_html/diary $ grep -r ツッコミ *
skel/update.rhtml: <input type="submit" tabindex="<%=2000+idx%>" name="comment" value="ツッコミ表示状態変更">
colinux:/home/mitsu/public_html/diary $ vi skel/update.rhtml
59 @diary.each_comment( 100 ) do |comment| %>
60 <div class="commentator">
61 <span class="checkbox">
62 <input class="checkbox" type="checkbox" tabindex="<%=2000+idx%>" name="<%= idx += 1 %>" value="true"<% if comment.visible? then %> checked<% end %>>
63 </span>
64 <span class="commentator"><%= CGI::escapeHTML( comment.name ) %><%= CGI::escapeHTML( " <#{comment.mail}>" ) unless comment.mail.empty? %></span>
65 <span class="commenttime"><%%=comment_date( Time::at( <%=comment.date.to_i%> ) )%></span>
66 </div>
67 <p><%= comment.body.make_link.gsub( /\n/, "<br>" ).gsub( /<br><br>\Z/, '' ) %></p><%
68 end
69 if idx > 0 then %>
70 <div class="button">
71 <input type="submit" tabindex="<%=2000+idx%>" name="comment" value="ツッコミ表示状態変更">
72 </div><%
73 end %>
colinux:/home/mitsu/public_html/diary $ grep -r "visible?" *
tdiary.rb: def visible?; @show; end
tdiary.rb: i += 1 if all or comment.visible?
tdiary.rb: if c.visible? then
tdiary.rb: next unless com.visible?
tdiary.rb: def visible?
tdiary.rb: break if @diary.visible?
tdiary.rb: lm = lmd if lm < lmd and diary.visible?
tdiary.rb: next unless diary.visible?
tdiary.rb: @diary = nil if @diary and not @diary.visible?
tdiary.rb: @diaries_size += 1 if diary.visible?
tdiary.rb: next unless diary.visible?
tdiary.rb: next unless com.visible?
colinux:/home/mitsu/public_html/diary $ vi tdiary.rb
93 #
94 # class Comment
95 # Management a comment.
96 #
97 class Comment
98 attr_reader :name, :mail, :body, :date
99
100 def initialize( name, mail, body, date = Time::now )
101 @name, @mail, @body, @date = name, mail, body, date
102 @show = true
103 end
104
105 def shorten( length = 120 )
106 matched = body.gsub( /\n/, ' ' ).scan( /^.{0,#{length - 2}}/ )[0]
107 unless $'.empty? then
108 matched + '..'
109 else
110 matched
111 end
112 end
113
114 def visible?; @show; end
115 def show=( s ); @show = s; end
116
117 def ==( c )
118 (@name == c.name) and (@mail == c.mail) and (@body == c.body)
119 end
120 end
ん? 114行目の「def visible?; @show; end」があって、102行目の「@show = true」があるっつーことは……これをfalseにするだけじゃん!! わー!! こんな1行ばっかの変更じゃ、ブログのネタにならないじゃねーかッ!!
……などといいつつも、ネッチリとソースコードを入れてネタにしてしまったが、結論から言うと「tdiary.rb」の以下の部分(Commentクラスのコンストラクタだ)を書き換えるだけで、所望する動作を行うことができた。
100 def initialize( name, mail, body, date = Time::now )
101 @name, @mail, @body, @date = name, mail, body, date
102 @show = true (※trueをfalseに書き換える)
103 end
あ、そうそう、この一連のツッコミには笑わせてもらった。オイラには書き込み元のIPが同じだってこと、わかっちゃってるんだよねぇ。
2010-01-16(Sat) 演歌で爆走する
オイラの知っているサンタは、いわゆる「デコトラ」に対して、あまりよい印象をもっていないはずなのだが、ガキとはいえ、せっかく興味を持ったのならば、与えてあげればいいじゃん、と思っているらしい。また、Amazonで極端に安く入手できることもあったのかもしれない。クリスマスの朝、彼の枕元には「爆走 デコトラ伝説 〜男一匹夢街道〜」があった。
なんでだかよくわからないが、ゲーム中のBGMは「ド演歌」だ。デコトラと演歌には切っても切れない関係があるのだろうか……とはいえ、かなりゲームの感じとマッチしているのも確か……気がつくと、ゲーム自体のデキもかなりイイ。気がつくと、彼は「♪ゆめ、ゆめ、さくらぁ〜」だの「♪風が泣いてる叫んでるぅ〜」だの口ずさんでいる。つーか、オレまで口ずさんでいる……なんか、ちょっと演歌にハマってしまったかも。
こりゃ、mp3プレイヤに放り込むしかない。ゲームのCDをPCにセットしてみた。しかし、なぜか、認識され、吸い出せるのは2トラックだけ。残りの7曲はリストに出てこない。こーなりゃ、サウンドテストから引き抜こう。サウンドテストで再生させつつ、HDDレコーダで録画する。DVD-RWに焼いたらPCへ。wav化を試みる。
前回と違って、パッと使えるWindows環境がないので、Linux環境でDVDからwavを抜き出そうとしたのだが……
vobcopy -m
cat VTS_03_1.VOB VTS_03_2.VOB | ffmpeg -i - decotra.ac3
a52dec -o wav decotra.ac3 > decotra.wav
mplayer dvd://3 -ao pcm:file=decotra.wav -vc dummy -vo null
sox decotra.wav -b 16 -r 44100 decotra441.wav
結局、試行錯誤して、上記の方法を編み出した。約40分のwavができてしまえばこちらのもの。過去に自作したcccdctを引っ張り出してきて、サックサックと切る。ついでに、微妙にアチコチ手直ししたので、新バージョンのcccdctをここに置いておく。
今まで、演歌になんてまったく興味がなかったが、歳を取ったせいで、独特の曲調が心地よく感じるようになってきたのだろうか。ガキの言うことだからとバカにせず、いっしょに付き合うと、いろいろと新鮮な発見に出会えそうだ。ハァ、アン、ア、アンアンアン。
mplayer VOLUME_IDENTIFIER/VIDEO_TS/VTS_01_1.VOB -ao pcm:file=music.wav -vc dummy -vo null
ffmpeg -i xxxxxx.flv -acodec copy xxxxxx.mp3
2016-01-16(Sat) ラガードのラガードによるラガードのためのレグザ購入
2016年が明けたところで、愛用してきたブラウン管ハイビジョンテレビTH-28D30が微妙な挙動を示し始めた。具体的に言うと、スプラトゥーンを遊んでいる時に、画像が上下にズレたり流れたりするようになってきた。
数年前、実家から液晶テレビを譲り受けたので、TH-28D30は表示遅延ゼロの特性を生かし、ゲーム専用として活躍していたのだが、さすがに限界というトコロか。未だに画質は最高レベルなのだが、8年使えば、まぁいいか、という感じ。テレビ事情について思い返せば、エコポイントとか、ゲームにおける遅延問題とか、Wiiによるテレビ破壊ブームとか、シャープの隆盛と凋落とか、地デジのクソ画質以外の、様々な問題が「すぅ〜っかり全部片付いて」「すぅ〜っかり機能も価格も落ち着いた」ところでのテレビの買い替えということになる。しかも、出始めの4Kを避けてREGZA 43J10をチョイスだ。ある意味、最高の性能を、最低の価格で手に入れられたといえよう。
早速、スプラトゥーンで遊んでみる。極端に遅延が少ないというだけあって、違和感はゼロ。ヘボな腕がそれ以上にヘボにならずに済んでいる。そして、レトロゲーをやれば、すばらしくドットがクッキリと表示されるのである。
実に、ドット絵が起こせるレベルである。ちょっとボケるくらいが味があるという向きもあろうが、個人的にはこのガビガビにドットが見える状態が好きだ。昔からココムったりとか、クレマったりとか、不正会計したりとか、会社としては最低だが、テレビは最高だぞ。ナイスレグザ!
取扱説明書を見ると、中身がLinuxらしいのも気分がいい。ブラウザも付いているので、試しにこのサイトを表示してみたところで、例のゲームが動くか試してみたら……
さて、録画用のハードディスクでも注文するか。気づかないうちに便利な世の中になったもんだなぁ。
2022-01-16(Sun) テストで雪道
タイヤを交換してから、妙にクルマにカマいたくて、アレコレとネタを考えている……と、そういえば、そろそろバッテリを交換する頃ではないか、などと思い付き、やめときゃいいのに、夜にもかかわらず、小さなライトを手にボンネットを開けたら、エンジンルームの中にライトを落としてしまった……そらそうなるわな。
55x35x15くらいの大きさなのだが、妙なところにハマり込んでいると、エンジンをかけた時に大変なことになりかねない。夜では暗くて探しようがないので、ヤキモキしながら寝付くことになった。ロードスターエンジンルームの下にはアンダーカバーがあって、落としたものが素直には地面に落ちない。もしかしたら左右どちらかのフロント・マッドガードを外したり、面倒なことになるかも……と、イライラなのか、ワクワクなのか、よくわからん感情が渦巻く。
そんなこんなで、タイヤを交換したのにちゃんと走れていない。冬ではあるが、少し陽気のいい今日は、久々に……ホントに1ヶ月ぶりくらいに、ちょっとしっかり走りに行こう、と、新豊根ダムでも向かってみることにした。お気に入りの33号を通って。
んが、やっぱりというか、思った以上というか、かなりの圧雪路が現れた。新タイヤといえど、ノーマルタイヤであるから、太刀打ちできるわけがない。わずかな上りなのに、微妙に左右に揺れ、TCS/DSC作動表示灯が点きまくる。あ、これ、ちゃんと点くのね……初めて見たような。
ちょっとこの先も続きそうだし、ここは無理せず戻ったほうがいいと判断。すぐ先の雪の薄いところまで行って、後ろの車に譲り、転回場所を探して戻る。よく考えたら、この先はかなりの下りのはず。上りで様子が伺えたのは幸いだったかもしれない。
ただ帰るのはシャクだが、ダムまでは行けそうにもない。別に、用事があるわけではないので、雪のなさそうな道を選んで、ぐるっと回って帰ることにする。あ、ついでに少し高速に乗って、ホイールバランスが問題ないかチェックしてみることにしよう。
新東名は正月に乗ったので、東名にしよう。豊川ICから乗る。音羽蒲郡ICで下りる……となると、10kmくらいしかないな。しかも、ちょっと混んでる。ちょっと前車との間隔を見て、90弱くらい出す、を、3回くらい繰り返す。特段のバイブレーションは出ない。普段はまったくと言っていいほど高速には乗らないので、90弱で問題なければ、何の支障もない。音羽蒲郡ICで下りる。330円。テスト、クリア(※例によって文中の数値の単位には参るです)。
あとは、もう一度、空気圧チェックして、ホイールナットを締めて、念のためムシを締め直したら、完全終了だな……って、そのためにムシ回しを手配したのだが、実は、ロードスターに車載のタイヤパンク応急修理キットには、ムシ回しが含まれていたのであった。盲点。せっかくだから、ムシの締め直しで抜ける空気を入れる時、エアコンプレッサの試運転でもしてみようかしらん。
あ、ちなみに、今回、ヨコハマのアドバンスポーツ(ADVAN Sport)のV105からファルケンのジークス(ZIEX)のZE914Fに履き替えたことになるわけだが、正直、まったく差はわからん。ちょっと堅めで、弾力が増して、よりコンフォートっぽくなったような気もするのだが、4年も履いてたのと比べるのもおかしいわね。
ついでに、タワーバーを外したのも、まったく差はわからん。おとなしく運転してただけなので、わかるわけもないと思うが。というか、そんなことなら、外したままでいいことになるけども。
以前「自分にその価値がわからないからと言って、それをバカにする態度を採るのは、みっともない振る舞いである」って書いたけど、逆に「明らかにはわからないのに、何となくわかったような態度を採るのも、みっともない振る舞いである」って思うので、正直に印象を述べておきます。
2024-01-16(Tue) マイナンバーカードで遊んでみる
正直に「パスワードを覚えていない」というと「そうなると手続きが面倒なのよねぇ」とのこと。フムン。いや、たぶんアレとアレなんだが、長い方が特に自信がない。なんとかならんかと思ってググると、短い方がわかるなら、コンビニで長い方を再設定することができるらしい。短い方は割と自信がある。試してみるか。で、無事に再設定することができ、ふるさと納税の手続きも完了した。よっしゃよっしゃ。
と、そこでフトだいぶ前に買ったカードリーダが手元にあることに気づいた。もしかすると、これで読んだりできるのかしらん。早速、やってみた。
$ pkcs15-tool --dump
Using reader with a card: NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader [Vendor Interface] 00 00
PKCS#15 Card [JPKI]:
Version : 0
Serial number : 00000000
Manufacturer ID: JPKI
Flags :
PIN [User Authentication PIN]
Object Flags : [0x12], modifiable
ID : 01
Flags : [0x12], local, initialized
Length : min_len:4, max_len:4, stored_len:0
Pad char : 0x00
Reference : 1 (0x01)
Type : ascii-numeric
Tries left : 3
PIN [Digital Signature PIN]
Object Flags : [0x12], modifiable
ID : 02
Flags : [0x12], local, initialized
Length : min_len:6, max_len:16, stored_len:0
Pad char : 0x00
Reference : 2 (0x02)
Type : ascii-numeric
Tries left : 5
Private RSA Key [User Authentication Key]
Object Flags : [0x1], private
Usage : [0x4], sign
Access Flags : [0x1D], sensitive, alwaysSensitive, neverExtract, local
ModLength : 2048
Key ref : 1 (0x1)
Native : yes
Auth ID : 01
ID : 01
MD:guid : c5a0a252-9d2d-eb60-fec0-41b4fbd722a2
Private RSA Key [Digital Signature Key]
Object Flags : [0x1], private
Usage : [0x204], sign, nonRepudiation
Access Flags : [0x1D], sensitive, alwaysSensitive, neverExtract, local
ModLength : 2048
Key ref : 2 (0x2)
Native : yes
Auth ID : 02
ID : 02
MD:guid : e1bc1dae-59f1-16ab-b43f-9dafbb2acc9b
Public RSA Key [User Authentication Public Key]
Object Flags : [0x0]
Usage : [0x0]
Access Flags : [0x2], extract
Key ref : 1 (0x1)
Native : yes
Path : 000a
ID : 01
Public RSA Key [Digital Signature Public Key]
Object Flags : [0x0]
Usage : [0x0]
Access Flags : [0x2], extract
Key ref : 2 (0x2)
Native : yes
Path : 0001
ID : 02
X.509 Certificate [User Authentication Certificate]
Object Flags : [0x0]
Authority : no
Path : 000a
ID : 01
Encoded serial : xx xx xxxxxxxx
X.509 Certificate [Digital Signature Certificate]
Object Flags : [0x1], private
Authority : no
Path : 0001
ID : 02
X.509 Certificate [User Authentication Certificate CA]
Object Flags : [0x0]
Authority : yes
Path : 000b
ID : 03
Encoded serial : 02 04 0133C349
X.509 Certificate [Digital Signature Certificate CA]
Object Flags : [0x0]
Authority : yes
Path : 0002
ID : 04
Encoded serial : 02 04 0132C4AB
えらくゾロソロと出てくるが、わからんようなわかるようなで面白い。特に冒頭の「PIN」「Tries left」なんて、どう見てもパスワードの失敗許容回数だ。当たり前だがカード内で管理されてるんだな。なかなか高機能なカードであるといえよう。
そのほか「Private RSA Key」「Public RSA Key」「X.509 Certificate」なんてのも、普段からSSLをガチャガチャしているオイラには見慣れた概念だ。証明書の内容を読み出してみる。
$ pkcs15-tool --read-certificate 1
-----BEGIN CERTIFICATE-----
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
:
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
-----END CERTIFICATE-----
$ pkcs15-tool --read-certificate 2 --auth-id 2 --verify-pin
Please enter PIN [Digital Signature PIN]:
-----BEGIN CERTIFICATE-----
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
:
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
-----END CERTIFICATE-----
$ pkcs15-tool --read-public-key 1
Public key enumeration failed: Required ASN.1 object not found
$ pkcs15-tool --read-public-key 2 --auth-id 1 --verify-pin
Please enter PIN [User Authentication PIN]:
Public key enumeration failed: Security status not satisfied
さらに秘密鍵にもなると読み出すコマンドすらない。そもそも「neverextract」だから読み出せなくて正しそう。カードに暗号文を渡し、カード内で(秘密鍵を使って)復号して平文を返してもらう、という形なんだろう。実に高機能なカードである。いくらすんだろね、これ。
カード情報 JPKI
(PIN1) PIN ユーザ認証PIN 4桁 残3回
(PIN2) PIN デジタル署名PIN 6-16桁 残5回
(秘密鍵1) 秘密RSA鍵 ユーザ認証鍵 署名用 機密 2048桁
→読み出し不可
→カード内で復号させる、PIN1で保護されている
(秘密鍵2) 秘密RSA鍵 デジタル署名鍵 署名用 非否認 機密 2048桁
→読み出し不可
→カード内で復号させる、PIN2で保護されている
(公開鍵1) 公開RSA鍵 ユーザ認証鍵
→読み出し失敗
(公開鍵2) 公開RSA鍵 デジタル署名鍵
→PIN2で保護されている、読み出し失敗
(証明書1) X.509 証明書 ユーザ認証証明書
(証明書2) X.509 証明書 デジタル署名証明書
→PIN2で保護されている
(証明書3) X.509 証明書 ユーザ認証認証局証明書
(証明書4) X.509 証明書 デジタル署名認証局証明書
require 'openssl'
cert = OpenSSL::X509::Certificate.new($stdin.read)
puts(cert.to_text)
$ ./pem_dec.rb < UserAuthenticationCertificateCA.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 20169545 (0x133c349)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, O=JPKI, OU=JPKI for user authentication, OU=Japan Agency for Local Authority Information Systems
Validity
Not Before: Sep 14 23:41:59 2019 GMT
Not After : Sep 14 14:59:59 2029 GMT
Subject: C=JP, O=JPKI, OU=JPKI for user authentication, OU=Japan Agency for Local Authority Information Systems
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Subject Alternative Name:
DirName:/C=JP/O=\xE5\x85\xAC\xE7\x9A\x84\xE5\x80\x8B\xE4\xBA\xBA\xE8\xAA\x8D\xE8\xA8\xBC\xE3\x82\xB5\xE3\x83\xBC\xE3\x83\x93\xE3\x82\xB9
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 CRL Distribution Points:
Full Name:
DirName:C = JP, O = JPKI, OU = JPKI for user authentication, OU = Japan Agency for Local Authority Information Systems
X509v3 Subject Key Identifier:
8C:D5:58:6A:89:14:85:E5:59:37:9B:7E:29:D4:10:CF:D2:8B:35:93
公開するとマズいのは、(私自身の)個人情報を含んでいる「(証明書1) X.509証明書 ユーザ認証証明書」「(証明書2) X.509 証明書 デジタル署名証明書」の方だが、前者は(おそらく)マイナンバーの番号だけで、直接的な情報は後者に含まれているはずだ。
X509v3 CRL Distribution Points:
Full Name:
DirName:C = JP, O = JPKI, OU = JPKI for digital signature, OU = CRL Distribution Points, OU = Aichi-ken, CN = Nagoya-shi-Xxxx-ku CRLDP
クサイのは以下。デコードができていないっぽい。そういえば、「othername:<unsupported>」って、先日の自分に会社から支給されている証明書でも出てたな。その時は深く考えなかったけれど。
X509v3 Subject Alternative Name:
othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>
そんならRubyのOpenSSL::ASN1クラスを使ってデコードすりゃええか……と、思ったらその中身がムチャクチャに複雑で、ちっとも意図した結果が得られない。結局、どうにかこうにか再帰を使って出力に成功したが、実際にその中身はムチャクチャに複雑だった。これは再帰なしで書いたら日が暮れるな。文字列なのに、それがデコードできる場合と、単なる文字列の場合があるって、どういう構造なんだよ。
def asn_decode(value, n)
puts('%sdecode[%s]' % [(indent = ' ') * n, value.class])
if(value.is_a?(Array))
value.each {|v|
asn_decode(v, n + 1)
}
else
begin
asn = OpenSSL::ASN1.decode(value)
asn_decode(asn.value, n + 1)
rescue
puts('%smay be string[%s]' % [indent * n, value])
end
end
end
cert.extensions.each {|ext|
puts('*%s' % ext.to_h['oid'])
asn_decode(ext, 1)
}
$ ./pem_dec.rb < UserAuthenticationCertificateCA.pem
*subjectAltName
decode[OpenSSL::X509::Extension]
decode[Array]
decode[OpenSSL::ASN1::ObjectId]
decode[String]
may be string[subjectAltName]
decode[OpenSSL::ASN1::OctetString]
decode[String]
decode[Array]
decode[OpenSSL::ASN1::ASN1Data]
decode[Array]
decode[OpenSSL::ASN1::Sequence]
decode[Array]
decode[OpenSSL::ASN1::Set]
decode[Array]
decode[OpenSSL::ASN1::Sequence]
decode[Array]
decode[OpenSSL::ASN1::ObjectId]
decode[String]
may be string[C]
decode[OpenSSL::ASN1::PrintableString]
decode[String]
may be string[JP]
decode[OpenSSL::ASN1::Set]
decode[Array]
decode[OpenSSL::ASN1::Sequence]
decode[Array]
decode[OpenSSL::ASN1::ObjectId]
decode[String]
may be string[O]
decode[OpenSSL::ASN1::UTF8String]
decode[String]
may be string[公的個人認証サービス]
decode[OpenSSL::ASN1::Set]
decode[Array]
decode[OpenSSL::ASN1::Sequence]
decode[Array]
decode[OpenSSL::ASN1::ObjectId]
decode[String]
may be string[OU]
decode[OpenSSL::ASN1::UTF8String]
decode[String]
may be string[公的個人認証サービス署名用]
decode[OpenSSL::ASN1::Set]
decode[Array]
decode[OpenSSL::ASN1::Sequence]
decode[Array]
decode[OpenSSL::ASN1::ObjectId]
decode[String]
may be string[OU]
decode[OpenSSL::ASN1::UTF8String]
decode[String]
may be string[地方公共団体情報システム機構]
$ ./pem_dec.rb < DigitalSignatureCertificateCA.pem | grep may
may be string[subjectAltName]
may be string[C]
may be string[JP]
may be string[O]
may be string[公的個人認証サービス]
may be string[OU]
may be string[公的個人認証サービス署名用]
may be string[OU]
may be string[地方公共団体情報システム機構]
$ ./pem_dec.rb < DigitalSignatureCertificate.pem | grep may
may be string[subjectAltName]
may be string[1.2.392.200149.8.5.5.1]
may be string[山田 太郎]
may be string[1.2.392.200149.8.5.5.4]
may be string[319700101]
may be string[1.2.392.200149.8.5.5.3]
may be string[1]
may be string[1.2.392.200149.8.5.5.5]
may be string[愛知県名古屋市中区栄3丁目]
may be string[1.2.392.200149.8.5.5.2]
may be string[00000]
may be string[1.2.392.200149.8.5.5.6]
may be string[00000000000000000000]
当然だが上記は改ざんしている。んが、モロに自分の個人情報が入っていた。「デジタル署名」をするという行為は、上記の情報を提供するということであり、それが意図に反して行われないようにするためのものが、長い方のPINコードなのであった。逆に言えば、長い方のPINコードの要求に応じた場合は「自分の個人情報が提供される」ということだ。
しかし、だ。「名前、生年月日、性別、住所」なんて、役所で気にもせずに一番に書面に書き出す内容である。たかが、それだけの情報なのである。マイナンバー制度に関してはマスゴミの意味不明のFUDキャンペーンで、すっかりネガティブイメージが付いてしまっているが、フタを開けてみればそれだけのこと。ボールペンで書くか、PINコードを打つかの違いしかないといえよう。仮に落として紛失したところで、運転免許証と同程度の危険性しかない。