スマホ用熱赤外カメラ FLIR ONE PRO(Android版)を試す

熱赤外(いわゆるサーモグラフィー的な撮影)のために、以前はiOS用に持っていたFLIR熱赤外カメラですが、iOS端末と一緒に手放してしまいました。しかしやはり定期的に熱赤外カメラは使いたくなるわけでAndroid用を買いなおすことにしました。以前使っていたFLIR ONEから、FLIR ONE PROにアップグレードし、Android USB-C接続用が発売されていました(発売自体は2017年らしい)。FLIR ONE PROは、iOS用とAndroid用があるのですが(日本はiOS(iPhone)ユーザーが多いのから?)、iOS用はamazon, yodobashiでも売っているのですがandroid版は在庫がないか、在庫があっても非常に高いか。いろいろ調べた限りAndroid版FLIR ONE PROはアールエスコンポーネンツが一番安く売っていました(在庫があったので即納でした)。おそらく定価はiOS版もAndroid版も一緒だと思うので、日本はAndroid版の流通量が少ないからこんな値段の差がでているのですかね。RSといえば本業ではよく使っていますが、個人でも回路づくり等で電子部品をロジックICなどチップ単位で購入できるので定期的に使っていますが、最近はこんなカメラ単位の製品も扱っているのですね。ずいぶん前の記事「iPadでプリメインアンプの音量を遠隔制御するシステムを作ってみた。」でも紹介していたプリメインアンプを遠隔で制御する回路のNPNダーリントントランジスタICが壊れていたので今回新調して久しぶりに動かしました。それにしても近年の半導体不足は深刻で、FPGAなどはどこにも売っていないですね・・。

さて、FLIR ONE PROを開封してゆきます。

FLIR ONE PRO (Android USB-C接続)

以前の旧型Android版は、microUSB用だったので当時としてUSB-C版が出るまで待とうと思い、とりあえずiOS版を買った記憶があります。その後2017年になってFLIR ONE PROになりUSB-C版で発売されていました。

See the Heat.
うん。かっこいいw
FLIR ONE PRO (Android用 : USB-C)
専用ソフトケースがついていました。

このとても暑い夏にむけてパシャパシャ撮影してみました。スマホはGoogle Pixel 4a。USB-CのAndroidであれば必ず動作するとは限らないので購入前にご確認ください。さすがにGoogle Pixelは大丈夫かなとおもいましたが、やはり全く問題ありませんでした。

部屋の撮影:エアコンの冷気出口が明確にわかりますね。
木々の中で前を歩いていた人。
木々に比べると人体は暑いですが、体温が30.6度では低いので絶対温度計測はもう少し工夫がいりそうです。
真夏の炎天下で道・橋・建物はチンチンに暑そうです。
道・橋・建物に比べると空は温度が低く見えますね。
その中でも人体は高く表示されていました。車が通ると車の排気ガスの部分が一番熱く検出されていました。
大きな鏡があったので自分自身を鏡で撮影してみました。
熱赤外って鏡で反射するのですね(あたりまえか)
やはり自分の体温も31.8度ってことはないのでやや低く出ますね。キャリブレーション機能があるようなのでもう少し調査してみます。
動画も撮影可能です。

今回はとりあえずFLIR ONE PROのクイックな撮影テストをしてみました。温度に応じた着色の仕方、キャリブレーションの仕方(絶対温度がどうもあっていない)などもう少し使い慣れたら再度レビューしたいと思います。

Windows11 Pro(Preview)での主要写真・映像系アプリ人柱動作確認。Photoshop, Lightroom, CaptureOne, X Raw Studioなど

Windows11 Pro (Release Preview: 22000.176)で写真・映像系アプリを動作確認しました。 2021/10/05に正式リリースされるWindows 11 Proですが、Windows Insider Program経由で入手可能です。残り1か月となり正式リリースにかなり近い状態ということで各種アプリの動作確認をしました。動作するのか気になっている方のお役に立てばと思います。 何か試してほしいソフトウェア・アプリがございましたら動画のコメント欄にどうぞ。

0:00 導入
2:14 Win11の映像系(HDRなど)、Photoshop動作(30bitカラー)
5:16 Lightroom Classic + MIDI2LR
7:14 Capture One 21 Pro + テザー撮影テスト
7:59 Davinci Resolve 17 Studio + NVENCレンダーテスト
10:53 PhotoMechanic Ver6.0
12:37 set.a.light 3D Studio 2.5
15:15 FUJIFILM X RAW STUDIO + USBカメラRAW現像テスト
17:35 Photomatix Pro (HDR)
18:08 まとめ

