セキュリティキー ガイド
PIV/PKCS#11 & FIDO2/CTAP2 パスキー

Openloop Security Key

株式会社ハウディ・クリプト
Haudi Crypto, Inc.

Version 0.91.15
2026-05-07

目次

  1. はじめに
  2. パスキー(FIDO2/CTAP2)
  3. PIV/PKCS#11
  4. PKCS#11ライブラリパス
  5. SSH公開鍵認証
  6. Firefox TLSクライアント認証
  7. pkcs11-tool リファレンス
  8. PIVスロット・アルゴリズム一覧
  9. トラブルシューティング
  10. 参考資料

1. はじめに

Openloopは暗号資産ハードウェアウォレットとしてだけでなく、セキュリティキーとしても機能します。1台のデバイスで以下の2つのセキュリティ機能を提供します。

機能 プロトコル 主な用途
パスキー FIDO2/CTAP2 Webサイトのパスワードレス認証、二要素認証
PIV/PKCS#11 PIV (NIST SP 800-73) SSH認証、TLSクライアント証明書、コード署名

この2つの機能は用途が重複せず、相互補完の関係にあります。

ユースケース パスキー (CTAP2) PIV/PKCS#11
ブラウザWebAuthn認証
SSH公開鍵認証
TLSクライアント認証
コード署名 / git署名

前提条件

Openloopのパスキーは 2つの経路 (transport) で利用できます。それぞれ前提条件が異なります。

Transport 前提条件 利用シーン
USB CTAPHID (デスクトップ) ソフトウェアのインストール不要、ブラウザのみ Windows / macOS / Linux PC
BLE (Openloop Connect 経由) Openloop Connect モバイルアプリ のインストール + デバイスペアリング必須 iOS / Android スマートフォン

PIV/PKCS#11 については Openloop Connect(デスクトップアプリ)の起動が必要です。PKCS#11ライブラリはConnectに同梱されています。


2. パスキー(FIDO2/CTAP2)

2.1 概要

OpenloopはFIDO2/CTAP2準拠のセキュリティキーとして動作します。パスワードに代わる安全な認証手段として、対応するWebサイトやサービスで利用できます。

認証ステータス: 現時点で Openloop は FIDO Alliance の FIDO Certified Authenticator 認証 (FIDO2 Certified) を取得していません。仕様準拠のCTAP2/WebAuthn 実装ではありますが、FIDO Alliance 公式認証および AAGUID 登録 (FIDO Metadata Service) については、将来的な取得を検討する可能性があります。

項目 仕様
プロトコル CTAP2 (FIDO_2_0)
後方互換 U2F (FIDO U2F V2)
通信 (Transport) USB HID (CTAPHID) / BLE (Openloop Connect 経由、後述)
署名アルゴリズム ES256 (P-256) / EdDSA (Ed25519)
Discoverable Credential サポート(Resident Key)
User Verification デバイスPIN + 物理タッチ
最大クレデンシャル数 100
Attestation 自己証明(Self-attestation)

ファクトリーリセットについて: ファクトリーリセットを実行すると、すべてのFIDO2パスキーおよびPIV鍵が完全に削除されます。パスキーはリカバリーフレーズでは復元できません。各サービスでのセキュリティキー再登録が必要です。

2.2 2つのトランスポート (USB / BLE) — 重要

OpenloopのパスキーはUSBとBLEで動作経路がまったく異なります。混同しやすいので最初に明確化します。

🔌 USB CTAPHID 経路 (デスクトップ)

[PC ブラウザ] ──── USB HID (CTAPHID) ──── [Openloop デバイス]
              ↑
              OS標準のセキュリティキー機能で動作
              Openloop Connect は不要

📶 BLE (Openloop Connect 経由) 経路 (モバイル)

[iOS/Android ブラウザ]
   ↓ navigator.credentials API
[OS Credential Manager]
   ↓ Provider 選択 (ユーザー操作)
