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の登録はするけど、その際に秘密鍵作ってるわけではないし。