<留意>
・2021/09/05時点での検証です
・あくまで私の環境での簡易テストですので、業務やクリティカルな場面での先行導入には十分なテスト等別途実施ください。
・Win 10 Pro(64bit)最新版ですでに写真・映像系アプリはインストール済みの状態で、Win11にアップグレードした状態でテストしています(Win11のクリーンインストールではありません)。
・Ryzen 5 3600, GTX1070の環境です。

Lightroomのカタログから好きなレンズ・撮影傾向の分析方法と富士フイルムのおすすめレンズの紹介。SQLiteによる詳細な分析方法。

Adobe Lightroom Classicのカタログファイルは自己の撮影傾向・使用レンズなどを分析するのに最適です。ライブラリモジュールのメタデータフィルターを活用し、自分がどんなレンズでたくさん撮影しているのか等を客観的に判断できます。
富士フイルムに移行して約15万枚の撮影をした結果、どのようなレンズを使っていたかを分析し、フジノンレンズの個人的なオススメレンズを紹介したいと思います。 動画後半:Lightroom Classicのカタログファイルは、SQLite形式なのでデータベース・分析になれている形向けにテーブル情報等の紹介・簡単な分析クエリを紹介します。

<動画の流れ>
0:00 動画の概要・目的
0:45 動画の流れ(1年8ヶ月で富士フイルム機で撮影した約15万枚の撮影データから、使用頻度の多かったレンズをLightroom Classicを用いて分析)の紹介
2:23 Lightroom Classicを用いたカタログでのデータ分析の紹介。XF35mmF1.4, XF56mmF1.2, XF90mmF2がやはり撮影枚数が多かったオススメレンズ。
9:53 動画前半のまとめ。ご自身のカタログで同様の分析をして新しい可能性を広げるには?
10:45 動画後半:Lightroom Classicのカタログ(SQLite形式)を実際にSQLiteクライアントでアクセスして、テーブル構成の説明、クエリを発行してみます。

<動画後半のテーブル情報・クエリ情報>
画像単位のテーブル(撮影日・フォーマット(Bit深度,RAW,JPEG)、画像サイズ・・・)
SELECT * FROM Adobe_images;

Exif単位のテーブル(撮影日・絞り・焦点距離・ISO・SS・GPS・カメラ・レンズ・・)
SELECT * FROM AgHarvestedExifMetadata;

カメラ単位のテーブル
SELECT * FROM AgInternedExifCameraModel;

レンズ単位のテーブル
SELECT * FROM AgInternedExifLens;

焦点距離別グループ化の撮影枚数(例)
SELECT focalLength,count(id_local) AS shots FROM AgHarvestedExifMetadata GROUP BY focalLength

ISO別グループ化の撮影枚数(例)
SELECT isoSpeedRating,count(id_local) AS shots FROM AgHarvestedExifMetadata GROUP BY isoSpeedRating

レンズ名グループ化の撮影枚数(例)
SELECT T_LENS.value AS lensName, count(T_EXIF.id_local) AS shots FROM AgHarvestedExifMetadata AS T_EXIF LEFT JOIN AgInternedExifLens AS T_LENS ON T_EXIF.lensRef = T_LENS.id_local GROUP BY T_LENS.value

カメラ名グループ化の撮影枚数(例)
SELECT T_CAMERA.value AS Camera,count(T_EXIF.id_local) AS shots FROM AgHarvestedExifMetadata AS T_EXIF LEFT JOIN AgInternedExifCameraModel AS T_CAMERA ON T_EXIF.cameraModelRef = T_CAMERA.id_local GROUP BY T_CAMERA.value
*留意:あくまでカタログファイル(.lrcat)をコピーしてから行い、本カタログデータを破壊しないようにご留意ください。

<関連動画>
Fujifilm X-T3 長期使用レビュー(X-T4, X-H1, Canon/Sonyなどとの比較も)(その1)
https://youtu.be/QZZqtZBui9g

<動画中の製品リンク>
Fujifilm X-T3 : https://amzn.to/2VnijBV
Fujifilm X-T4 : https://amzn.to/3a8SgnC
Fujifilm XF10-24mmF4 R OIS : https://amzn.to/3eeVCIG
Fujifilm XF23mmF2 R WR : https://amzn.to/3efxF43
Fujifilm XF35mmF1.4 R : https://amzn.to/3a3DGO3
Fujifilm XF56mmF1.2 R : https://amzn.to/2Vqi88U
Fujifilm XF90mmF2 R LM WR : https://amzn.to/3b4Thhs
FRINGER EF-FX PRO II : https://amzn.to/3b6dgfK
Canon EF70-200mm F2.8L IS III USM : https://amzn.to/2V0ULnl

ODROID-C4を通販しAndroid 9.0 + Google Play Storeインストール方法。Adobe Lightroom CCアプリで富士フイルムX-T4 RAW現像テスト

