マイナンバーカードでLibreOfficeの文書とPDFに電子署名だけするよ2017

nogajun
nogajun

_ この記事は「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は不明です」とあります。

検証するには?

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

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