マイナンバーカードの中身をOpenSCで覗いてみる

## 前提情報・背景・注意事項

- 自分の頭の整理のためにマイナンバーカードの中身を調べたメモです
- これを参考にして試してみる場合にはうっかり自分の個人情報を公開しないようにご注意ください。
- 国から認可された団体以外、他人の公的個人認証の証明書を収集・記録することは制限されています
- 電子署名と暗号化の仕組みはここでは書きません。
- 私はMacBook pro masOS BigSur(バージョン11.3）、チップApple M1で試しています
- PCにICカードリーダーを接続し、マイナンバーカードが読み取り可能な状態となっている必要があります

## マイナンバーカード
### 公的個人認証とは
公的個人認証サービスとは、行政や民間のオンライン申請や届出、ログイン認証の際に、他人による「なりすまし」やデータの改ざんを防ぐために用いられる本人確認の手段です。 マイナンバーカードなどの中のICチップの中に電子証明書が記録されています。
[公的個人認証サービス（JPKI）総合ポータルサイト](https://www.kojinbango-card.go.jp/jpki/)

### マイナンバーカードのICチップ
マイナンバーカードのICチップは裏面にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/d7e061c9-bca0-3568-8bfe-bc3935fcc258.png)

PCでマイナンバーカードのICチップ内のデータを読み込むときにはカードリーダーを使います。
読み込む際にはカードの向きにご注意を...ICチップがどこにあって、それを読み取る場所がどこなのかを確認してください。販売してるサイトでよく向きがおかしいサイトをよく見かけます笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/b7629318-def5-0a2c-7b90-94d7fe146ed4.png)

ICチップには接触型・非接触型の2種類のインターフェースがあり、接触型ならISO/IEC7816対応のカードリーダー、非接触型ならSO/IEC14443（NFC TypeB）に対応したカードリーダーでアクセスが可能です。

### マイナンバーカードICチップ内のAP構造
マイナンバーカードのICチップには「AP（アプリケーションプログラムの略）」と呼ばれるカード内で駆動するプロセッサーが実行するプログラムがいくつか存在します。AP同士は独立した存在で干渉し合うことはありません。

- 公的個人認証AP（別名：JPKI-AP）
    - 署名用電子証明書
    - 利用者証明書電子証明書
- 券面事項確認AP
- 券面事項入力補助AP
- 住基AP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/e6438817-8ee6-f631-de46-4a4b90fee506.png)
それぞれのAP内のデータにアクセスする際にはマイナンバーカード発行時に本人が設定した暗証番号が必要となります。