ODROID-C4を海外から通販購入し、Android 9.0をインストールの仕方、そしてGoogle Play Storeのインストールする方法を紹介。Google Play Storeを動かす為のAndroid IDの登録の仕方の紹介。その後Adobe Lightroom CCアプリをいれて、Fujifilm X-T4のRAW現像をテストしてみます。 動画の目的として、NotePC(Windows, MacOS)を使わないで将来RAW現像ができるか、その可能性を探ります。
ODROID-C4は約5000円少しで購入できるシングルボードコンピューターで、Ubuntu(Linux), Android 9.0などをインストールできます。Raspberry Piのライバルとして有名です。今回はAndroidインストール動画ですが、いずれLinux (Ubuntu)インストール動画も作りたいと思います。

<動画の内容>
0:00 動画概要・目的
1:39 動画の流れの紹介
3:39 ODROID-C4のスペック概説
6:08 ODROID-C4の各部を実機で概説。オプションや同時購入したものの紹介。明細。
9:50 Windows 10でのODROID-C4用Android 9.0 OS(起動用)MicroSDカードの準備
14:30 ODROID-C4でのAndroid 9.0初起動画面・初期設定。Open GAppsからGoogle Play Storeのインストール
21:35 再起動後、Google Play Storeがエラー通知(Play Protectの未承認デバイスエラー)を出すため、それを抑える為にAndroid ID(Google Service Framework : GSF)の取得と、登録(回避)
29:22 Google Play Storeが正常動作。Androidアプリのインストール
31:19 Adobe Lightroom CC(Android)版でFujifilm X-T4のRAW(.RAF)ファイルを現像テスト。まとめ。

<動画中の関係URL>
ODROID-C4 (HardKernel official)
https://www.hardkernel.com/shop/odroid-c4/

Etcher (MicroSDカードに書き込み)
https://www.balena.io/etcher/

The Open GApps
https://opengapps.org/

Device ID : (APKMirror : Evozi APKs)
https://www.apkmirror.com/apk/evozi/device-id/

Google非認証端末登録ページ(Android ID登録) https://www.google.com/android/uncert…

誤って削除したSDカード上の画像ファイルを復元

先日、某行政のサーバーのHDDがヤフーオークションに転売され、購入した方がデータ復元したところその行政が管理する個人情報が見つかる(復元できた)という事件が起きました。

近年HDD、SSD、SDカードなど多くのストレージメディア・媒体があるわけですが、たとえばFAT系のファイルシステムでは、単純なファイル削除を行った場合に、そのファイルのデータをビット単位で完全に削除している訳ではありません。そのファイルの「管理情報」(正確にはDIR_NAMEフィールドの0バイト)にファイルが削除されたというフラグ(例えば0x05と設定)を立てることで「そのファイルは削除したこととする」というルールとし、そのファイルの「本体データ」は自体は削除されていません。OSやカメラなどからはこのフラグ処理でファイルは見かけ上認識されなくなります。その為、ファイルの復元とは、このDIR_NAMEフィールドの0バイトを元に戻してあげれば、OSからファイルが再認識できるようになります。ただし、削除後に新しいデータを書き込んでしまい、復元したかったファイルが保存されていた領域に新たなデータが書き込まれてしまいますと復元は技術的に不可能となります。そういう意味でも、誤って削除した場合にはそのドライブ・SDカードなどに新しい書き込みをしないというのが鉄則です。

今回こんな記事を書いているのは、ちょっとした凡ミスで撮影画像ファイルが消えてしまいまして、その後無事復元できたので紹介します。

<参考>
ファイルシステムに興味があれば、SDカードなどで一般的に使われているファイルシステムのexFATが2019年にMicrosoft社から仕様が公開されたのでご覧ください。

参考1) exFAT file system specification – Win32 apps | Microsoft Docs
参考2) FATファイルシステムのしくみと操作法 (ELM by ChaN)

<経緯・現象> 
撮影してきたカメラからSDカードを取りだし、USBカードリーダー経由でWindows 10 PCにファイルを転送する際に、少し訳ありで転送先の保存に失敗しました。本来SDカードからの大切な画像データの転送は

1)SDカードの画像から、転送先に「コピー」
2)転送先でのデータ転送の「成否の確認」
3)2)の確認後、SDカードの画像を「削除」。
(*Windows等のファイル削除ではなく、カメラ内機能でのフォーマットが良いと思う)

とするのが必要なフローですが、ものぐさで、SDカードから転送先へ「移動」を選び、訳ありの理由で転送先での保存に失敗しました。その為、SDカード上での画像ファイルも失われたという状況でした。

