Develop with pleasure!

福岡でCloudとかBlockchainとか。

OpenSCでマイナンバーの登録情報を確認してみた

OpenSCにマイナンバーカード(JPKI)の対応がマージされていたので、OpenSCを使ってマイナンバーカードの登録情報を確認してみる。

github.com

使用したカードリーダーは↓でMacでも認識できた。

amzn.to

カードに登録されているオブジェクトのリスト確認

まずカードに登録されているオブジェクトを確認してみる。

$ pkcs15-tool --dump
Using reader with a card: Gemalto PC Twin Reader
PKCS#15 Card [JPKI]:
    Version        : 0
    Serial number  : 00000000
    Manufacturer ID: JPKI
    Flags          : 
PIN [User Authentication PIN]
    Object Flags   : [0x12], modifiable
    ID             : 01
    Flags          : [0x12], local, initialized
    Length         : min_len:4, max_len:4, stored_len:0
    Pad char       : 0x00
    Reference      : 1 (0x01)
    Type           : ascii-numeric
    Tries left     : 3

PIN [Digital Signature PIN]
    Object Flags   : [0x12], modifiable
    ID             : 02
    Flags          : [0x12], local, initialized
    Length         : min_len:6, max_len:16, stored_len:0
    Pad char       : 0x00
    Reference      : 2 (0x02)
    Type           : ascii-numeric
    Tries left     : 5

Private RSA Key [User Authentication Key]
    Object Flags   : [0x1], private
    Usage          : [0x4], sign
    Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    ModLength      : 2048
    Key ref        : 1 (0x1)
    Native         : yes
    Auth ID        : 01
    ID             : 01
    MD:guid        : c5a0a252-9d2d-eb60-fec0-41b4fbd722a2

Private RSA Key [Digital Signature Key]
    Object Flags   : [0x1], private
    Usage          : [0x204], sign, nonRepudiation
    Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    ModLength      : 2048
    Key ref        : 2 (0x2)
    Native         : yes
    Auth ID        : 02
    ID             : 02
    MD:guid        : e1bc1dae-59f1-16ab-b43f-9dafbb2acc9b

Public RSA Key [User Authentication Public Key]
    Object Flags   : [0x0]
    Usage          : [0x0]
    Access Flags   : [0x2], extract
    Key ref        : 1 (0x1)
    Native         : yes
    Path           : 000a
    ID             : 01

Public RSA Key [Digital Signature Public Key]
    Object Flags   : [0x0]
    Usage          : [0x0]
    Access Flags   : [0x2], extract
    Key ref        : 2 (0x2)
    Native         : yes
    Path           : 0001
    ID             : 02

X.509 Certificate [User Authentication Certificate]
    Object Flags   : [0x0]
    Authority      : no
    Path           : 000a
    ID             : 01
    Encoded serial : 02 03 1C3301

X.509 Certificate [Digital Signature Certificate]
    Object Flags   : [0x1], private
    Authority      : no
    Path           : 0001
    ID             : 02

X.509 Certificate [User Authentication Certificate CA]
    Object Flags   : [0x0]
    Authority      : yes
    Path           : 000b
    ID             : 03
    Encoded serial : 02 01 01

X.509 Certificate [Digital Signature Certificate CA]
    Object Flags   : [0x0]
    Authority      : yes
    Path           : 0002
    ID             : 04
    Encoded serial : 02 01 01
  • JPKIのカードオブジェクト
  • 認証用のPIN
  • 署名用のPIN
  • 認証用のRSA秘密鍵
  • 署名用のRSA秘密鍵
  • 認証用のRSA公開鍵
  • 署名用のRSA公開鍵
  • 認証用のX.509証明書
  • 署名用のX.509証明書
  • 認証用の認証局のX.509証明書
  • 署名用の認証局のX.509証明書

が登録されていることが分かる。

証明書の確認

↑のうち、ユーザーの証明書は認証用のX.509証明書と署名用のX.509証明書。

まずユーザー認証用のX.509証明書の内容を確認してみる。

$ pkcs15-tool --read-certificate 1 > user-auth.pem
Using reader with a card: Gemalto PC Twin Reader
$ openssl x509 -text -noout -in user-auth.pem

opensslコマンドで証明書の内容を確認できる。

X509v3 Issuer Alternative Name: 
   DirName:/C=JP/O=\xE5\x85\xAC\xE7\x9A\x84\xE5\x80\x8B\xE4\xBA\xBA\xE8\xAA\x8D\xE8\xA8\xBC\xE3\x82\xB5\xE3\x83\xBC\xE3\x83\x93\xE3\x82\xB9
X509v3 CRL Distribution Points: 
   DirName:/C=JP/O=JPKI/OU=JPKI for user authentication/OU=CRL Distribution Points/OU=Fukuoka-ken/CN=Iizuka-shi CRLDP

発行者は"公的個人認証サービス"で、CRLのDistribution Pointsは福岡県飯塚市になってる。各市町村が証明書の失効リストを管理していることになる?

この認証用の証明書には個人情報は掲載されていない。

個人情報が含まれているのは、署名用のX.509証明書で、個人の氏名、生年月日、性別、住所といった本人確認に必要な情報が含まれている。続いてこの証明書の内容を確認してみる。

先程と同様にpkcs15-toolで確認しようとすると

$ pkcs15-tool --read-certificate 2 > user-signature.pem
Certificate read failed: Security status not satisfied

とエラーになる。どうやらこっちはPINでロックされてるみたい。

なので--verify-pinオプションでPINの検証をする。この時、署名用のPINのIDは02なので--auth-idオプションでそのPINを指定して実行する。すると署名用のPINの入力を求められるので入力すると署名用のX.509証明書が表示される。

$ pkcs15-tool --read-certificate 2 --verify-pin --auth-id 02
Using reader with a card: Gemalto PC Twin Reader
Please enter PIN [Digital Signature PIN]: 
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

証明書のX509v3 Subject Alternative Nameに個人情報が記載されているが、UTF-8で記載されているこのデータはopensslコマンドで確認しても

othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>

となるだけなので、別途OpenSSL::ASN1などでパースする必要がある。

rubyでパースするサンプル↓

require 'openssl'

cert = OpenSSL::X509::Certificate.new File.read('証明書のパス')
subject_alt_name = cert.extensions.find {|e| e.oid == 'subjectAltName'}

asn_san = OpenSSL::ASN1.decode(subject_alt_name)
asn_san_sequence = OpenSSL::ASN1.decode(asn_san.value[1].value)

asn_san_sequence.each do |asn_data|
  key = asn_data.value[0].value
  value = asn_data.value[1].value[0].value
  puts "#{key}: #{value}"
end

証明書に記載されている個人情報が確認できる。

最後に

公的認証された証明書やキーペアを日本国民であれば誰でも手に入れられ、それらを利用すれば各サービス毎の煩わしい本人確認のプロセスは簡略化できると思うので、今後そういったサービスが充実していくのに期待したい。まぁカードの場合リーダーとセットで不便なので、スマホなどへのインポートができるとさらに便利になると思う。

まぁ、本当に秘密鍵を知ってるは本人だけなのか?という疑念はあるけどなー。マイナンバー登録時に鍵にアクセスする際のPINの登録はするけど、その際に秘密鍵作ってるわけではないし。