IPFire にスマートカード(PC/SC・CCID・OpenSC)を統合する方法

重要: 本ガイドは IPFire の開発(LFS)シェル上での作業を前提としています。実稼働システムに適用する前にテスト環境で検証してください。
概要と目的
この連載記事の続編です。ここではハードウェアトークン(スマートカード)とそのリーダー(CCID 準拠)を IPFire に統合するため、以下のオープンソースツールを IPFire 2.19 向けにコンパイルし、pakfire 形式のアドオンとして配布・インストールする手順を示します。
- pcsc-lite(PC/SC Smart Card Daemon)
- CCID(スマートカードリーダー向けドライバ)
- OpenSC(スマートカード管理/PKCS#11 サポート)
用語定義(一行ずつ簡潔に)
- PC/SC: スマートカードアクセス用の標準 API。
- CCID: USB スマートカードリーダー向けプロトコル/ドライバ群。
- OpenSC: PKCS#11 や PKCS#15 を実装するオープンソースツールセット。
ユースケース例
- 安全な Web ログイン
- ワークステーションログオン
- ファイル暗号化
- VPN(OpenVPN、L2TP)でのクライアント認証
- メール暗号化
サポートされるカードベンダー(一部)
- ASEPCOS
- FTCOSPK01C
- OpenPGP Card
- Cyberflex
- CardOs
- STARCOS
重要: ベンダーごとのサポート状況やカードのフォーマット(PKCS#15 互換など)は実機で確認してください。
目次
- 環境準備
- 開発シェル(test shell)での前提操作
- pcsc-lite のビルドとインストール
- CCID ドライバのビルドと udev ルール
- OpenSC のビルドとインストール
- IPFire 用アドオン(pakfire)としてのパッケージ化
- 実機への配布とインストール
- トラブルシューティングとチェックリスト
- 受け入れ基準
- まとめ
環境準備
開発環境の詳細は前回の記事にありますが、要点は次の通りです。
- IPFire のソースツリーと LFS ビルド環境を用意する
- 作業は root または同等の権限で行う
- 必要なビルドツール(gcc, make, pkg-config 等)を導入しておく
IPFire のテストシェルに入る
IPFire の LFS(build)環境に入り、そこでパッケージの依存関係検証やビルドを行います。ルートディレクトリで次を実行します。
./make shell
ソースパッケージは /usr/src/cache に配置されています。チュートリアルで必要なパッケージはあらかじめ cache に置かれています。
pcsc-lite のソースパッケージが確認できます。
pcsc-lite のビルド
- 事前に必要な開発ライブラリをインストールします。少なくとも libudev-dev が必要です(IPFire の LFS 環境では apt-get を利用した例を記載)。
apt-get install libudev-dev
- ソースを展開して configure を実行します。
tar -xf pcsc-lite-1.8.18.tar.bz2
cd pcsc-lite-1.8.18
./configure
configure がエラーなく通る例。
- make と make install を実行して pcscd をインストールします。
make
make install
インストール成功時に表示される重要なファイルパス(ヘッダやライブラリのインストール先)を控えておきます。これらは CCID の configure 時に参照します。
pcscd が稼働していることを確認します(テストシェル内)。
CCID ドライバのビルド
CCID は USB スマートカードリーダーの汎用ドライバ群です。pcsc-lite を先にインストールしておく必要があります。
cache に配置された ccid パッケージを展開します(例: ccid-1.4.24)。
./configure を実行すると pcsc-lite を検出できずにエラーとなることがあります。
この場合、pcsc-lite を /usr/local にインストールしたようなケースだとインクルードパスや pkg-config のパスが異なるため、明示的に指定します。
./configure PCSC_CFLAGS=-I/usr/local/include/PCSC
さらに、libpcsclite.pc(pkg-config 用の .pc)が見つからない問題が出る場合は、PKG_CONFIG_PATH をエクスポートします。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
./configure PCSC_CFLAGS=-I/usr/local/include/PCSC
再実行で PCSC 関連ヘッダ・ライブラリが検出されれば configure は成功します。
- make && make install で CCID ドライバをインストールします。
make
make install
- スマートカードリーダーの udev ルールを配置します。多くの CCID パッケージは udev ルールファイル(例: 92_pcscd_ccid.rules)を同梱しています。これを /etc/udev/rules にコピーしてください。
cp 92_pcscd_ccid.rules /etc/udev/rules/
コピー後、udev を再読み込みまたはシステム再起動して正しく権限・デバイスノードが作成されることを確認します。
OpenSC のビルド(スマートカード管理)
OpenSC は PKCS#11 およびカードファイル構造(PKCS#15)を扱うツール群です。OpenVPN や OpenSSL と連携する際に PKCS#11 を使う場合に重要です。
- ソースを展開し、configure を実行して依存関係を確認します。
cd opensc-0.16.0
./configure
configure の出力例。
- make && make install を実行します。
make
make install
インストール完了の例。
IPFire アドオン(pakfire)用のパッケージ化
ここからは、ビルド済みの成果物を IPFire の pakfire アドオンとしてパッケージ化し、他の IPFire システムに配布/インストールできる形式にします。
基本手順のポイント:
- 各パッケージごとに lfs スクリプト(LFS ビルドスクリプト)を作成する
- make.sh(ビルド管理スクリプト)に新しいアドオンを追加する
- ビルド後に生成される rootfiles を config/rootfiles/packages に配置する
- rootfiles 中の余分な記号(例: +)を削除する
- src/paks/
/ に install.sh, uninstall.sh, update.sh を配置する
LFS スクリプトをダウンロードして ipfire-2.x の lfs ディレクトリに配置します。
各パッケージの lfs スクリプト例(画面はそれぞれのファイル内容):
make.sh に新しいアドオンのビルドルールを追加します(差分表示の例)。
ビルドコマンド(各パッケージに対して):
ipfiremake pcsc-lite
ipfiremake ccid
ipfiremake opensc
あるいは LFS スクリプトをまとめて走らせる場合:
./make.sh build
ビルドは 2 回実行する必要があるケースがあります(最初の実行で rootfiles が生成され、次にそれらを config に組み込んで再ビルドする)。
初回ビルドでは rootfiles が log ディレクトリに作成されるが、config にまだ配置されていないためビルド段階で “rootfiles not found” のメッセージが出ることがあります。
これらを config/rootfiles/packages にコピーし、ファイル名を lfs スクリプト名に合わせて変更します。
cp log/pcsc-lite-1.8.18 config/rootfiles/packages/pcsc-lite
cp log/ccid-1.4.24 config/rootfiles/packages/ccid
cp log/opensc-0.16.0 config/rootfiles/packages/opensc
rootfiles 内に “+” 記号が入っている場合、pakfire の仕様上それを取り除く必要があります。sed で一括置換します。
sed -i 's/+//g' config/rootfiles/packages/pcsc-lite
sed -i 's/+//g' config/rootfiles/packages/ccid
sed -i 's/+//g' config/rootfiles/packages/opensc
例: pcsc-lite の rootfile(+ が含まれている状態)
sed 実行例の画面(+ を削除している様子)
実行後、+ が除去されていることを確認します。
pakfire 用のディレクトリ構成を整えます。src/paks/
再度ビルドを実行します。
./make.sh build
最終的に packages ディレクトリに .ipfire パッケージが生成されます。
コンパイル済みパッケージの実稼働システムへの配布とインストール
生成された .ipfire パッケージを稼働中の IPFire システムへコピーします。ここでは /opt/pakfire/tmp に配置する例を示します。
コピーされたことを確認します。
パッケージを展開します(中身は install.sh 等が含まれます)。
tar -xvf pcsc-lite-1.8.18-2.ipfire
tar -xvf ccid-1.4.24-2.ipfire
tar -xvf opensc-0.16.0-2.ipfire
各パッケージの install.sh を実行してインストールします。
./install.sh
pcsc-lite のインストール成功例。
CCID ドライバのインストール例。
OpenSC のインストール完了画面。
トラブルシューティング(よくある問題と対処)
configure が pcsc-lite を検出しない
- 対処: PCSC_CFLAGS を明示的に指定し、PKG_CONFIG_PATH に /usr/local/lib/pkgconfig(またはインストール場所)を追加する。
- 追加確認: libpcsclite.pc が存在するか、pkg-config –modversion libpcsclite で確認。
rootfiles に + が含まれる
- 対処: sed で + を削除してから再ビルド。
udev ルールが反映されない
- 対処: /etc/udev/rules/ 配置後に udevadm control –reload && udevadm trigger を実行する。デバイスが正しい権限で作成されているか確認。
pcscd が起動しない/リーダーを認識しない
- 対処: pcscd をデバッグモードで起動してログを確認(-f -d オプションなど)。USB デバイスが /dev/bus/usb に表示されるか lsusb で確認。
PKCS#11 が期待どおり動作しない(OpenSC 経由)
- 対処: pkcs11-tool や opensc-tool でカード情報が取得できるか検証。権限(カードへのアクセス)や PIN 周りを確認。
チェックリスト(導入前・導入後)
デベロッパー向け(ビルド準備)
- IPFire の LFS シェルに入れることを確認
- 必要なビルドツール(gcc, make, pkg-config)を確認
- pcsc-lite, ccid, opensc のソースを /usr/src/cache に配置
- make.sh と lfs スクリプトを更新済み
パッケージ作成者向け
- rootfiles を config/rootfiles/packages に配置
- rootfiles の余分な文字を削除
- src/paks/
に install.sh, uninstall.sh, update.sh を用意 - packages/
.ipfire が生成されることを確認
システム管理者向け(実稼働適用前)
- テスト環境でカードリーダーの動作確認を完了
- udev ルールと権限を確認
- pcscd と pkcs11 モジュールのログ確認
- ロールバック手順を用意(パッケージの uninstall.sh)
受け入れ基準
- pcscd が起動し、USB リーダーを検出する
- pkcs11-tool でカードの情報が取得できる
- パッケージは packages ディレクトリに .ipfire として生成される
- install.sh を使って稼働環境に導入できる
- uninstall.sh で問題なく削除できる
ミニ SOP(開発→パッケージ→配布の簡易手順)
- LFS シェルで各ソースをビルドしてインストール(pcsc-lite → ccid → opensc)
- 各 rootfile を log から config/rootfiles/packages にコピーし修正
- src/paks/
に install/uninstall/update スクリプトを準備 - ./make.sh build を実行して .ipfire を生成
- /opt/pakfire/tmp にコピーして稼働機で展開、./install.sh を実行
スキャンしやすいトラブル診断フローチャート(Mermaid)
flowchart TD
A[configure に失敗] --> B{エラーメッセージ}
B -->|libpcsclite not found| C[PKG_CONFIG_PATH を確認]
B -->|header not found| D[PCSC_CFLAGS を指定]
C --> E[export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig]
D --> F[./configure PCSC_CFLAGS=-I/usr/local/include/PCSC]
E --> G[再実行 ./configure]
F --> G
G --> H{成功?}
H -->|はい| I[make && make install]
H -->|いいえ| J[ログを確認して依存を追加]
テストケース(受け入れ試験)
- ケース 1: pcscd を起動し、lsusb でリーダーが見える → pkcs11-tool でカードを読み取る
- ケース 2: udev ルールを適用後、カード抜き差しで /dev/ に適切なノードが作成される
- ケース 3: pakfire パッケージを使ってインストール/アンインストールを行い、状態が復元される
注意事項とベストプラクティス
- 実稼働 IPFire に直接適用する前に、同一バージョンのテスト環境で十分に検証すること。
- スマートカードの PIN や鍵管理は厳格に運用し、キーのバックアップ・失効手順を整備すること。
- 標準の udev ルールで不足するベンダー固有のデバイスは、ベンダー提供の情報を参照して追加ルールを作成する。
まとめ
本稿では IPFire 2.19 の開発環境で pcsc-lite、CCID、OpenSC をビルドし、pakfire 形式で配布する一連の手順を詳述しました。重要なのは依存関係(特に pcsc のヘッダ/pkg-config 情報)を正しく参照させること、rootfiles の整備、udev ルールの配置と動作確認です。導入後は pkcs11 ツール群で動作検証し、カードの種類やベンダーごとの差分に注意してください。
重要: この手順は IPFire のビルドフローと内部構造に依存しています。IPFire の将来のバージョンや各ツールの新しいリリースでは手順が変わる可能性があります。