<復元作業>
復元に際して、ファイルシステムを理解して削除フラグを変えるソフトを自作してもよいのですが、巷にはいくらでもソフトが溢れているのでそれを利用します。検索したら一番最初に出てきたEaseUS Data Recovery Wizardを使ってみます。この手のソフトはフリー版と有償版があり、フリー版は復元ファイル数に制限があるか、復元できそうという結果だけわかり復元するには有償版へというソフトが多い。とりあえず2GBまではFree版で使えるということで使って見ました。はっきり言って使い方は説明する必要もなく直感で分かると思います。

SDカード( J:ドライブ)をクリックしてスキャンするだけ。
削除された4つのファイルがすぐに検出され、「削除されたファイル(4)」として表示されるので、選択して右下の「リカバリー」ボタンを押し、復元保存先を指定するだけです。
またSDカード全体のスキャン完了を待たずして復元作業ができるのでサクサク復元できました。
*言うまでもなく復元保存先はSDカード以外を選択すべきです。
こんな感じで4つの誤って削除した画像(JPEG + Fujifilm RAW)が復元。
アイコンのサムネイルが表示されているように全くファイルは壊れていませんでした。

上記の通りWindowsのエクスプローラーで削除(または移動による削除)では、直後に実行すればほぼ確実に復元できそうな感じです。12枚ほど削除しては復元するを繰り返してみましたが100%復元できました。SDカード全体とか多量のファイルを復元する際には、有償版(Pro)を購入する必要があるかもしれません。

次におまけの実験で、カメラの画像再生での消去を試してみました。

カメラ(Fuji X-T3)の機能として画像削除
結果としては、JPEGは復元可能、RAW(Fujifilm RAF)は復元不可でした。

何回やっても、RAWの復元は失敗でした。これは、カメラ(X-T3)側のファイル削除が何か特殊なのか、原因はわかりません。一方で、カメラ側で画像を削除するという行為自体、基本的には避けるべきだと思います。ピンボケ、手ぶれなど明らかに撮影に失敗することもあるかと思いますが、今やSDカード等のメモリも大容量で千枚単位で撮れると思いますので、失敗しても現場でカメラ機能では削除せず、あとでPC等で消せば良いのです。上記の通り復元にも失敗するケースもありますし、手元の操作ミスで成功した写真も誤って消してしまう可能性もあるので、そういう意味でもカメラ側で画像を削除するのは避けるべきだと思います。

<まとめ>
ファイル復元ソフトを使えば、大方のファイルは削除直後なら復元できる。
・カメラ内機能での削除はRAWファイルは復元できなかったが、そもそもカメラ側で画像は消すべきではない。
・SDカードからPCへの転送は、コピー → 転送先確認 → 削除のフローを行った方が良い。プロなんかは、転送先で更にバックアップをとってからSDカード等の画像を消すという人も多いでしょうね。
・あと、何かあったときに焦らないように削除して復元するというフローを1度試しておくと良いかと思います。

Chrome ver58以降の自己署名証明書(Self-signed certificate)のエラー対策 (net::ERR_CERT_COMMON_NAME_INVALID) : SAN追加

自己署名証明書(Self-signed certificate = いわゆるオレオレ証明書)を使ったWeb ServerにChromeの最新版(Ver 58 : 2017/04/28現在)でアクセスすると
`net::ERR_CERT_COMMON_NAME_INVALID`というエラーが出て接続ができなくなりました。その対策です。いろいろ情報は出ていますが、少数派と思われるWindows Server CAによる署名では情報が少なかったのでシェア。

時代の流れで常時TLSが一般的になりつつあり、LAN内でもWindows Server 2012 R2の証明機関(CA)機能による自己署名証明書を発行し、同じくLAN内のWeb Server (Apache2 on Linux)で利用していましたが、先週からChromeでエラーが出るようになりました。いろいろ調べてみると、最新版のChrome ver58以降から、Self-signedの証明書はエラーを出すらしく、いろいろ海外のサイト等で議論されていました。
私は、証明書(X.509v3)にマルチドメインなどに使うSAN (Subject Alternative Name) =日本語で「サブジェクト代替名」を拡張領域(フィールド)に追加し、そこにホスト名等を埋め込むことで対応することができました。この部分は、RFC2818で推奨されているようです。

<該当部分引用:from RFC2818>

If a subjectAltName extension of type dNSName is present, that MUST
be used as the identity. Otherwise, the (most specific) Common Name
field in the Subject field of the certificate MUST be used. Although
the use of the Common Name is existing practice, it is deprecated and
Certification Authorities are encouraged to use the dNSName instead.

