Thursday, May 23, 2013

在Ubuntu 12.04 LTS中使用OpenJDK及Oracle Java讀取健保卡 - 1

先前協助基隆市撰寫之健保卡認證Applet,其實在W$系統中運作都很正常,某天,突然收到基隆市某校的主任來信說,他們全校都用Ubuntu,會發生找不到讀卡機的狀況,於是就研究一下該如何解決。
花了很久的時間終於發現有兩個方法可以正確的讀取到健保卡,在此和大家分享。

本系列文章共分3段,此是第一部份-讓讀卡機可以正確的在Ubuntu中運作。在第二部份將會介紹使用OpenJDK來讀取健保卡;而第三部份則是使用Oracle JDK來讀取。



本文是參考軟體工匠R的文章而來,在此特別感謝該文作者。


在電腦系統中若要讀取智慧卡,基本上只要卡片及讀卡機遵循PC/SC規範即可正確讀取。在Windows中,微軟已實作符合PC/SC規範的函式庫;而在Linux及Mac中則有Open Source的PCSC-Lite函式庫可以使用。
因此,在Ubuntu若要讀取智慧卡,便要安裝pcsc-lite的工具及pcscd此daemon程式。

首先,若使用Ubuntu軟體中心的視覺化安裝方式,則請在搜尋的欄位中輸入pcsc,並點選顯示其他技術項目。如下圖:



請選擇安裝GScriptor及pcscd此二個項目即可。

若是使用commmand line的方式,只要下以下指令即可:

sudo apt-get install pcsc-tools pcscd

接下來要安裝讀卡機驅動程式,在此以虹堡科技EZ100PU為例。
  •  到官網下載Linux驅動程式;或按此直接下載
  •  接下來只要依照安裝指令安裝即可(32位元或64位元端看自己系統,在此以32位元當範例)。
  • cd driver_ezusb_v1.5.3/
        sudo ./install
    
  •  安裝完成後可以進行自我測試。
  • cd driver_ezusb_v1.5.3/mifdtest
        sudo ./mifdtest
    
  •  假使測試失敗,就要修改/etc/init.d/pcscd的內容,修改後重開機即可。
  • sudo vi /etc/init.d/pcscd
        --------------以下是要修改的內容----------------
        # DO NOT start the daemon on startup
        # comment the line to have the same behavior as in version < 1.6.0
        #exit 0 --> 將此行註解掉
        --------------以上是要修改的內容----------------
    
  •  假使測試失敗,還有另一種較安全的方法,請參考這裡

備註:以使用者身份動態執行pcscd步驟,設定完重關機即可(我試過sudo service udev restart但是沒有用)。

  • -----------以下是權限設定----------------
    $ sudo addgroup --system pcscd
    $ sudo mkdir /var/run/pcscd
    $ sudo chgrp pcscd /var/run/pcscd
    $ sudo chmod g+w /var/run/pcscd
    -----------以上是權限設定-----------------
    -----------新建一個檔案:/etc/udev/rules.d/92-pcscd-ccid.rules-----------
    $ sudo vi /etc/udev/rules.d/92-pcscd-ccid.rules
    ----------------內容如下------------------
         # If not adding the device, go away
        ACTION!="add", GOTO="pcscd_ccid_rules_end"
        SUBSYSTEM!="usb", GOTO="pcscd_ccid_rules_end"
        ENV{DEVTYPE}!="usb_device", GOTO="pcscd_ccid_rules_end"
    
        # Castles Technology Co., Ltd EZUSB PC/SC Smart Card Reader
        ATTRS{idVendor}=="0ca6", ATTRS{idProduct}=="0010", GROUP="pcscd"
    
        # All done
        LABEL="pcscd_ccid_rules_end"
    ----------------內容如下------------------
    ----------------idVendor及idProduct必須以自己電腦中的設定為主-----------
    ----------------可以使用lsusb指令找出相關id-----------------------------
    

No comments:

Post a Comment