🌞

Linux & NFC & マイナンバーカード & JSignPdf

2024/03/20に公開

Linux & NFC & マイナンバーカード & JSignPdfでPDFに署名

2024-03-20


(1).結論


(2).環境

  • Ubuntu 22.04
  • JSignPdf 2.2.2
  • IO DATA USB-NFC4

(3).参考サイト

  1. 最近の電子署名事情ってどうよ
    https://qiita.com/mtakatou/items/8f59ab96a1ee1add1e7c

  2. JSignPdf
    https://sourceforge.net/projects/jsignpdf/

  3. 以前の記事1
    Linux & IO DATA USB-NFC4 & マイナンバーカード

  4. 以前の記事2
    Linux & IO DATA USB-NFC4 & LibreOffice


(4).事前準備

参考サイト 3, 4 で、LibreOffice を使用して動作するところまでやっておくとよいかも。

  • 以前の記事で、NFC + マイナンバーカードを、Ubuntu + OpenSC で動作させた。
  • 以前の記事で、Ubuntu システムに JPKI の CA を入れた。
  • 以前の記事で、TSA を選ぶことも行った。

(5).詳細

(5)-1. JSignPDF 設定

少しだけ変更が必要そう。
公式サイトから download し、展開したあと、conf/ 以下のファイルを変更

conf/conf.properties
pkcs11config.path=conf/pkcs11.cfg
tsa.hashAlgorithm=SHA-256
conf/pkcs11.cfg
name=OpenSC-PKCS11
library=/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
slot=1

(5)-2. JSignPDF GUIの文字がきたない

早速ためしてみる。
カードリーダーとマイナンバーカードはセットしておく。

$ ./jsignpdf.sh
普通 Relaxing SSL security.
普通 Registering SunPKCS11 provider from configuration in conf/pkcs11.cfg
普通 PKCS11 provider registered with name SunPKCS11-OpenSC-PKCS11
普通 PKCS11 provider registered with name JSignPKCS11-OpenSC-PKCS11

メッセージをみておく。

  • conf/pkcs11.cfg ファイルがよめていること。
  • PKCS11registered になっていること。
    これで動くはず

しかし、

GUIの文字が汚い........

JSignPDF 文字が...
JSignPDF 文字が...

Java、よーわからん。
なにやらJavaのオプションにゴニョゴニョ足すと良いらしい。
jsignpdf.sh を変更して、オプションつけてみた

jsignpdf.sh
--- jsignpdf.sh.orig	2023-08-14 21:03:56.000000000 +0900
+++ jsignpdf.sh	2023-09-15 07:57:46.768597041 +0900
@@ -5,6 +5,12 @@ DIR=$(cd "$DIRNAME" || exit 112; pwd)
 
 [ "$OSTYPE" = "cygwin" ] && DIR="$( cygpath -m "$DIR" )"
 
+if [[ -x /usr/lib/jvm/default-java/bin/java ]]; then
+  export JAVA_HOME=/usr/lib/jvm/default-java
+fi
+export JAVA_FONTS=/usr/share/fonts/truetype:/usr/local/share/fonts
+JAVA_OPTS="${JAVA_OPTS} -Dawt.useSystemAAFontSettings=gasp -Dswing.aatext=true -Dswing.plaf.metal.controlFont=monospaced-16 -Dswing.plaf.metal.userFont=monospaced-16"
+
 JAVA=java
 if [ -n "$JAVA_HOME" ]; then
   JAVA="$JAVA_HOME/bin/java"
  • JAVA_FONTS をセットする。

  • -Dawt.useSystemAAFontSettings=gasp -Dswing.aatext=true が良いらしい。

  • -Dswing.plaf.metal.controlFont=monospaced-16 -Dswing.plaf.metal.userFont=monospaced-16 はフォントサイズ、フォント種類。

  • JAVA_HOME は Ubuntu の環境にあわせんがため。

JSignPDF 文字よくなった
JSignPDF 文字よくなった


(5)-3. PDFファイル指定、マイナンバーカード指定

JSignPDF main
JSignPDF main

GUIのメインの画面で

  • [詳細表示設定]    : チェック。
  • [キーストアタイプ]  : PKCS11 にする。
  • [入力 PDF ファイル]  : 署名したい PDF ファイル指定。[出力 PDF ファイル]が自動でセットされる。
  • [ハッシュアルゴリズム]: SHA-1 以外にする。
  • [TSA/OCSP/CRL]    : TSAサーバーを指定。別ウインドウが出る。

まだ [Sign It] を押さないでね!
マイナンバーカードがちゃんとよめているかが大事。何度もパスワード間違えるとたいへん。

  • [キーストアパスワード]: マイナンバーカードの、**長〜いパスフレーズ(署名用)**を入力
  • [パスワードを記憶する]: お好きに。

