OpenSCにマイナンバーカード(JPKI)の対応がマージされていたので、OpenSCを使ってマイナンバーカードの登録情報を確認してみる。
使用したカードリーダーは↓でMacでも認識できた。
カードに登録されているオブジェクトのリスト確認
まずカードに登録されているオブジェクトを確認してみる。
$ 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の登録はするけど、その際に秘密鍵作ってるわけではないし。