<環境条件>
C1) LAN内オンプレのWindows Server 2012 R2にcertsrv (証明機関)および、IIS上にウェブサービスの`Microsoft Active Directory 証明書サービス`(以下Web CertSrv)が起動しているものとします。
C2) LAN内ウェブサーバーは、Apache2 (on CentOS7)とします。
C3) 証明書は、ECCなんぞハイカラなモノは避けて、RSA2048bitで保守的に。

<解説>
エラーが出る前までは、Web ServerのLinux上のOpenSSLでCSRを発行し、それをWindows ServerのWeb CertSrvで署名をして証明書をダウンロードし、Apacheのssl.confに追加していました。いろいろな海外サイトでは、Linuxサーバーの証明機関で自己署名をしているので、それでも完結(解決)できるはずですが、今回はWindows Server 2012 R2にリモートデスクトップで入り、その中にWindows版のOpenSSLを使ってCSRを作り、Web CertSrvで署名をしました。

<手順>
P1) Windows Server 2012 R2に管理者権限のあるアカウントでリモートログイン

P2) 管理者コマンドプロンプトにて、証明書へのカスタム属性対応を設定します。
c:\> certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2

P3) 証明機関サービスを再起動
c:\> net stop certsvc
c:\> net start certsvc
→これで、内部CAが、SANの拡張領域に対応できます。

P4) Windows版OpenSSLのダウンロードとインストール:Shining Light Productions – Win32 OpenSSL
* 2017/04/28現在:Win32OpenSSL-1_1_0e.exe (WIN32 OpenSSL v1.1.0e)を入れました。これを書いていて気がついたのですがWin64の64bit版もあったのですね・・。Windows Server 2012 R2自体が64bit版なので、Win64を使うべきかと思います。私は気がつかずWin32版で行いました。C:\OpenSSL-Win32にインストール

P5) “C:\OpenSSL-Win32\bin\openssl.cfg”のコンフィグファイルを編集します。
[ v3_req ]という箇所を見つけて、以下の通り編集します。

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]

DNS.1 = hoge.abc.yourdomain.com
DNS.2 = hoge2.abc.yourdomain.com
DNS.3 = abc.yourdomain.com

SANに追加したいホスト名・ドメインを追加して行きます。SANはマルチドメイン用のフィールドなので何個書いてもOKだと思います。私はWebセーバーのFQDN(LAN内ローカルドメイン)も入れておきました。

P6) コマンドプロンプト(管理者)で、”C:\OpenSSL-Win32\bin”に入ります。

P7) 秘密鍵の生成(RSA2048bit) : openssl genrsa 2048 > server.key

P8) 署名リクエスト(CSR)の作成 : openssl req -new -key server.key -config openssl.cfg > server.csr
-configのスイッチで上記で編集したopenssl.cfgを読み込んでCSRを生成します。
*ここで、Common Nameは、公開するウェブサーバーのFQDNを入れておくのが無難な気がします。たぶん。

P9) Windows Server 2012 R2 CAのWeb CertSrvにアクセスしますが、いろいろな理由で付属のIE11でアクセスするのがよさそうです(Windows Server 2012 R2へリモートデスクトップで入っている状態で、その中のIE11)。LAN内の他のPCからのChromeアクセスなどでは上手くうごきませんでした。

IE11にて:https://YOUR_AD_SERVER/certsrv
*TLS(SSL)でアクセスするのでエラーが出ても続行する。TLSでアクセスしないと署名ができない。

P10) SAN属性を入力して署名をする。

*CSRのBASE64で貼り付けるのはいつも通り。
*追加属性の部分に、以下のフォーマットでSANの情報を追記する。おそらくP2), P3)の作業をしていないとこの属性を入力しても証明書にSANが追加されないと思われる。

追加属性フォーマット(SAN): san:dns=hoge.abc.yourdomain.com&dns=hoge2.abc.yourdomain.com&dns=abc.yourdomain.com

と好きなだけ追加する。

P11) 送信ボタンを押して(CAで署名)をして証明書をダウンロードし(例えばcertnew.cer)、ダブルクリックして証明書を表示する。

*赤枠にあるように「サブジェクト代替名」(=SAN)で、追加されているのが分かります。

P12) P11)の証明書(server.cer)と、P7)の秘密鍵(server.key)をLinuxサーバーにコピーし配置します。
CentOS7であれば、/etc/pki/tls/certs/以下でしょうかね。パーミッションは600。

P13) Apache2のssl.confを修正しデーモンを再起動

SSLCertificateFile /etc/pki/tls/certs/server.cer
SSLCertificateKeyFile /etc/pki/tls/certs/server.key

P14) LAN内のいろいろなホストから最新のChrome (ver58以降)でアクセス https://FQDN/
無事にエラーがなく表示できれば成功。

