BonCasServer for Mac
BonCasServer for Mac(BonCasLink) [2020/11/30 更新]
BoncasServerはWindowsPC用が用意されていますが、私の場合MacMiniServerにVMWare Fusionを用意してその上に仮想Windows7を導入してB~CASサーバーを動作させていました。最近Fusion10にアップデートしたところUSB Driverの動作がどうもおかしく、その他色々の不都合があり、今回Mac OS 10.13(High Sierra)上で直接動作させることにしました。実装方法を解説します。
1. きっかけ
BoncasServerをMacOS上で動作させようと思ってWebを検索したところ、あるサイトがLinux上で動作させている記事がいくつかあった。これによればbcs-perlと言うPerlプログラムが使用できるらしい。早速ダウンロードして(会員登録が必要だったかもしれない)動作させようとした。しかし解説WebはLinuxばかりでMacOSでの動作は工夫が必要である。
2.プログラムを動作させる
2.1 Xcodeの導入
bcs-perlはperlプログラムなのでPerlが必要です。PerlはOSに最初から実装されていますが、多くのモジュールが追加で必要なので、Xcodeコマンドライン機能を導入して、使用することとします。
http://gaiax-techegg.hatenablog.com/entry/2015/07/09/184437を参考にするのが良いでしょう。
このページの最後まで、plenv、Perl 5.20.2、cpanmの導入を行います。
この状態でコマンドラインから、
perl bcs-perl.pl
と打つと、Chipcard::PCSCが無いと怒られるので、
cpanm --force Chipcard::PCSC
と打って、ライブラリーモジュールを導入します。(以前の記事ではChipcardの頭文字が小文字になっていましたが、誤りです。)
[追記 2020/11/30]
現時点(2020/11 MacOS Big Sur)ではplenvのコンパイラが動作せずローカルperlを指定することはできないようです。
これはplenvがOSバージョンをチェックしており、11.00でエラーになっているようです。
仕方がないのでOSのシステム組み込みのperlを使用することにします。だだシステム構成のperlをいじるのでroot権限が必要になります。
% sudo su
# plenv versions
* system (set by /var/root/.plenv/version)
# plenv install-cpanm
# cpanm --force Chipcard::PCSC
# exit
%
で perl bcs-perlを動作させることができます。
[追記 2020/11/30 end]
2.2 bcs-perlソースコードの修正
bcs-perl.plではカードリーダーの名称を設定しなければいけないので、BCASカードを入れたカードリーダーをUSBポートに差し込んで、
pcsctest
と打ってリーダーの名称を検出します。
この例ではReaderが一個しか差し込まれていないので、
Reader 01: NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader
Enter the reader number :
で止まるが 1 と入力するとその後テスト結果を表示する。
そこで、bcs-perl.plをエディトして、下記の様に修正する。
ここで、実際にこのプログラムを動かしてみます。ターミナルから、
perl bcs-perl/bcs-perl.pl
と打ちます。この例ではpcs-perl.plがホームから下のbcs-perlと言うDirectoryにあるのでこの様になっています。
これで、プログラムは動作しています。いや動作している様に見えます。
実際は
>>Begin Listening(0.0.0.0:6900)....
で止まっていますが、クライアントのBonCasProxyから接続すると、
>>Connected from .......
とでて良好に動作している様に見えます。
しかしながら、クライアントはイニシアライズが完了しないと出てさっぱり先に進みません。
最悪の状況です。
2.3 Debugと修正
この状況でDebugするのは、私の実力では無謀とも思われ、しばらくほうって置いたのですが諦めきれずに、Wireshark(ネット監視ツール)まで持ち出して、デバックを開始しました。
Socket通信では、サーバー側がデーターを受信している様ですが、データーがクライアント側に送られていないことが判明しました。
bcs-perl.plのデーター送出部分をチェックしたところ、おかしな部分があったので、下記の様に修正しています。
なんという事でしょう。Sock->send()関数のパラメーターが一つ(オプションもあるが意味が違う)のはずが2つもあります。これはParlのバージョンの違いの為なのでしょうか。そうでなければ酷いバグです。
ともあれ、この部分を修正して、やっと動作させることができました。
3.実装
通常この手のプログラムはサービス登録してシステム起動時に動作開始するか、プログラムをstartupに登録する方法がある。しかし今回はターミナルからコマンドを入力して動作させる方式であるのでプログラムを作成する面倒を避ける為に、下記のの方法を取ることにした。
設定→ユーザとグループからログイン項目からターミナルアプリケーションを追加する。
ターミナルを起動しておいて、
ターミナル>環境設定>プロファイルからシェルを選択してコマンドを追加する。
この設定により、起動後にターミナルが開き、実行結果が表示された状態になるが、私の場合この機械(Mac Mini Server)はBonCasServerのみに立ち上げたので、これで良しとしている。またBCAS cardやcard readerが取り外された場合など引き続き画面(画面共有など)からコマンドを打ち込める利点がある。
4.結論
今回の実装は多くのWebを検索するなど苦労を強いられたが、終わってみれば結構簡潔な方法であったと思われます。またカードリーダのDevice DriverがMac用に用意されていますが、これらも全く不要であったことも驚きです。
今後また不具合不都合があった場合には改善を検討を続けたいと思っています。
【追記 2020/12/3]
最近、超小型PC RaspberryPiが売られていることを知りこれにBoncas serverを実装してみることにした。元々bcs-perlはlinuxなので簡単かと思ったが、実際は結構苦労したので、ここにメモとして記載しておく。
1.cpanm Chipcard::PCSCに関してはエラーが出て実装できなかったが、下記のライブラリを追加して実行した。
$ sudo apt-get install libccid libpcsclite-dev libpcsclite1 pcsc-tools pcscd
2. MacとLINUXではカードリーダーの読み込み名が若干違うようで、LINUXではpcsctestをサポートしていない。カードリーダー名は
$ ./bcs-perl listで表示される名称をソースに追加して動作させる必要がある。
- 以上 -