真正性検証ガイド

製品版LibJeIDは様々な本人確認書類を真正性検証するための統一されたAPIを提供します。

現在、真正性検証を行える本人確認書類は以下の通りです。

  • 運転免許証
  • マイナンバーカード
  • パスポート(Androidのみ)
  • 在留カード

その他の本人確認書類の真正性検証機能は開発中です。

目次

検証モデル

本人確認書類の真正性検証は大きく2つの検証プロセスに分けられます。

  1. ICチップ内データの署名値検証
  2. 署名値検証に使用した証明書の有効性検証

これらの検証プロセスにパスした場合に検証ステータスVALIDが返ります。

(1)の署名値検証に失敗した場合はINVALID_SIGNATUREステータスが返ります。

(2)の証明書の有効性検証に失敗した場合はINVALID_CERTIFICATEステータスが返ります。

ValidationResult.isValid()は検証ステータスがVALIDの時にtrueを返します。

サンプルコード

Androidで運転免許証の真正性を検証するサンプルコードです。

// 運転免許証APの選択
DriverLicenseAP ap = reader.selectDriverLicenseAP();
// 暗証番号1の入力
ap.verifyPin1("XXXX");
// 暗証番号2の入力
ap.verifyPin2("YYYY");
// Filesオブジェクトの読み出し
DLFiles files = ap.readFiles();
// 真正性検証
ValidationResult result = files.validate();
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}

iOSで運転免許証の真正性を検証するサンプルコードです。

// 運転免許証APの選択
let ap = try reader.selectDL()
// 暗証番号1の入力
try ap.verifyPin1("XXXX")
// 暗証番号2の入力
try ap.verifyPin2("YYYY")
// Filesオブジェクトの読み出し
let files = try ap.readFiles()
// 真正性検証
let result = try files.validate()
if result.isValid {
    print("検証成功")
} else {
    print("検証失敗: " + result.description)
}

検証基準時刻について

証明書の有効性検証は証明書が有効期限内であるかを確認し、有効期限切れで あった場合はINVALID_CERTIFICATEステータスを返します。

この証明書の有効性検証に使用する時刻を検証基準時刻と言います。

*Files.validate()メソッドは既定で端末時刻を使用しますの で端末の時刻がズレている場合に正しい検証結果が得られない場合があります。

これを許容できない場合、外部のサーバーで生成した正確な時刻を検証基準時刻として使用する方法も提供しています。

以下はvalidate()メソッドに検証基準時刻をパラメーターとして渡すサンプルコードです。

// 2021年1月1日 を検証基準時刻として使用する
ValidationParameters params = new ValidationParameters();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
params.setDate(sdf.parse("2021/01/01"));
// 真正性検証
ValidationResult result = files.validate(params);
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}
// 2021年1月1日 を検証基準時刻として使用する
let params = ValidationParameters()
let formatter = DateFormatter()
formatter.timeZone = TimeZone(identifier: "GMT")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
params.date = formatter.date(from: "2021-01-01 00:00:00")
var result = try files.validate(params)
if(result.isValid) {
    print("検証成功")
} else {
    print("検証失敗: " + result.description)
}

運転免許証についての補足

  • 暗証番号1と暗証番号2の両方を入力しなければ運転免許証の真正性検証を行うことは出来ません。

パスポートについての補足

パスポートの真正性検証は既定で日本の外務省が発行する日本国のパスポートを真正性検証します。

サンプルコードは以下の通りです。

// パスポートAPを選択
PassportAP ap = reader.selectPassportAP();
// BACを開始
ap.startBAC(new EPMRZ("パスポート番号", "誕生日", "有効期限"));
// Filesオブジェクトの読み出し
EPFiles files = ap.readFiles();
// 日本国のCSCA証明書で真正性検証を行う
ValidationResult result = files.validate();
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}

例外的にタイ国のパスポートを検証する機能を用意しています。

サンプルコードは以下の通りです。

// パスポートAPを選択
PassportAP ap = reader.selectPassportAP();
// BACを開始
ap.startBAC(new EPMRZ("パスポート番号", "誕生日", "有効期限"));
// Filesオブジェクトの読み出し
EPFiles files = ap.readFiles();
// タイ国のCSCA証明書で真正性検証を行う
ValidationParameters params = new ValidationParameters();
params.setCountry("TH");
ValidationResult result = files.validate(params);
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}