## OpenSC
### OpenSCとは
[OpenSC](https://github.com/OpenSC/OpenSC/wiki)は、スマートカードを扱うためのライブラリとユーティリティやライブラリのセットです。主に暗号操作をサポートするカードに焦点を当て、認証、メール暗号化、デジタル署名などのセキュリティアプリケーションを容易に利用できます。

### PKCSとは
[こちらのQiita記事](https://qiita.com/kunichiko/items/7796ecfb88a62ce26b36)がわかりやすいです。

### OpenSCインストール
OpenSCの[githubWikiページ](https://github.com/OpenSC/OpenSC/wiki )からダウンロードしてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/b622f90f-4cb5-2ea4-1b74-ccbb778354c3.png)

正常にインストールできたことをバージョン確認コマンドで確認します。

```
takeda@takedaMacBook ~ % opensc-tool --version
OpenSC-0.22.0-rc1-74-gc902e199, rev: c902e199, commit-time: 2021-08-10 11:09:03 +0200
```

### pkcs15-toolでマイナンバーカードの中身を覗く
pkcs15-toolは証明書や公開鍵などICカード内のデータにアクセスするためのツールのようです。このツールを使って色々中身を覗いてみます。

#### オブジェクトのリスト確認

```
$ % pkcs15-tool --dump
Using reader with a card: Alcor Micro AU9560
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   : [0x01], private
	Usage          : [0x04], sign
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	Algo_refs      : 0
	ModLength      : 2048
	Key ref        : 1 (0x01)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : c5a0a252-9d2d-eb60-fec0-41b4fbd722a2

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

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

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

X.509 Certificate [User Authentication Certificate]
	Object Flags   : [0x00]
	Authority      : no
	Path           : 000a
	ID             : 01
	Encoded serial : 02 04 039A1FBB

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

X.509 Certificate [User Authentication Certificate CA]
	Object Flags   : [0x00]
	Authority      : yes
	Path           : 000b
	ID             : 03
	Encoded serial : 02 04 0133C349

X.509 Certificate [Digital Signature Certificate CA]
	Object Flags   : [0x00]
	Authority      : yes
	Path           : 0002
	ID             : 04
	Encoded serial : 02 04 0132C4AB

takeda@takedaMacBook ~ % 
```
マイナンバーカードには以下のオブジェクトが格納されていることがわかります。

- PKCS#15 Card [JPKI]:JPKIのカードオブジェクト
- PIN [User Authentication PIN]:認証用のPIN
- PIN [Digital Signature PIN]:署名用のPIN
- Private RSA Key [User Authentication Key]:認証用のRSA秘密鍵
- Private RSA Key [Digital Signature Key]:署名用のRSA秘密鍵
- Public RSA Key [User Authentication Public Key]:認証用のRSA公開鍵
- Public RSA Key [Digital Signature Public Key]:署名用のRSA公開鍵
- X.509 Certificate [User Authentication Certificate]:認証用のX.509証明書
- X.509 Certificate [Digital Signature Certificate]:署名用のX.509証明書
- X.509 Certificate [User Authentication Certificate CA]:認証用の認証局のX.509証明書
- X.509 Certificate [Digital Signature Certificate CA]:署名用の認証局のX.509証明書

#### 暗証番号がブロックされるまでの残り回数確認
マイナンバーカードは証明書利用のための暗証番号の入力を誤った場合にはロックされてしまう仕組みになっています。ロックされると役所に行かないと再設定できないものまであり、検証する際にドキドキしながら入力することになります。
残りあと何回間違えても大丈夫なのか知りたいときにはこのコマンドで確認することができます。

```
takeda@takedaMacBook ~ % pkcs15-tool --list-pins
Using reader with a card: Alcor Micro AU9560
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

takeda@takedaMacBook ~ % 
```

数字4桁の利用者用電子証明書のPINは3回まで、英数字6〜16桁の署名用電子証明書のPINは5回までになってることがわかります。

#### 利用者用電子証明書の表示

オブジェクト確認コマンドの結果のうち、利用者用電子証明書の中身を確認するコマンドです。オブジェクト確認コマンドの結果から、利用者用電子証明書の証明書IDは01で登録されています。

> X.509 Certificate [User Authentication Certificate]
	Object Flags   : [0x00]
	Authority      : no
	Path           : 000a
	ID             : 01
	Encoded serial : 02 04 039A1FBB

```
takeda@takedaMacBook ~ % pkcs15-tool --read-certificate 1 > user-auth.pem
Using reader with a card: Alcor Micro AU9560
takeda@takedaMacBook ~ % openssl x509 -text -noout -in user-auth.pem     
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: XXXXXX (XXXXXXX)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, O = JPKI, OU = JPKI for user authentication, OU = Japan Agency for Local Authority Information Systems
        Validity
            Not Before: Jan 17 06:48:37 2022 GMT
            Not After : Jan  1 14:59:59 2027 GMT
        Subject: C = JP, CN = XXXXXXXXXXXX
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    XX:XX:XX:XX:〜
                Exponent: XXXXX (XXXXXXX)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            X509v3 Certificate Policies: critical
                Policy: 1.2.392.200149.8.5.1.0.30
                  CPS: http://www.jpki.go.jp/cps.html
            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: 
                Full Name:
                  DirName:C = JP, O = JPKI, OU = JPKI for user authentication, OU = CRL Distribution Points, OU = Tokyo-to, CN = Chiyoda-ku CRLDP
            Authority Information Access: 
                OCSP - URI:http://ocspauthnorm.jpki.go.jp
            X509v3 Authority Key Identifier: 
                keyid:XX:XX:~
                DirName:/C=JP/O=JPKI/OU=JPKI for user authentication/OU=Japan Agency for Local Authority Information Systems
                serial:XX:XX
            X509v3 Subject Key Identifier: 
                XX:XX:~~
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        XX:XX:XX:~~~
```

2コマンドで書きましたが、パイプでつなげて1コマンドで表示させてもOKです。その場合以下のコマンドになります。
```
pkcs15-tool --read-certificate 1 | openssl x509 -text -noout
```

> Distribution Points, OU = Tokyo-to, CN = Chiyoda-ku CRLDP

ということから、各市区町村が証明書の失効情報を管理しているということがわかります。
（ちなみにあえてchiyoda-kuに変換して書いてるだけで私東京都千代田区に住んでるわけじゃないです）

#### 署名用電子証明書の表示
オブジェクト確認コマンドの結果から、署名用電子証明書の証明書IDは02で登録されていました。

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

この証明書は6〜12桁のPINで保護されており以下のコマンド投入後にPINを入力すると表示されます。

```
takeda@takedaMacBook ~ % pkcs15-tool --read-certificate 2 --verify-pin --auth-id 2
Using reader with a card: Alcor Micro AU9560
Please enter PIN [Digital Signature PIN]: 
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXX~
-----END CERTIFICATE-----
takeda@takedaMacBook ~ % 
```
この結果を `user-signature.pem` などの名前でpemファイルに直接貼り付けて `openssl` コマンドで出力すると基本4情報含む署名用電子証明書の中身が閲覧できました。

マイナンバーカードの中身はJ-LISが提供している[JPKI利用者ソフト](https://www.jpki.go.jp/download/)でも閲覧が可能ですが、このようにコマンドで閲覧することでAP構成やファイル形式などを意識することができるので理解が深まりました。
pkcs15-tool以外にも色々ユーティリティやモジュールがありその組み合わせで以下のようなこともできそうです。
また時間があればこれらを試した内容を整理して書こうと思います。

- 署名用電子証明書の秘密鍵で暗号化し、公開鍵で復号化して署名検証する
- 利用者用電子証明書の公開鍵を登録したリモートホストにSSHログイン
- macOSにマイナンバーカードの利用者用電子証明書でログイン
- PDFファイルに電子署名をする

## 参考になったサイト
[OpenSC](https://github.com/OpenSC/OpenSC/wiki)
[総務省：公的個人認証サービスによる電子証明書](https://www.soumu.go.jp/kojinbango_card/kojinninshou-01.html)
[総務省：マイナンバーカードを活用したオンライン取引等の可能性について](https://www.soumu.go.jp/main_content/000805608.pdf)
[総務省：民間事業者におけるマイナンバーカードの利活用](https://www.soumu.go.jp/kojinbango_card/cardrikatsuyou.html#riyou)
[RSA暗号の全体像](https://qiita.com/kunichiko/items/7796ecfb88a62ce26b36)