[Openloop Connect アプリの Credential Provider Extension/Service]
   ↓ BLE
[Openloop デバイス]

iOS 注意: ピッカーに「Openloop Connect」と表示されるが、通信は USB ではなく BLE で行われます。iOS の仕様上、Extension の表示名は親アプリ名 (Openloop Connect) に固定されるため、BLE 経由で動作することがUI上分かりにくい点に注意してください。

2.3 Transport別 RP挙動 — 重要 (Google等)

ほとんどの RP (Relying Party、=Webサイト) では 1回の登録で USB/BLE どちらの transport でも使用可能 です。しかし一部のRP (代表例: Google) は厳格な transports hint フィルタリングを行うため、USB登録 credential は USB経路でのみ、BLE登録 credential は BLE経路でのみ 使えます。

影響する具体例

RP USB登録分の BLE 利用 BLE登録分の USB 利用
大半のサイト (Microsoft, GitHub, JAL 等) 動作 動作
Google iOS BLE picker から見えない △ 動作 (Mac/Chrome の transport filter は緩い)

両transport で使いたい場合 (Google等)

同じ Openloop デバイス で USB と BLE の2回 passkey 登録 することで、両 transport で使える状態にできます。Openloop は同じハードウェアでも transport ごとに異なる credential ID を生成するため、サーバ側に独立した2つのcredentialとして登録されます。

Google アカウント設定:
  ├─ セキュリティキー欄: USB登録分 (PC/Mac で利用)
  └─ パスキー欄: BLE登録分 (iPhone/Android で利用)

2.4 Openloopでの有効化

パスキー機能はデフォルトで無効になっています。USB / BLE どちらを使う場合でも以下の手順で有効化してください。

共通: パスキー機能の有効化

  1. Openloopデバイスの 設定 > パスキー を開く
  2. パスキーON に設定

USB CTAPHID 経路を使う場合

  1. 設定 > USB設定 を開く
  2. USB HIDON に設定

BLE (Openloop Connect) 経路を使う場合

  1. 設定 > Bluetooth を開く
  2. BluetoothON に設定
  3. iOS / Android で Openloop Connect アプリを起動、デバイスをペアリング・選択

2.5 Resident Key と Non-Resident Key

パスキーのクレデンシャルには2種類あります。

種類 説明 特徴
Resident Key(Discoverable Credential) クレデンシャル情報をデバイス内に保存。ユーザー名の入力なしで認証可能。 デバイスの保存領域を使用。Openloopでは最大100個まで保存可能。
Non-Resident Key クレデンシャルIDにデバイス固有の暗号で包んだ情報を埋め込む。デバイス内に状態を保持しない。 保存数の制限なし。ただし認証時にサーバーからcredentialIdの提示が必要。

Webサイトがどちらを要求するかは、登録時の residentKey パラメータで決まります。近年のパスキー対応サービス(Google、Microsoft、GitHub等)はResident Keyを要求するのが一般的です。

デバイスに保存されたResident Keyの一覧は、設定 > パスキー > クレデンシャル一覧 で確認・削除できます。Non-Resident Keyはデバイスに状態を持たないため一覧には表示されません。

2.6 パスキーの登録 — USB CTAPHID 経路 (デスクトップ)

PC のブラウザから Openloop を USB セキュリティキーとして登録します。

  1. Webサイトのセキュリティ設定で「セキュリティキーを追加」等を選択
  2. ブラウザがセキュリティキーの挿入を求めるダイアログを表示
  3. OpenloopをUSBで接続(または既に接続済み)
  4. Openloopのデバイス画面に登録リクエストが表示される
  5. 内容を確認し、承認をタッチ
  6. デバイスPINの入力を求められる場合があります(User Verification設定による)

2.7 パスキーによる認証 — USB CTAPHID 経路

登録済みのWebサイトにPCのブラウザからログインする際に使用します。

  1. Webサイトのログイン画面で「セキュリティキーでログイン」等を選択
  2. OpenloopをUSBで接続
  3. Openloopのデバイス画面に認証リクエストが表示される
  4. 承認をタッチ