*Active Directoryを使っていれば当然だと思いますが、自己署名証明書をクリアするために、CAをグループポリシーで配布してある前提です。(certmgr – 信頼されたルート証明機関 > 証明書にWindows ServerのCA証明書が入っているのは前提です。

*参考:
R0) Chrome Deprecates Subject CN Matching – text/plain
R1) Configure Internal Windows CA to issue SAN certificates
R2) FAQ/subjectAltName (SAN)
R3) ssl – Generating a self-signed cert with openssl that works in Chrome 58 – Server Fault

*備忘録メモ:IISサーバー証明書インポート向け.pfx作成方法
M1) openssl pkcs12 -export -inkey server.key -in server.cer -out server.pfx

IPv6対応

四苦八苦してこのサーバーもIPv6対応しました。日本のIPv6化は一体どうするのだろう・・。すんなり行くとは全く思えない。
とはいえDNSのAAAAレコードがふらふらでいまいち安定せず。
原因は、いままでいわゆるNaked Domainのspacewalker.jpというのを使っていましたが、AレコードとAAAAレコードをNakedに対応するようにワイルドカードを使うとこれがまた超不安定。
やはりwww.なり、何か入れないとIPv4, IPv6の現在のデュアル運用をせざるをえない日本の状況下では不安定すぎて困りもの。Nakedドメインでうまく行っている人いるのかな?(DNSが自前サーバーでないので細かく設定できないんだけども)
* その前にWindowsの名前解決がIPv6とIPv4の優先度がころころ変わっているのか、何もしていないのに突然接続不良になったりとイマイチ動きが掴めていないです。

もしIPv6アクセスを実現されているかたは、うちのトップページ
www.spacewalker.jp
にアクセスしただければ、下のようにIPv6の大きなロゴが表示されるはずです。
表示がないとIPv4アクセスです。どうでしょ?

20160105_WebIPv6

一応これでIPv6 + HTTP/2 + 常時TLSという今流行りの仕様が実現しているはず。ただスマホで使っているUQ-MobileがいまだIPv6未対応で困りもの。IIJ(MVNO)はいち早く対応しているようです。

*あまりに不安定なので暫定対応です。

公開鍵暗号と電子署名の復習

マイナンバーに付属の個人番号カード(マイナンバーカード)でも、利用されている公開鍵暗号電子署名技術。
そして、Let’s Encryptも含めウェブに関しては常時TLS化が始まっている時代。その認証基盤技術である公開鍵暗号と電子署名の基礎をステップごとに復習します。
公開鍵認証に関しては比較的新しいECC楕円などもありますが、いろいろな場面では未対応のシステムが多いことがわかり、2015年11月現在で標準的な
公開鍵暗号方式:RSA 2048 bit
共通鍵暗号方式:AES 256 bit
暗号学的ハッシュ関数SHA-2(SHA-256)
を用いることにします。SHA-2に関しては64bit環境では、SHA-512などが良いのでしょうが、スマートカード内CPUはまだまだ32bit環境も多いため、SHA-256とします。

*テスト環境:Cent OS 7 (64bit), OpenSSL 1.0.1e-fips 11 Feb 2013
*留意:2015/11/22時点での記事です。未来で参照する場合は最新技術、特に上記の方式なども使用禁止などの可能性があるのでご留意ください。

<その1:公開鍵暗号を用いてテキストファイルを暗号化・復号化>

1) 秘密鍵の生成(RSA 2048bit, X509 .PEMファイル)
# openssl genrsa 2048 > private_key.pem
秘密鍵`private_key.pem`ができました。(パスフレーズなしの秘密鍵)

2) 公開鍵の生成(秘密鍵より公開鍵を作成します)
# openssl rsa -pubout < private_key.pem > public_key.pem
公開鍵`public_key.pem`ができました。

3) それほど長くない暗号化するための平文テキストファイルを生成します。
# echo ‘hello, encrypt / decrypt world’ > test_plain.txt
text_plain.txtという31バイトの平文テキストファイルが生成されました。これを暗号化・復号化してみます。
それほど長くないという意味は、鍵長が2048bitなのでそれを超えるファイルサイズの物は原理的に暗号化できない。

4.1) 公開鍵で暗号化
# openssl rsautl -encrypt -pubin -inkey public_key.pem < test_plain.txt > test_plain.txt.encrypted
text_plain.txt.encryptedという暗号化されたバイナリファイルが生成されています(256バイト)
以上でテキストファイルを暗号化することができました。

4.2) 秘密鍵で復号化
# openssl rsautl -decrypt -inkey private_key.pem < test_plain.txt.encrypted > test_plain.txt.decrypted
text_plain.txt.decryptedというテキストファイルが生成されているはずです(31バイト)。
これで無事に元の平文テキストファイル(ファイルサイズも同じ)を復号化して生成することができました。

