Windows搭載のPCでマイナンバーカード内の電子証明書の読み出し

## 背景

Macでマイナンバーカード内の電子証明書を確認する記事ばっかりだったので備忘録

## 1.カードリーダーの購入

マイナンバーカードをPCで読み取るにはカードリーダーが必要です。J-LISが提供している[JPKI利用者ソフト](https://www.jpki.go.jp/download/)では、スマホをカードリーダーとして利用できますが([参考](https://curio-shiki.com/blog/support/mynumber-card-with-smartphone))、今回使用するOpenSCでは利用できないため(できるかも？)購入する必要があります。私は以下urlのものを購入しました。

カードリーダーをPCに接続し、マイナンバーカードを挿入してください。

https://www.amazon.co.jp/dp/B0B5YXBH5J

## 2. OpenSCのインストール

OpenSCの説明は公式githubを機械翻訳したものを引用します([引用元](https://github.com/OpenSC/OpenSC/wiki))

> OpenSCは、スマートカードを操作するライブラリとユーティリティのセットを提供します。主に暗号操作をサポートするカードを対象としており、認証、メール暗号化、デジタル署名などのセキュリティアプリケーションでの使用を容易にします。

[公式github](https://github.com/OpenSC/OpenSC?tab=readme-ov-file#downloads)の**Downloads/Latest release**にあるurlをクリックします。最新リリースのページに飛んだら、**Assets**内にある`OpenSC-0.**.*_win64.msi`をクリックし、ダウンロードします。ダウンロードするファイルはご利用の環境に合わせて変更してください。

ダウンロードしたmsiファイルを実行し、インストールを完了してください。その後、以下のバージョン確認コマンドをコマンドプロンプトで実行し、正常にインストールできたことを確認します。

※ インストールしたフォルダを絶対パスで指定してください

```
"C:\Program Files\OpenSC Project\OpenSC\tools\opensc-tool.exe" --version
```

```
出力例
OpenSC-0.26.1, rev: 043343d2d, commit-time: 2025-01-14 15:39:55 +0100
```

## 3. OpenSSLのインストール

OpenSSLの説明は公式githubを機械翻訳したものを引用します([引用元](https://openssl-library.org/))

> OpenSSLソフトウェアライブラリは、汎用暗号化と安全な通信を実現する、堅牢で商用グレードのフル機能ツールキットです。

[ダウンロードサイト](https://slproweb.com/products/Win32OpenSSL.html)で`Win64 OpenSSL v3.*.* Light`をダウンロードします。`EXE`と`MSI`はどちらでも構いません。ダウンロードできたら、インストーラーを起動してOpenSLLをインストールしてください。私はすべてデフォルトでインストールしました。

## 4. OpenSSLのパス設定

スタートボタンを右クリックし、`ファイル名を指定して実行`を選択します。入力欄に`SystemPropertiesAdvanced`を入力し、`OK`を押すと以下の画面が出てきます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950815/c842f7a2-56f8-4059-93c2-e4621f76e0ef.png width=50%>

`環境変数(N)`をクリックし、`システム環境変数(S)`の中から変数が`Path`になっているものを探します。`Path`をクリックし、`編集(I)`を押すと以下のような画面が出現します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950815/6cf25535-105f-4e48-8d50-3ec8bb630dec.png width=50%>

`新規(N)`をクリックし、デフォルトでインストールした方は`C:\Program Files\OpenSSL-Win64\bin`と入力します。その後`OK`を押すとパスの設定が完了します。

以下のバージョン確認コマンドをコマンドプロンプトで実行し、正常にインストールできたことを確認してください。

```
openssl version
```

```
出力例
OpenSSL 3.5.0 8 Apr 2025 (Library: OpenSSL 3.5.0 8 Apr 2025)
```

## 5. 電子証明書の読み出し

マイナンバーカード内の電子証明書を読み出していきます。まずはじめにコマンドプロンプトを起動し、以下のコマンドを実行することで、カードリーダーが接続されていることを確認できます。

```
"C:\Program Files\OpenSC Project\OpenSC\tools\opensc-tool.exe" -a
```

```
出力例
Using reader with a card: Circle CIR125 ICC 0
```

### 5.1 利用者証明用電子証明書の読み出し

以下のOpenSCコマンドを実行すると、pem形式で利用者証明用電子証明書を`Downloads`に出力できます。

```
"C:\Program Files\OpenSC Project\OpenSC\tools\pkcs15-tool.exe" --read-certificate 1 --output %USERPROFILE%\Downloads\user-ds.pem
```

次に、以下のOpenSSLコマンドを実行することで、利用者証明用電子証明書の中身を確認できます。

```
openssl x509 -text -noout -in %USERPROFILE%\Downloads\user-ds.cer
```

```
出力例
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: XXXXXX...
        ︙
    Signature Value:
        XX:XX:XX:...
```

### 5.2 署名用電子証明書の読み出し

以下のOpenSCコマンドを実行すると、PINを求められるので入力します。入力後、pem形式で署名用電子証明書を`Downloads`に出力できます。

```
"C:\Program Files\OpenSC Project\OpenSC\tools\pkcs15-tool.exe" --read-certificate 2 --verify-pin  --auth-id 2 --output %USERPROFILE%\Downloads\sig-ds.pem
```

次に、以下のOpenSSLコマンドを実行することで、署名用電子証明書の中身を確認できます。

```
openssl x509 -text -noout -in %USERPROFILE%\Downloads\sig-ds.cer
```

```
出力例
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: XXXXXX...
        ︙
    Signature Value:
        XX:XX:XX:...
```

 X509v3 Subject Alternative Name:のothername:が文字化けしていますが、OpenSSL::ASN1などでパースすれば見られるみたいです([参考](https://techmedia-think.hatenablog.com/entry/2017/10/21/150246))。

## 参考

https://and-engineer.com/articles/ZOWfGBIAACMAFsFP#heading3-6

https://qiita.com/taketakekaho/items/a0d6883fea2043c6589b#opensc