2.8 パスキーの登録 — BLE (Openloop Connect 経由) (モバイル)

iPhone / Android のブラウザから、Openloop Connect 経由で BLE 接続した Openloop に passkey を登録します。

事前準備

  1. Openloop Connect モバイルアプリをインストール (App Store / Google Play)
  2. アプリを起動し、Openloop デバイスと BLE ペアリング + デバイス選択 (Connectのデバイス管理画面)
  3. Openloop デバイスで 設定 > Bluetooth が ON になっていることを確認

登録手順

  1. iOS Safari / Android Chrome で対象サイトを開く
  2. パスキー登録メニュー (例: Google: 「パスキーを作成」)
  3. OS の Credential Manager picker が表示される:
    • iOS: 「Openloop Connect」を選択 (※ BLE で動作するが picker 表示は「Connect」)
    • Android: 「Openloop Connect」を選択
  4. Connect が BLE で Openloop と通信開始、デバイス画面に登録リクエスト表示
  5. デバイスの 承認 ボタンを押下
  6. 登録完了

2.9 パスキーによる認証 — BLE (Openloop Connect 経由)

  1. ブラウザで対象サイトのログイン画面 → パスキー認証選択
  2. OS picker で Openloop Connect 選択
  3. Connect が BLE で Openloop と通信、デバイス画面に認証リクエスト表示
  4. デバイスの 承認 ボタンを押下
  5. ログイン完了

transport icon表示: Openloop デバイスのパスキー一覧画面では、各 credential の左に 🔌(USB) または 📶(Bluetooth) アイコンが表示され、どちらの経路で登録されたかを区別できます。

2.10 クレデンシャルの管理

登録したパスキーはOpenloopデバイス上で管理できます。

パスキーリセットを実行すると、すべてのクレデンシャルが削除されます。各Webサイトで再登録が必要になります。

2.11 対応ブラウザ・プラットフォーム

USB CTAPHID 経路

OS Chrome Edge Safari Firefox
Windows -
macOS -

BLE (Openloop Connect 経由) 経路

OS ブラウザ Openloop Connect 必須
iOS 17+ Safari (Credential Provider Extension 経由)
Android 14+ Chrome / Edge (Credential Provider Service 経由)

iOS の場合、ブラウザの passkey ピッカーには「Openloop Connect」と表示されますが、これは iOS Extension仕様の親アプリ名固定 (CFBundleDisplayName 無視) によるもので、実際の通信は BLE で行われます

2.12 対応サービスの例

パスキーに対応する主要なWebサイト・サービス:

対応サービスの最新リストは passkeys.directory で確認できます。


3. PIV/PKCS#11

3.1 概要

OpenloopはPIV(Personal Identity Verification, NIST SP 800-73)スマートカードインターフェースを実装しています。PKCS#11共有ライブラリを通じて、SSH認証やTLSクライアント認証など、パスキーではカバーできないユースケースに対応します。

3.2 アーキテクチャ

SSH / Firefox / pkcs11-tool
  ↓ PKCS#11 C API
