マイナンバーカードで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
参考資料
- マイナンバーカードでSSHする - AAA Blog: https://www.osstech.co.jp/~hamano/posts/jpki-ssh/
- マイナンバーカードでmacOSにログイン - AAA Blog: https://www.osstech.co.jp/~hamano/posts/jpki-macos/
- OpenSCでマイナンバーの登録情報を確認してみた - Develop with pleasure!: http://techmedia-think.hatenablog.com/entry/2017/10/21/150246
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に書いてあるとおりにすればよいので、こちらをご覧ください。
- Installing OpenSC PKCS#11 Module in Firefox, Step by Step · OpenSC/OpenSC Wiki: <https://github.com/OpenSC/OpenSC/wiki/Installing-OpenSC-PKCS%2311-Module-in-Firefox,-Step-by-Step>
ライブラリの場所はWikiには/usr/lib
としか書いていませんが、Debianのamd64では/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
にあります。
登録ができるとこのようになります。
LibreOfficeにFirefoxの設定ディレクトリを指定する
登録したら、LibreOfficeを起動してFirefoxの証明書が読めるようにFirefox設定ディレクトリのパスを指定します。
指定方法は、LibreOfficeを起動してオプション画面(メニュー[ツール]→[オプション])を開きます。 [LibreOffice]→[セキュリティ]に進み、[証明書へのパス]ボタンを押します。ここでパスがFirefoxになっていれば変更する必要はありません。なっていなければFirefoxに変更してください。
署名する
準備ができたので電子署名をしてみましょう。 署名をするには文書を保存する必要があります。作業中なら、いったん保存します。
保存したならメニュー[ファイル]→[デジタル署名]→[デジタル署名]を選びます。続いて「ドキュメントに署名」ボタンを押すとパスワードの入力を求められます。
さて、このパスワードには何を入力したらよいのでしょうか?
マイナンバーカードのパスワードには、署名用の16文字までのパスワードと4桁の数字のPINコードの2種類があります。(本当は4種類ですが署名用以外のPINコードは共通でもよいとされているので、ほとんどの人は2種類だけにしているでしょう。)
本来なら署名用のパスワードだけのはずですが、仕様かバグかわかりませんが実はパスワードとPINコード二つの入力を求められます。しかも、ダイアログのメッセージがわかりづらい!
入力するパスワードの違いもわからない上に間違えて入力してもエラーもなく、そのまま「証明書の選択」ダイアログが表示されてしまうので困ってしまいAskで尋ねたということでした。
余談はさておき「ドキュメントに署名」ボタンを押したあとに入力するパスワードは、初めに署名用のパスワードを入力します。
続いて出るパスワードダイアログにはPINコードを入力をします。
わかりづらいダイアログも実はメッセージが変わっているので迷った場合は下を参考にしてください。
- Digital Signature PIN (JPKI): 署名用電子証明書用暗証番号 (長いパスワード)
- 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.」と表示されていれば、 とりあえずは 署名完了です。
PDFに電子署名する
odtに署名ができたなら最大の目的であるPDFに電子署名です。
PDFに電子署名をしてエクスポートをするには、メニュー[ファイル]→[PDFとしてエクスポート]を選んでPDFダイアログを開きます。 PDFの出力設定をおこなったら「デジタル署名」タブに移動します。
「この証明書をPDFドキュメントのデジタル署名に使用」の[選択]ボタンを押すと、odtへの署名と同じく「証明書の選択」ダイアログが開くので署名理由を入力して証明書をダブルクリックします。
パスワードや場所など必要ならば情報を埋めて、問題がなければ[エクスポート]ボタンを押してファイル名をしてすれば、PDFに署名して出力されます。
そういえば「デジタル署名」タブの「原因」と訳されているところは「理由」の間違いですね。
Adobe Acrobat Readerで確認をする
Evinceで開くと電子署名の確認ができないので、WindowsのAdobe Acrobat Readerを使って署名ができているか確認します。
署名されているようですが、「少なくとも1つの署名に問題があります。」と表示されています。 署名を確認すると署名自体は問題なさそうですが「署名者のIDは信頼済み証明書の一覧に見つからず、親証明書も信頼済み証明書ではないので、このIDは不明です」とあります。
検証するには?
そうなんです。気がついていると思いますが、署名を検証するための認証局発行の証明書がありません。なので署名ができても、それが正しいかどうかわかりません。
ということで、次回、検証編に続きます。(続きません)