マイナンバーカードの真正性検証

マイナンバーカードは券面入力補助AP、券面確認APのそれぞれのデータに対して真正性を行ないます。

券面入力補助APの真正性検証

Androidのサンプルコードです。

// 券面入力補助APの選択
INTextAP ap = reader.selectINTextAP();
// 暗証番号(4桁)の入力
ap.verifyPin("XXXX");
// Filesオブジェクトの読み出し
INTextFiles files = ap.readFiles();
// 真正性検証
ValidationResult result = files.validate();
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}

iOSのサンプルコードです。

// 券面入力補助APの選択
let ap = try reader.selectINTextAP()
// 暗証番号1の入力
try ap.verifyPin("XXXX")
// Filesオブジェクトの読み出し
let files = try ap.readFiles()
// 真正性検証
let result = try files.validate()
if result.isValid {
    print("検証成功")
} else {
    print("検証失敗: " + result.description)
}

上記のサンプルコードは個人番号と4属性の両方を読み出し真正性検証を行います。 このほかに、個人番号のみや4属性のみを対象に検証を行うケースがあります。 以下は4属性のみを読み出して検証を行うサンプルコードです。

// 券面入力補助APの選択
INTextAP ap = reader.selectINTextAP();
// 照合番号B(14桁)の入力
ap.verifyPinB("XXXXXXXXXXXXXX");
// 4属性のみ読み出し
INTextFiles files = ap.readFiles(); 
// 検証パラメーターを作成
ValidationParameters param = new ValidationParameters();
// マイナンバーの検証を行わない
param.setValidateMyNumber(false);
// 真正性検証
ValidationResult result = files.validate(param);
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}
// 券面入力補助APの選択
let ap = try reader.selectINTextAP()
// 照合番号B(14桁)の入力
try ap.verifyPinB("XXXXXXXXXXXXXX")
// Filesオブジェクトの読み出し
let files = try ap.readFiles()
// 検証パラメーターを作成
let params = ValidationParameters()
// マイナンバーの検証を行わない
params.validateMyNumber = false
// 真正性検証
let result = try files.validate(param)
if result.isValid {
    print("検証成功")
} else {
    print("検証失敗: " + result.description)
}

券面確認APの真正性検証

Androidのサンプルコードです。

// 券面確認APの選択
INTextAP ap = reader.selectINVisualAP();
// 暗証番号(4桁)の入力
ap.verifyPin("XXXX");
// Filesオブジェクトの読み出し
INVisualFiles files = ap.readFiles();
// 真正性検証
ValidationResult result = files.validate();
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}

iOSのサンプルコードです。

// 券面確認APの選択
let ap = try reader.selectINVisualAP()
// 暗証番号1の入力
try ap.verifyPin("XXXX")
// Filesオブジェクトの読み出し
let files = try ap.readFiles()
// 真正性検証
let result = try files.validate()
if result.isValid {
    print("検証成功")
} else {
    print("検証失敗: " + result.description)
}

在留カードの真正性検証

Androidのサンプルコードです。

// 在留カードAPの選択
ResidenceCardAP ap = reader.selectResidenceCardAP();
// 在留カード番号からRCKeyオブジェクトを生成
RCKey rckey = new RCKey("XXXXXXXXXXXX");
// アクセスコントロールの開始
ap.startAC(rckey);
// Filesオブジェクトの読み出し
RCFiles files = ap.readFiles();
// 真正性検証
ValidationResult result = files.validate();
if (result.isValid()) {
    System.out.println("検証成功");
} else {
    System.out.println("検証失敗: " + result);
}

iOSのサンプルコードです。

// 在留カードAPの選択
let ap = try reader.selectRC()
// 在留カード番号からRCKeyオブジェクトを生成
let rckey = try RCKey("XXXXXXXXXXXX")
// アクセスコントロールの開始
try ap.startAC(rckey)
// Filesオブジェクトの読み出し
let files = try ap.readFiles()
// 真正性検証
let result = try files.validate()
if result.isValid {
    print("検証成功")
} else {
    print("検証失敗: " + result.description)
}