libopenloop-pkcs11 (.dylib / .dll / .so)
  ↓ PIV APDU → WebSocket (ws://127.0.0.1:21320)
Openloop Connect (APDUの透過転送)
  ↓ USB HID
Openloop デバイス (PIVハンドラ → SE050で署名)

PKCS#11ライブラリはOpenloop Connect経由でデバイスと通信するため、PIV/PKCS#11機能を使用する際はOpenloop Connectが起動している必要があります。

3.3 PIV/PKCS#11の有効化

設定 > パスキー・PIV > PIV ON でPIVを有効化します。OFFにするとPKCS#11のスロットが非表示になります。

また、以下の設定も確認してください:

  1. Openloop Connectをインストール・起動する
  2. Openloopデバイスの 設定 > USB設定 > USB HIDON に設定
  3. OpenloopをUSBで接続し、ConnectがデバイスをDevice Connectedと表示することを確認

3.4 PIV PIN設定

PIV PINはオプションです。PINを設定するとUSB経由のPIN認証が有効になり、PIN送信時は確認画面なしで署名されます(ブラインド署名)。PINを設定しない場合は、従来通りデバイス画面での確認操作が必要です。

デュアルモード

OpenloopのPIV実装は、PIN送信の有無に応じて2つの動作モードを提供します。

モード 動作 用途
PIN送信あり ブラインド署名(確認画面なし、自動署名) 自動化・CI/CD・スクリプト向け
PIN未送信 従来の確認画面フロー(デバイス画面で承認) 対話的な利用

1つのデバイスで両方のモードを使い分けることができます。PINを送信するかどうかはクライアント側(SSH設定等)で制御します。

PIN設定方法

# PINの初期設定
pkcs11-tool --module "$MODULE" --login --init-pin --new-pin 123456

# PINの変更
pkcs11-tool --module "$MODULE" --login --change-pin --pin 123456 --new-pin 654321

PINの削除

PINを削除するには、以下のいずれかの方法を使用します:

PINロック時の対処

PINを8回連続で間違えるとロックされます。ロック状態になった場合は、デバイスUIの🗑ボタンでPINを削除し、再設定してください。

SSH使用例(PIN付き)

# PIN付きでSSH接続
ssh -o "PKCS11Provider=$MODULE" -o "PKCS11Pin=123456" user@host

PINをコマンドラインに直接記述すると、シェル履歴やプロセス一覧に残る可能性があります。セキュリティが重要な環境では、ssh-agentの利用やPIN未送信モード(デバイス確認画面フロー)を検討してください。


4. PKCS#11ライブラリパス

PKCS#11ライブラリはOpenloop Connectに同梱されています。アプリインストールパス配下の pkcs11/ フォルダ内です:

OS アプリパス相対
macOS <app>/Contents/Resources/pkcs11/libopenloop-pkcs11.dylib
Windows <app>/resources/pkcs11/libopenloop-pkcs11.dll
Linux <app>/resources/pkcs11/libopenloop-pkcs11.so

アプリのインストール先 <app> はインストール方法により異なります:

インストール方法 インストール先
macOS (DMG) /Applications/Openloop Connect.app
Windows (公式インストーラ) C:\Program Files\Openloop Connect
Windows (Microsoft Store) PowerShell で (Get-AppxPackage 7CA75049.OpenloopConnect).InstallLocation
Linux (deb) /opt/Openloop Connect

以降の例では、macOS DMG 版の完全パスをシェル変数に設定して使用します:

MODULE="/Applications/Openloop Connect.app/Contents/Resources/pkcs11/libopenloop-pkcs11.dylib"

5. SSH公開鍵認証

OpenloopをPKCS#11経由でSSHハードウェアキーとして使用します。秘密鍵はデバイスのSE050セキュアエレメント内に保管され、外部に取り出すことはできません。

5.1 鍵の準備

PIVスロット(デフォルト: 9A Authentication)に鍵ペアを生成します。鍵の生成方法は以下のいずれかです:

5.2 公開鍵の取得

# デバイスからSSH公開鍵を取得
ssh-keygen -D "$MODULE"

# ファイルに保存
ssh-keygen -D "$MODULE" > ~/openloop_key.pub

取得した公開鍵をリモートサーバーの ~/.ssh/authorized_keys に追加してください。

5.3 SSH接続

# 単発の接続
ssh -I "$MODULE" user@hostname

5.4 永続的な設定(~/.ssh/config)

毎回 -I オプションを指定する代わりに、~/.ssh/config に設定を記述できます。

# 特定のホストに適用
Host myserver
    HostName 192.168.1.100
    User ubuntu
    PKCS11Provider /Applications/Openloop Connect.app/Contents/Resources/pkcs11/libopenloop-pkcs11.dylib

# すべてのホストに適用
Host *
    PKCS11Provider /Applications/Openloop Connect.app/Contents/Resources/pkcs11/libopenloop-pkcs11.dylib

5.5 SSH実装の互換性とOpenSSH推奨

OpenloopのPIV/PKCS#11はP-256、Ed25519、RSA-2048の3つのアルゴリズムをサポートしています(RSA-2048対応)。SSH実装によってPKCS#11経由で利用できるアルゴリズムが異なります

SSH実装 RSA-2048 P-256 (ECDSA) Ed25519 (EdDSA) 備考
OpenSSH (8.5以降) 推奨。全アルゴリズムをフルサポート。
macOS システムSSH (/usr/bin/ssh) PKCS#11経由ではRSAのみ安定。
PuTTY (Windows) PKCS#11対応が限定的。RSA中心。
Dropbear PKCS#11非対応。

OpenSSH(Homebrew版)の使用を強く推奨します。 macOSのシステムSSH(Apple版)はPKCS#11経由でのECDSA/EdDSAサポートが不完全です。RSA-2048鍵を使用すれば互換性の問題を回避できます。

# Homebrew OpenSSHのインストール
brew install openssh

# Homebrew版を使用(フルパス指定)
/opt/homebrew/bin/ssh -I "$MODULE" user@hostname

# バージョン確認(8.5以上であることを確認)
/opt/homebrew/bin/ssh -V

# ~/.ssh/config で IgnoreUnknown UseKeychain を追加
# (Homebrew SSHが認識しない macOS 独自オプションの警告を抑制)

5.6 デバッグ

# PKCS#11ライブラリのデバッグ出力を有効化
OPENLOOP_PKCS11_DEBUG=1 ssh-keygen -D "$MODULE"

# SSH接続の詳細ログ
ssh -vvv -I "$MODULE" user@hostname

6. Firefox TLSクライアント認証

なぜFirefoxか

主要ブラウザの中で、Firefoxは唯一、外部PKCS#11モジュールの読み込みをサポートしているブラウザです。ChromeやEdge、SafariはOS標準のキーチェーン/証明書ストアのみを使用し、サードパーティのPKCS#11ライブラリを直接読み込む機能を提供していません。そのため、OpenloopのPKCS#11ライブラリを使ったTLSクライアント認証はFirefoxで利用します。

PKCS#11モジュールをFirefoxに登録して、TLSクライアント証明書認証(mTLS)を利用します。

6.1 PKCS#11モジュールの登録

  1. Firefoxの 設定 を開く
  2. プライバシーとセキュリティ に移動
  3. 証明書 セクションの セキュリティデバイス… をクリック
  4. 読み込む をクリック
  5. モジュール名: Openloop と入力
  6. モジュールファイル名: 上記のライブラリパスを参照して選択
  7. OK をクリック

6.2 確認方法

  1. セキュリティデバイスダイアログで Openloop モジュールを展開
  2. トークン情報が表示されるスロットを確認
  3. 証明書を表示(設定 > 証明書 > 証明書を表示)をクリック
  4. あなたの証明書 タブにOpenloopの証明書が表示されます

6.3 mTLS認証フロー

クライアント証明書を要求するWebサイトにアクセスすると、Firefoxが自動的にOpenloopデバイスから証明書を選択するよう促します。署名操作にはUser Presence(デバイスへの物理的なタッチ)が必要です。

6.4 自動登録(macOS)

macOSでは、Openloop Connectが以下のパスにマニフェストを配置することで、PKCS#11モジュールをFirefoxに自動登録できます:

~/Library/Application Support/Mozilla/PKCS11Modules/openloop_pkcs11.json

自動登録が有効な場合、手動での登録は不要です。


7. pkcs11-tool リファレンス

OpenSCのpkcs11-toolコマンドを使って、デバイスの鍵やオブジェクトを操作できます。

インストール

# macOS
brew install opensc

# Ubuntu/Debian
sudo apt install opensc

# Windows
# OpenSCインストーラーからインストール: https://github.com/OpenSC/OpenSC/releases

スロット・トークン一覧

pkcs11-tool --module "$MODULE" -T

オブジェクト一覧

pkcs11-tool --module "$MODULE" -O

鍵ペア生成

# P-256 をスロット 9A(Authentication)に生成
pkcs11-tool --module "$MODULE" --keypairgen \
  --key-type EC:prime256v1 \
  --id 01 --label "PIV AUTH"

# Ed25519 をスロット 9A に生成
pkcs11-tool --module "$MODULE" --keypairgen \
  --key-type EC:edwards25519 \
  --id 01 --label "PIV AUTH"

署名テスト

# テストデータを作成し、スロット 9A の鍵で署名
echo "test data" | openssl dgst -sha256 -binary > /tmp/hash.bin
pkcs11-tool --module "$MODULE" --sign \
  --mechanism ECDSA \
  --id 01 \
  --input-file /tmp/hash.bin \
  --output-file /tmp/sig.bin

鍵の削除

pkcs11-tool --module "$MODULE" --delete-object \
  --type privkey --id 01

8. PIVスロット・アルゴリズム一覧

8.1 PIVスロット

スロット 名前 用途
9A PIV Authentication SSH認証、一般的な認証。最も使用頻度が高い。
9C Digital Signature 文書署名、S/MIME。常にPINが必要。
9D Key Management 暗号化/復号化、鍵共有。
9E Card Authentication 物理アクセス、非接触認証。PIN不要。

8.2 対応アルゴリズム

アルゴリズム PIV ID 備考
P-256 (secp256r1) 0x11 NIST P-256によるECDSA。広くサポートされている。
Ed25519 0x22 Curve25519によるEdDSA。SSHにはOpenSSH 8.5以上が必要。
RSA-2048 0x07 PKCS#1 v1.5署名。SSH/GPG/PDF署名に対応。鍵生成に約10秒。

8.3 PKCS#11オブジェクトID マッピング

PIVスロット PKCS#11 ID CKA_LABEL 用途
9A 01 PIV AUTH Authentication
9C 02 SIGN Digital Signature
9D 03 KEY MGMT Key Management
9E 04 CARD AUTH Card Authentication

9. トラブルシューティング

パスキーが認識されない

PKCS#11ライブラリが見つからない

ssh-keygen -D で鍵が表示されない

Firefox でモジュールが読み込めない

署名時にタイムアウトする

デバッグログの取得

PKCS#11ライブラリのデバッグ出力を有効にすることで、通信の詳細を確認できます:

OPENLOOP_PKCS11_DEBUG=1 ssh-keygen -D "$MODULE"

10. 参考資料

FIDO2 / WebAuthn

資料 URL
CTAP2仕様 (FIDO Alliance) https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html
WebAuthn仕様 (W3C) https://www.w3.org/TR/webauthn-2/
U2F仕様 (FIDO Alliance) https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/
CTAPHID — USBトランスポート https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html#usb
パスキー対応サービス一覧 https://passkeys.directory

PIV / PKCS#11

資料 URL
NIST SP 800-73 (PIV仕様) https://csrc.nist.gov/pubs/sp/800/73/4/final
PKCS#11仕様 (OASIS) https://docs.oasis-open.org/pkcs11/pkcs11-base/v3.0/pkcs11-base-v3.0.html
OpenSC (pkcs11-tool) https://github.com/OpenSC/OpenSC
OpenSSH PKCS#11ドキュメント https://man.openbsd.org/ssh-keygen#D

Openloop関連

資料 URL
Openloop PIV/PKCS#11 デモ https://crypto.haudi.jp/openloop/demo/piv/
Openloop パスキー デモ https://crypto.haudi.jp/openloop/demo/ctap2/
Openloop Connect https://crypto.haudi.jp/openloop/

Copyright © 2026 Haudi Crypto, Inc. All rights reserved.