December 11, 2017

Debian JP Blog

第 158 回 東京エリア Debian 勉強会のお知らせ

東京近辺にいらっしゃる皆様こんにちは。2017年最後の東京エリア Debian 勉強会が開かれます!

東京エリア Debian 勉強会とは、Debian Project に関わる事を目的とす る熱いユーザたちと、実際に Debian Project にてすでに日夜活動している人 らが Face to Face で Debian GNU/Linux のさまざまなトピック (パッケー ジ、Debian 特有 の機能の仕組について、Debian 界隈で起こった出来事、 etc ) について語り合う場です。当然ですが、Debian Project に何らかの貢献 をしたいという目的を持つ方であれば、自身で活動できるように手助けをする事 も主な趣旨の一つとしています。

参加される方は主に東京を中心に関東近郊の国籍・性別不問の Debian ユーザです ( Debian をまだ使ったことが無いが興味があるので…とか、かなり遠い所から来てくださる方もいます)。 開発の最前線にいる Debian の公式開発者や開発者予備軍の方も参加する場合がありますので、 普段は聞けないような様々な情報を得るチャンスです。 興味と時間があった方、是非御参加下さい。 (また、勉強会で話をしてみたいという方も随時募集しています)。

開催日時・会場
  • 日時:2017 年 12 月 16 日 ( 土曜日 ) 14:00-19:00
  • 費用:100 円 (資料印刷代・会場費として)
  • 会場:株式会社朝日ネットさん(地図
  •  
  • 当日について:Debian に関する作業時間 ( hack time ) を勉強会中に用意しています。詳しくは勉強会のページを参照して>ください。
内容
  1. GCCのPIEオプションとDebianにおける状況について(dictoss さん)
    stretch からデフォルトで有効になった位置独立実行形式を作成するためのGCCオプション PIE の状況についてお話します。
  2.  
  3. hack time (全員)
    Debian に関する作業を各自で行います
  4. 成果発表 (全員)
    行った作業について簡単に発表いただきます
事前課題/参加申し込み方法
勉強会のページを参照して、参加登録をしてください。

事前課題は参加登録時に表示されるアンケートに入力してください。提出いただいた回答は全員に配布すること、また内容の再利用を実施することを了承ください。 Debian 勉強会資料は GPL で公開します ( Web での公開が可能な内容でお願いします)。
課題内容の実施についてなにか質問があれば、 Debian ユーザ用公開メーリングリスト ( debian-users@debian.or.jp ) にてお願いします。

この件に関するお問い合わせは Debian 勉強会主催者:吉野 (yyoshino@{debian.or.jp} ) までお願いいたします。

08:02am Debian JP Blog

December 10, 2017

nogajun

LibreOfficeの文書とPDFに電子署名だけするよ2017

LibreOfficeの文書とPDFに電子署名だけするよ2017

この記事は「LibreOffice Advent Calendar 2017」の12/10の記事です。

おととし2015年に「LibreOfficeの文書とPDFに電子署名するよ」という記事を書きましたが、2年の時を経て帰ってきました。

免責事項

この記事に書いてあることを実行して何らかの被害を被ったとしても野方は一切責任を持ちません。

2年の間に何が変わった?

2年の間にこんな変化がありました。

  • 住民基本台帳カードからマイナンバーカードに切り替わった
  • マルチプラットフォームのスマートカード・ライブラリ/ユーティリティの「OpenSC」が0.17からマイナンバーカードに対応した

ということは、2年前にできなかったマイナンバーカード(当時は住基カード)を使ってLibreOffice文書とPDFに電子署名ができるのではと思ってチャレンジしてみました。

利用環境と参考資料

  • Debian GNU/Linux Sid (amd64)
  • OpenSC 0.17 (DebianではSid/Busterなら利用できます)
  • LibreOffice 5.4.3(Debian/TDF)/6.0.0beta1
参考資料

OpenSCでマイナンバーカードが利用できるか確認

カードリーダーからマイナンバーカードが読み取れる状態にしてから以下を実行します。

$ pkcs15-tool --dump --short
Using reader with a card: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00
PKCS#15 Card [JPKI]:
        Version        : 0
        Serial number  : 00000000
        Manufacturer ID: JPKI
        Flags          :
Card has 2 Authentication object(s).
        PIN  ID:01  Ref:0x01  Tries:3  User Authentication PIN
        PIN  ID:02  Ref:0x02  Tries:5  Digital Signature PIN
Card has 2 Private key(s).
        RSA[2048]  ID:01  Ref:0x01  AuthID:01
            User Authenticat [0x4, sign]
        RSA[2048]  ID:02  Ref:0x02  AuthID:02
            Digital Signatur [0x204, sign, nonRepudiation]
Card has 0 Public key(s).
Card has 4 Certificate(s).
        Path:000a  ID:01
        Path:0001  ID:02
        Path:000b  ID:03  Authority
        Path:0002  ID:04  Authority
Card has 0 Data object(s).

Dumpだと長いので短く出しましたが大丈夫そうですね。

Firefoxにセキュリティデバイスとして登録

LinuxのLibreOfficeで証明書の利用するにはFirefoxを経由するので、まずはFirefoxにカードリーダーをセキュリティデバイスとして登録します。

手順としてはOpenSC Wikiに書いてあるとおりにすればよいので、こちらをご覧ください。

ライブラリの場所はWikiには「/usr/lib」としか書いていませんが、Debianのamd64では「/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so」にあります。

登録ができるとこのようになります。

Firefoxセキュリティデバイス登録

LibreOfficeにFirefoxの設定ディレクトリを指定する

登録したら、LibreOfficeを起動してFirefoxの証明書が読めるようにFirefox設定ディレクトリのパスを指定します。

指定方法は、LibreOfficeを起動してオプション画面(メニュー[ツール]→[オプション])を開きます。 [LibreOffice]→[セキュリティ]に進み、[証明書へのパス]ボタンを押します。ここでパスがFirefoxになっていれば変更する必要はありません。なっていなければFirefoxに変更してください。

Firefox設定パス選択

署名をする

準備ができたので電子署名をしてみましょう。 署名をするには文書を保存する必要があります。作業中なら、いったん保存します。

保存したならメニュー[ファイル]→[デジタル署名]→[デジタル署名]を選びます。続いて「ドキュメントに署名」ボタンを押すとパスワードの入力を求められます。

デジタル署名

さて、このパスワードには何を入力したらよいのでしょうか?

マイナンバーカードのパスワードには、署名用の16文字までのパスワードと4桁の数字のPINコードの2種類があります。(本当は4種類ですが署名用以外のPINコードは共通でもよいとされているので、ほとんどの人は2種類だけにしているでしょう。)

本来なら署名用のパスワードだけのはずですが、仕様かバグかわかりませんが実はパスワードとPINコード二つの入力を求められます。しかも、ダイアログのメッセージがわかりづらい!

入力するパスワードの違いもわからない上に間違えて入力してもエラーもなく、そのまま「証明書の選択」ダイアログが表示されてしまうので困ってしまいAskで尋ねたということでした。

余談はさておき「ドキュメントに署名」ボタンを押したあとに入力するパスワードは、初めに署名用のパスワードを入力します。

署名用パスワード

続いて出るパスワードダイアログにはPINコードを入力をします。

PINコード

わかりづらいダイアログも実はメッセージが変わっているので迷った場合は下を参考にしてください。

  1. Digital Signature PIN (JPKI): 署名用電子証明書用暗証番号 (長いパスワード)
  2. User Authentication PIN (JPKI): 利用者証明用電子証明書用暗証番号 (4桁のPINコード)

これで「証明書の選択」ダイアログにマイナンバーカードが出てきました。

証明書の選択

証明書を選ぶ

証明書が出てきましたが証明書が二つあって、[証明書の表示」ボタンを押して見てもどっちが署名用の証明書かわかりません。

OpenSCでマイナンバーの登録情報を確認してみた - Develop with pleasure!」の記事を参考に証明書の情報を見比べることにしました。。

まずは認証用証明書から。

$ pkcs15-tool --read-certificate 1 > user-auth.pem
$ openssl x509 -text -noout -in user-auth.pem | lv

見てみるとこういうのがありました。

Subject: C = JP, CN = 799884E02EBLEP28201003A

CNを見るとダイアログの下に表示されていたほうと同じで認証用ですね。 署名用も見てみます。

署名用はパスワードでロックされてるので画面に表示したものをファイルにコピペして、それを見てみました。

$ pkcs15-tool --read-certificate 2 --verify-pin --auth-id 02
Using reader with a card: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00
Please enter PIN [Digital Signature PIN]: (パスワードを入力)
-----BEGIN CERTIFICATE-----
?
-----END CERTIFICATE-----

エディタに貼り付けてuser-signature.pemとして保存したものを閲覧。

$ openssl x509 -text -noout -in user-signature.pem  | lv

こちらのCNはマイナンバーカードを作成した日付になってますね。

Subject: C = JP, L = Hyogo-ken, L = Himeji-shi, CN = 201602141019093423328201003A

ということは日付のほうが署名用の証明書ということがわかりました。

改めて署名をする

日付のほうが署名用証明書とわかったので、Descriptionに署名理由を書いて、使う署名をクリックすると署名されます。

署名された

文書の上に「The Signature is OK,but the certificate could not be validated.」と表示されていれば、とりあえずは署名完了です。

署名されたodt文書

PDFに電子署名をする

odtに署名ができたなら最大の目的であるPDFに電子署名です。

PDFに電子署名をしてエクスポートをするには、メニュー[ファイル]→[PDFとしてエクスポート]を選んでPDFダイアログを開きます。 PDFの出力設定をおこなったら「デジタル署名」タブに移動します。

PDFオプション

「この証明書をPDFドキュメントのデジタル署名に使用」の[選択]ボタンを押すと、odtへの署名と同じく「証明書の選択」ダイアログが開くので、署名理由を入力して証明書をダブルクリックします。

パスワードや場所など必要ならば情報を埋めて、問題がなければ[エクスポート]ボタンを押してファイル名をしてすれば、PDFに署名して出力されます。

そういえば「デジタル署名」タブの「原因」と訳されているところは「理由」の間違いですね。

Adobe Acrobat Readerで確認をする

Evinceで開くと電子署名の確認ができないので、WindowsのAdobe Acrobat Readerを使って署名ができているか確認します。

Acrobat Reader

署名されているようですが、「少なくとも1つの署名に問題があります。」と表示されています。 署名を確認すると署名自体は問題なさそうですが「署名者のIDは信頼済み証明書の一覧に見つからず、親証明書も信頼済み証明書ではないので、このIDは不明です」とあります。

検証をするには?

そうなんです。気がついていると思いますが、署名を検証するための認証局発行の証明書がありません。なので署名ができても、それが正しいかどうかわかりません。

ということで、次回、検証編に続きます。

03:10pm nogajun by Jun NOGATA

December 08, 2017

mkouhei

VirtualBoxをPowerShellで操作する

VirtualBoxをPowerShellで操作する

これは Debian/Ubuntu Advent Calendar 2017 12月9日の記事です。 前回( ThinkPad T470sに乗り換え )、この内容を書くといいつつ放置していたのと、今日のアドベントカレンダーがまだ空いていたので書いてみました。

DebianそのものはVirtualBoxで動かしているだけのゆるい記事です。

私は開発環境にはプライベートも職場もSidにしているのですが、VirtualBoxを使っていると、systemdやgrub、XOrg周りのバグで起動しなくなった場合にも、スナップショットから簡単に戻せます。

macOSでの起動とスナップショット取得

私物のラップトップをThinkPadに切り替える前はMacBookProを使っており、職場はMacBookProを使っています。Vagrantは使わない派なので、シェルスクリプトを作成しこれらをターミナルから実行して起動やスナップショットを取得しています。

起動用スクリプト

#!/bin/sh -e
vmname='vmname'
VBoxManage showvminfo $vmname | grep State: | grep -q 'powered off' || ( echo "VM: $vmname is not powered off." ; exit 1 )
VBoxManage startvm $vmname --type gui

すでに起動していたら同じイメージからもう一台VMを起動しないようにしています。 VirtualBoxでCPUやメモリリソースの半分以上を割り当てて、フルスクリーンで使っているので、 --type gui で起動します。

スナップショット取得用スクリプト

#!/bin/sh -e
vmname='VMname'
VBoxManage showvminfo $vmname | grep State: | grep -q 'powered off' || ( echo "VM: $vmname is not powered off." ; exit 1 )
VBoxManage snapshot $vmname take $(date +%Y%m%d-%H%M)
if [ $(VBoxManage snapshot $vmname list | wc -l) -lt 4 ]; then
  exit 0
fi
VBoxManage snapshot $vmname delete $(VBoxManage snapshot $vmname list | head -1 | awk '{print $2}')

VirtualBoxでのスナップショット取得自体は、VMが起動していても可能ですが、取得までにえらい時間がかかるので、これも起動中は実行しないようにしています。 スナップショット名は、 YYYYmmdd-HHMM のフォーマットの日時とし、最大三回取得するようにしています。 4つめ以上は、一番古いスナップショットを削除します。

Windows10での起動・スナップショット取得方法

Windows10でもVagrantは使わず、PowerShellで行っています。 PowerShellのコマンドプロンプトからではなく、デスクトップ上にPowerShell実行用のショートカットを作成し、それをダブルクリックして実行してしていうことです。

起動用スクリプト

$vmname = "vmname"

function Show-VM-Info {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo $vmname
}

function VM-Powered-off? {
    Show-VM-Info | Select-String State: | Select-String -quiet 'powered off'
}

function Start-VM {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm $vmname --type gui
}

function List-VM {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms
}

function VM-Exist? {
    return (List-VM | Select-String -quiet $vmname)
}

if (-Not (VM-Exist?)) {
    echo "[error] '$vmname' is not exists."
    exit 1
}

if (VM-Powered-off?) {
    Start-VM
} else {
    echo "VM: '$vmname' has been powered on."
    exit 1
}

シェルスクリプト版に比べるとえらい長ったらしいですね。やっていることはシェルスクリプト版と同じです。

スナップショット取得用スクリプト

$vmname = "vmname"

function Show-VM-Info {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo $vmname
}

function VM-Powered-off? {
    Show-VM-Info | Select-String State: | Select-String -quiet 'powered off'
}

function List-VM {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms
}

function VM-Not-Exist? {
    return (List-VM | Select-String -quiet $vmname)
}

function Get-Timestamp {
    return (Get-Date -UFormat %Y%m%d-%H%M)
}

function Take-Snapshot {
    $timestamp = Get-Timestamp
    Start-Process "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -ArgumentList "snapshot $vmname take $timestamp" -NoNewWindow -Wait
}

function List-Snapshot {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" snapshot $vmname list
}

function Get-Oldest-Snapshot {
    return (-Split (List-Snapshot)[0])[1]
}

function Delete-Oldest-Snapshot {
    $oldest_name = Get-Oldest-Snapshot
    Start-Process "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -ArgumentList "snapshot $vmname delete $oldest_name" -NoNewWindow -Wait
}

if (-Not (VM-Not-Exist?)) {
    echo "[error] '$vmname' is not exists."
    exit 1
}

if (VM-Powered-off?) {
    Take-Snapshot
    echo "[done] take snapshot."
    if ((List-Snapshot | Measure-Object).Count -lt 4) {
        exit 0
    }
    Delete-Oldest-Snapshot
    echo "[done] delete oldest snapshot."
    exit 0
} else {
    echo "VM: '$vmname' has been powered on."
    exit 1
}

スナップショット取得用は更に長くなってますが、これもシェルスクリプト版とやっていることは同じです。

実行用のショートカット

PowerShellの拡張子は ps1 なので startvm.ps1, snapshot.ps1という名前で作成していますが、これを作成してもダブルクリックすると、メモ帳で開くだけです。なんて面倒なことでしょうね。

ということで、デスクトップにこれらのショートカットをまず作成します。

次にショートカットのプロパティを開き、リンク先をそれぞれ次のように書き換えます。 -File で指定したパスが、実際のPowerShellのスクリプトファイルのパスです。

起動用スクリプトのショートカット

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\someuser\OneDrive\ドキュメント\startvm.ps1

スナップショット取得用スクリプトのショートカット

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\mkouh\OneDrive\ドキュメント\snapshot.ps1

これでデスクトップ上のショートカットをダブルクリックするだけで起動とスナップショットを取得できます。

まとめ

シェルスクリプトやPowerShellでVirtualBoxの起動やスナップショット取得はできますよ、というゆるいネタでした。

“unstable”という言葉のイメージだけでSidを使うのをためらっている人や、職場で利用するPCに自由にDebianをインストールできないにもVirtualBox等を使うことで自分の使いやすい環境を手に入れることができるので、今更なネタではありますが、まだの方は試してみると良いのではないでしょうか。

03:00pm mkouhei