この状態で、

  • [キー読み込み]をクリック。

マイナンバーカードよみこみに成功すれば、

  • [フレンドリ名]

    Digital Signature Certificate
    が表示される。

JSignPDF main 1
JSignPDF main 1

これで
[Sign It]
をクリックする。
出力例

情報 Starting JSignPdf
情報 Checking input and output PDF paths.
情報 Getting key alias
情報 Used key alias: Digital Signature Certificate
情報 Loading private key
情報 Getting certificate chain
情報 Opening input PDF file: /tmp/a4.pdf
情報 Creating output PDF file: /tmp/a4_signed.pdf
情報 Creating signature
情報 Updating PDF version info 1.4 -> 1.6
情報 Setting certification level
情報 Processing (it may take a while) ...
普通 KeyStore type PKCS11 is supported by the provider SunPKCS11-OpenSC-PKCS11
情報 Creating TSA client.
情報 Setting TSA hash algorithm: SHA-256
情報 Closing result PDF stream
情報 Finished: Signature succesfully created.

成功。

JsignPDFは、suffix をつけたファイルにサインしたPDFを出力する。
例では、サインしたファイルは /tmp/a4_signed.pdf になる。
以前紹介した PDF Studio Viewer などで見れば、サインされたかがわかる。


(5)-4. TSA指定

TSA の設定は、メイン画面の

  • [TSA/OCSP/CRL]
    をクリックして行う。
    クリックすると、別ウインドウが現れる。

JSignPDF TSA
JSignPDF TSA

  • [TSA(タイムスタンプサーバー)を使う]: チェック。
  • [TSA URL]: LibreOffice で使用した TSA サーバーを指定してみる。

(5)-5. コマンドラインでどうやんの?

コマンドラインでできるし、バッチも組める。

一度 GUI を実行し、終了させると、
~/.JSignPdf
ファイルに、GUIの指定が記録されている。

~/.JSignPdf
keystore.type=PKCS11
keystore.alias=Digital Signature Certificate
inpdf.file=/tmp/a4.pdf
outpdf.file=/tmp/a4_signed.pdf
hash.algorithm=SHA256
tsa.url=http\://tss.accv.es\:8318/tsa

コマンドはデフォルトで ~/.JSignPdf を使用するのかは知らない。
-lpf ~/.JSignPdf
オプションを指定すれば、かくじつに使用する。
よく同じ値を使用するなら、-lpf オプションを使うと良いかもね。

基本的なオプションは次のようなかんじになるだろう。

$ ./jsignpdf.sh \
 -ksp "マイナンバーカードの**長〜いパスフレーズ(署名用)**" \
 -kst PKCS11 \
 -tsh SHA256 \
 -ts http://tss.accv.es:8318/tsa \
 -d /tmp \
 /tmp/a4.pdf

サイン対象のファイル(この例では/tmp/a4.pdf)は、フルパスでなければうまくいかないことがあった。

問題は、署名用のパスフレーズを
-ksp
オプションでコマンドラインに渡すところ。

GUIで [パスワードを記憶する] したうえで
-lpf ~/.JSignPdf
をうまく使えるかどうか。試していない。


(5)-6. helpオプション

$ java -jar JSignPdf.jar -h

ドキュメントは、展開した下の
docs/JSignPdf.pdf
ファイル。


(6).他: RFC3161 TSA serverについて

日本もスペイン、エストニア、ベルギーみたいに、国(関係)が無料公開サーバーつくればよいのにね。
電子化であれやこれやを言うなら、つくってほしい。
税制からんで、変、あるいは無理じゃん!みたいになっている。
また国のCAを各ソフトに入れてもらうように、お願いして回るとかも必要でしょう。

あれ?
acrobatってTSA使って署名入れる機能あるが、あれって、adobeのTSAサーバーだよね。appleも持っていて公開だし。
日本は、日本がTSA認証した物をといいつつ、acrobatなどのデフォルトのTSA指定は良いっていうこと????
またTSA機能のない、ただの text ファイルとか zip とか、どないせいっちゅうんやろ。
OSS みたいに sha ハッシュファイル作ればよいのかね?
よーわからん。
知らねばならないことが増え過ぎで追いつかない。

制度を言い出した人達は、おそらく、自分が使ったことある一部だけをみて言っているのかもしれない。他のケースのこと頭に無いよね、多分。

エストニア、Linux、Firefoxをサポートしている。apt-getできたり。
もともと日本はLinux、Firefox無視であった。
で今年、確定申告関連サイトをログインしようとしたら、windows,macos用のソフトを入れなければならないようにかわっていた。
あららららら。死んだ。
やっぱり紙よね! webで電子申告するより紙で出そう!


以上

Discussion