*補足:4.1), 4.2)は公開鍵で暗号、秘密鍵で復号でしたが、公開鍵暗号はその逆もできることが電子署名技術で重要な考え方です。つまり秘密鍵で暗号化されたものは、秘密鍵でのみ復号化できるという公開鍵暗号=非対称暗号の特徴です。
そこで試してみようと調べてみたらopenssl rsautlは秘密鍵で暗号、公開鍵で復号はできないようです。試してみたら復号化時に`A private key is needed for this operation`というエラーが出てしまいます。
つまり、秘密鍵での暗号に関しては、電子署名のみに使うことが前提となっているようです。
(非対称暗号の原理・特徴の前に実利用的なことを考えるとあたりまえかな。テストだけしてみたかったのですが)

*補足:あまり長いファイルを暗号化できないと上述しましたが、ではウェブのHTTPS(SSL/TLS)やSSHのリモートログイン時などはどうしているかというと、あくまで多量なデータ・ファイルの通信には暗号化・復号化の速度も速い共通鍵暗号を用いており、その共通鍵の受け渡しに今回の公開鍵暗号を使っているわけですね。

おまけ)共通鍵暗号(AES 256bit)を用いたファイルの暗号化・復号化
暗号化:
# openssl aes-256-cbc -e < test_plain.txt > test_plain.txt.AES256
暗号化するための共通鍵を問われますので何か入力して暗号化します。test_plain.txt.AES256という暗号化されたファイルが生成されます。

復号化:
# openssl aes-256-cbc -d < test_plain.txt.AES256 > test_plain.txt.AES256.decrypted
同じく復号化するための共通鍵を問われますので暗号化時に入力したものを入力します。test_plain.txt.AES256.decryptedというファイルで復号化されているはずです。

<その2:何らかのファイルに電子署名をし、そのファイルが途中で第三者に改ざんされていないかを確認する>

秘密鍵はその名の通り、厳密に秘密に管理され、その鍵を使用する個人しか持っていないとされている鍵です。これは言葉で書くのは簡単ですが、実際には上記でテストしたように秘密鍵をPC上などでファイルで扱うのは本当に`秘密`にしておけるのかというのが難しい問題です。そのPCがウイルスに侵されてファイルが盗まれたとか、もっと単純に他の人がログインをしてUSBメモリにコピーされたなど。その問題に対して、スマートカードやUSBトークンなどがあり、そのカード内に秘密鍵を保持し、その秘密鍵は取り出すことも複製もできなくすれば良いわけです。今回のマイナンバーにおける個人番号カード(スマートカード)も希望者にはマイナンバーの他に秘密鍵などが書きこまれた状態で取得できるはずです。最近のスマートカード(おそらく個人番号カードも)は内部にCPUを持っており、鍵生成・認証等の処理をカード内で行い、カードから秘密鍵等を端末まで出してこなくても処理ができるので、使用した端末に秘密鍵が残ることはほぼないはずです。NFCの電力伝送で非接触カード内CPUを動かしてRSAなどの演算をさせるのはやや大変な気がするので、個人番号カードはカードリーダーを用いる接触型が多いのではないかなと思います。しかし、スマートフォンのNFCで個人認証などをする未来を考えると、非接触でカード内認証ができるほうが良い様な気もします。スマートフォンにカードリーダーをつけるわけにはいきませんしどうなるのでしょう。FelicaやMIFAREなどの非接触カードで、公開鍵認証ができるものは無いような気がするのですが、そういう製品が出ているのですかね。マイナンバー特需でメーカーもがんばっているかもしれません。

さて、電子署名に関してですが、秘密鍵はその個人が唯一持っている鍵であることと、公開鍵暗号の非対称性を利用して行うものです。つまり秘密鍵で暗号化されたものは、公開鍵で復号できる特徴です。
(電子署名技術はいろいろ種類がありますが、有力である公開鍵暗号方式に基づくデジタル署名ということで話を進めます)
基本的な流れを復習すると

(い)Aさんが大切な文章をWordファイルで作成。(今回たまたまWordファイルを例にして紹介していますが、どんなファイルでも同じです)
(ろ)Aさんは、秘密鍵を使ってWordファイルで暗号化する。
(は)Aさんは、取引先のBさんに、Wordファイル原本と、暗号化したファイルの2つを渡す。
(に)Bさんは、届いた2つのファイルの内、暗号化されているファイルを公開されているAさんの公開鍵で復号する。
(ほ)Bさんは、Wordファイル原本と、Aさんの公開鍵で復号したWordファイルを比較する。
(へ)2つのファイルがまったく同じものだったら、「これはAさんが作成されたものに間違いなく、他の人が改変などしていない」ことと判断できる。

