レスポンスの作成/証明書の読み出し
このページでは、PocketSign Verify SDK を使用してマイナンバーカードに搭載された利用者証明用電子証明書を使用してチャレンジに対するレスポンス(Nonce の署名値)の作成と署名に使用した証明書の読み出しを行います。
あらかじめSDK のセットアップを完了しておいてください。
シーケンス
実装例
ここでは、チャレンジ(Nonce)が 0xCAFEBABE
の場合の実装例を示します。
この資料では説明の都合上省略していますが、Nonce は原則としてバックエンド側で生成する必要があります。 クライアントサイドで Nonce を生成する実装は、セキュリティ上の問題があるためご注意ください。
また、一度使用した Nonce は再利用することはできず、当人認証の要求時には毎回新しい Nonce を生成する必要があります。
- iOS
- Android
- Web(PaSoRi)
- Flutter
func run(pin: String) async throws -> String {
// JPKI APへの接続準備を行います。
let session = ReaderSession(dispatchQueue: DispatchQueue.main)
// JPKI APを初期化します。
let ap = JPKIAP(session: session)
// ここでは、これがチャレンジ(Nonce)です。
let challengeNonce = Data([0xCA, 0xFE, 0xBA, 0xBE])
// JPKI APに対して署名を要求します。
let result = try await ap.signDataWithUserAuthenticationSecretKey(
password: pin, data: challengeNonce, hashAlgorithm: .sha256)
session.close()
return "Nonceのハッシュ値: \(result.digest?.base64EncodedString() ?? "")\n"
+ "レスポンス: \(result.signature?.base64EncodedString() ?? "")\n"
+ "証明書: \(result.certificate?.base64EncodedString() ?? "")\n"
}
suspend fun run(pin: String): String {
// JPKI APへの接続準備を行います。
val session = ReaderSession(this, this)
// JPKI APを初期化します。
val ap = JPKIAP(session)
// ここでは、これがチャレンジ(Nonce)です。
val challengeNonce = byteArrayOf(0xCA.toByte(), 0xFE.toByte(), 0xBA.toByte(), 0xBE.toByte())
// JPKI APに対して署名を要求します。
val result = ap.signDataWithUserAuthenticationSecretKey(pin, challengeNonce, HashAlgorithm.SHA256)
session.close()
return "Nonceのハッシュ値: ${Base64.encodeToString(result.digest, Base64.NO_WRAP)}\n" +
"レスポンス: ${Base64.encodeToString(result.signature, Base64.NO_WRAP)}\n" +
"証明書: ${Base64.encodeToString(result.certificate, Base64.NO_WRAP)}\n"
}
Verify SDK for Web PaSoRi は、現在ベータ版での提供となります。
const run = async (pin: string) => {
// JPKI APへの接続準備を行います。
const session = new ReaderSession(nfcPortLib);
// JPKI APを初期化します。
const ap = new JPKIAP(session);
// ここでは、これがチャレンジ(Nonce)です。
const challengeNonce = Uint8Array.from([0xca, 0xfe, 0xba, 0xbe]);
// JPKI APに対して署名を要求します。
const result = await ap.signDataWithUserAuthenticationSecretKey(pin, challengeNonce, HashAlgorithm.SHA256);
await session.close();
return (
`Nonceのハッシュ値: ${btoa(String.fromCharCode(...result.digest))}\n` +
`レスポンス: ${btoa(String.fromCharCode(...result.signature))}\n` +
`証明書: ${btoa(String.fromCharCode(...result.certificate))}\n`
);
};
Verify SDK for Flutter は、現在ベータ版での提供となります。
Future<String> run(String pin) async {
// JPKI APへの接続準備を行います。
final session = ReaderSession();
// JPKI APを初期化します。
final ap = JPKIAP(session);
// ここでは、これがチャレンジ(Nonce)です。
const challengeNonce = [0xca, 0xfe, 0xba, 0xbe];
// JPKI APに対して署名を要求します。
final result = await ap.signDataWithUserAuthenticationSecretKey(
pin,
Uint8List.fromList(challengeNonce),
HashAlgorithm.sha256,
);
await session.close();
return ("Nonceのハッシュ値: ${base64Encode(result.digest)}\n"
"レスポンス: ${base64Encode(result.signature)}\n"
"証明書: ${base64Encode(result.certificate)}\n");
}
モック環境では、FeliCa カード(交通系 IC カード、Edy、WAON など)や、ISO/IEC 14443-4 Type-A カード(クレジットカードなど)をタッチすると、マイナンバーカードの挙動がシミュレートされます。 詳しくはSDK リファレンスをご覧ください。
実行結果
署名に成功すると、以下のように Base64 エンコードされた Nonce のハッシュ値、レスポンス(Nonce の署名値)、署名に使用された証明書が表示されます。 署名検証時には、このデータを PocketSign Verify API に送信します。

次のステップ
取得した利用者 ID を用いて、当人認証によるログインを実装しましょう。
その他、SDK の詳しい使い方やエラーの詳細等については、SDK リファレンスをご覧ください。