となるわけですね。これは秘密鍵がAさんしか持っていない特徴によって実現できるものです。
ただし一般的に‘電子署名をする‘といったら、上記の方法の様にWordファイル全体を暗号化して送ることはしません。公開鍵暗号で大きなファイルを暗号化するのは処理的にも重いものですし、Bさんに2つのファイルを転送するのは転送量も2倍(以上)になり、また巨大な2つのファイルをバイナリ・ビットレベルで比較するのも大変であるからです。
そこで、暗号化ハッシュ関数を用います。Wordファイル(Wordに限らずどんなファイルでもOK)にハッシュ関数を計算すると、Wordファイルの大きさにかかわらず同じ長さのハッシュ値(メッセージダイジェストとも表現される)を取得できます。ファイルの内容が1bitでも異なるとこのハッシュ値は異なりますので、1つのファイルに対して確実に1つだけのハッシュ値を生成できます。またハッシュ値からファイル本体を復元(復号)することはできません。つまり上記の(い)~(へ)を暗号化ハッシュ関数を用いると

(い)Aさんが大切な文章をWordファイルを作成し、またハッシュ関数でそのファイルのハッシュ値を生成。
(ろ)Aさんは、ハッシュ値を秘密鍵を使って暗号化。そのことを‘電子署名する‘と言います。「このファイルの電子署名をお願いします」と頼まれたらハッシュ値を取ってそれを秘密鍵で暗号化することを意味します。
(は)Aさんは、取引先のBさんにWordファイル原本と、(ろ)で生成した電子署名(ハッシュ値を暗号化したもの)の2つを渡す。
(に)Bさんは、受け取った電子署名を、Aさんの公開鍵で復号し、Aさんが生成したハッシュ値を取得します。
(ほ)Bさんは、受け取った原本のWordファイルのハッシュ値を求め、(に)で取得したハッシュ値と比較します。
(へ)2つのハッシュ値がまったく一緒だったら、「これはAさんが作成されたものに間違いなく、他の人が改変していたらハッシュ値もかわるはずなので、改変はない」と判断できる。

以上を踏まえ、OpenSSLで電子署名の動きを実際に確認してみます。

5) 上記の例に沿ってWordファイルを用意します。
5.1) 正しいWordファイル(test_word1.docx : 835666バイト)
5.2) 正しいWordファイルを改変したファイル(test_word2.docx : 835812バイト)

6) 正しいWordファイルをSHA-256でハッシュを取得してみます(参考)
# sha256sum test_word1.docx
ハッシュ値:b37c7c542a5af29ef6edb5e1cb2406385121c46e1b406361d80e9e6d6c5df9f6
*本来はこのハッシュ値を秘密鍵で暗号化すれば電子署名になりますが、上述のとおり秘密鍵で暗号化がOpenSSLではできないのでこのハッシュ値の取得は参考例です。

7) 正しいWordファイルをSHA-256でハッシュ値(ダイジェスト)を求め、秘密鍵で暗号化します(つまり電子署名します)
# openssl dgst -sha256 -sign private_key.pem test_word1.docx > test_word1.sign
test_word1.signというバイナリファイル(256バイト)が生成され、電子署名となります。

8) ここからは別の人が2つのWordファイル(正しいもの、改変されたもの)、そして7)の電子署名を受け取ったことにして、電子署名を公開鍵を用いて検証します。
– 正しいファイル(test_word1.docx)の場合
# openssl dgst -sha256 -verify public_key.pem -signature test_word1.sign test_word1.docx
Verified OKと出て検証OKです。

– 改変ファイル(test_word2.docx)の場合
# openssl dgst -sha256 -verify public_key.pem -signature test_word1.sign test_word2.docx
Verification Failureと出て、改変された(少なくとも電子署名をしたファイルではない)ことが分かります。

まとめ
・公開鍵暗号、電子署名をOpenSSLを用いて実際の動作をステップ毎に確認しました。
・今回秘密鍵生成を‘パスフレーズなし‘で行いましたが、実利用では秘密鍵の使用を制限するパスフレーズを設ける必要があります。スマートカードならPIN(Personal Identification Number)になります。
・実際にはOpenSSLを実装したシステム・ソフトが勝手にこの作業を行ってくれています。
・公開鍵に関して雑に扱いましたが、公開鍵は信頼できる第三者機関(Trusted Third party)が信頼できる公開鍵ですよとして公開されている(つまり電子証明書=公開鍵証明書)のが望ましく、それが前提となっています。
・日本において印鑑は血判状なども含め大切にされてきました。一方で今のグローバル時代には非効率であるという点は避けられない事実です。電子署名は法律的にも認められていますし、印鑑の良さを残しつつ、スマートな契約等が進むと良いですね。