背景:
最近一個case需要對用戶端入網進行802.1X網絡認證以確定網絡安全。問題的關鍵還不是認證的問題,畢竟客戶那邊已經能夠 支援非智能卡方式進行802.1X認證了,現在提的問題是如何用智能卡來進行802.1X網絡的認證。換句話說就是,wpa_supplicant能否支援智能卡方式進行802.1X的認證。在此之前我并不清楚目前wpa_supplicant是否已經具備這個功能了,甚至于,我對這一塊都比較陌生。但是任務既然配置設定給我了,也隻好知難而上了。
802.1X網絡:
802.1x協定是基于Client/Server的通路控制和認證協定。它可以限制未經授權的使用者/裝置通過接入端口(access port)通路LAN/WLAN。在獲得交換機或LAN提供的各種業務之前,802.1x對連接配接到交換機端口上的使用者/裝置進行認證。在認證通過之前,802.1x隻允許EAPoL(基于區域網路的擴充認證協定)資料通過裝置連接配接的交換機端口;認證通過以後,正常的資料可以順利地通過以太網端口。
工作過程:
(1.當使用者有上網需求時打開802.1X用戶端程式,輸入已經申請、登記過的使用者名和密碼,發起連接配接請求。此時,用戶端程式将送出請求認證的封包給交換機,開始啟動一次認證過程。
(2.交換機收到請求認證的資料幀後,将發出一個請求幀要求使用者的用戶端程式将輸入的使用者名送上來。
(3.用戶端程式響應交換機發出的請求,将使用者名資訊通過資料幀送給交換機。交換機将用戶端送上來的資料幀經過封包處理後送給認證伺服器進行處理。
(4.認證伺服器收到交換機轉發上來的使用者名資訊後,将該資訊與資料庫中的使用者名表相比對,找到該使用者名對應的密碼資訊,用随機生成的一個加密字對它進行加密處理,同時也将此加密字傳送給交換機,由交換機傳給用戶端程式。
(5.用戶端程式收到由交換機傳來的加密字後,用該加密字對密碼部分進行加密處理(此種加密算法通常是不可逆的),并通過交換機傳給認證伺服器。
(6.認證伺服器将送上來的加密後的密碼資訊和其自己經過加密運算後的密碼資訊進行對比,如果相同,則認為該使用者為合法使用者,回報認證通過的消息,并向交換機發出打開端口的指令,允許使用者的業務流通過端口通路網絡。否則,回報認證失敗的消息,并保持交換機端口的關閉狀态,隻允許認證資訊資料通過而不允許業務資料通過。

EAPoL(基于區域網路的擴充認證協定)認證過程:
(1) 用戶端向接入裝置發送一個EAPoL-Start封包,開始802.1X認證接入;
(2) 接入裝置向用戶端發送EAP-Request/Identity封包,要求用戶端将使用者名送上來;
(3) 用戶端回應一個EAP-Response/Identity給接入裝置的請求,其中包括使用者名;
(4) 接入裝置将EAP-Response/Identity封包封裝到RADIUS Access-Request封包中,發送給認證伺服器;
(5) 認證伺服器産生一個Challenge,通過接入裝置将RADIUS Access-Challenge封包發送給接入裝置,其中包含有EAP-Request/MD5-Challenge;
(6) 接入裝置通過EAP-Request/MD5-Challenge發送給用戶端,要求用戶端進行認證
(7) 用戶端收到EAP-Request/MD5-Challenge封包後,将密碼和Challenge做MD5算法後的Challenged-Pass-word,在EAP-Response/MD5-Challenge回應給接入裝置
(8) 接入裝置将Challenge,Challenged Password和使用者名一起送到RADIUS伺服器,由RADIUS伺服器進行認證
(9)RADIUS伺服器根據使用者資訊,做MD5算法,判斷使用者是否合法,然後回應認證成功/失敗封包到接入裝置。如果成功,攜帶協商參數,以及使用者的相關業務屬性給使用者授權。如果認證失敗,則流程到此結束;
(10) 如果認證通過,使用者通過标準的DHCP協定 (可以是DHCP Relay) ,通過接入裝置擷取規劃的IP位址;
(11) 如果認證通過,接入裝置發起計費開始請求給RADIUS使用者認證伺服器;
(12)RADIUS使用者認證伺服器回應計費開始請求封包。使用者上線完畢
關于802.1X和EAPoL認證過程都是标準化了的,是以這些網上都能找到更為詳細的說明,我這裡隻是簡短的介紹一下。
wpa_supplicant:
wpa_supplicant原本是開源項目,後來被廣泛使用于linux及類linux平台,它主要是用來支援WEP,WPA/WPA2和WAPI無線協定和加密認證的,而實際上的工作内容是通過socket(不管是wpa_supplicant與上層還是wpa_supplicant與驅動都采用socket通訊)與驅動互動上報資料給使用者,而使用者可以通過socket發送指令給wpa_supplicant調動驅動來對WiFi晶片操作。 簡單的說,wpa_supplicant就是WiFi驅動和使用者的中轉站外加對協定和加密認證的支援。目前wpa_supplicant已經可以支援以太網的認證了。
wpa_supplicant使用智能卡進行802.1X認證需要用到第三方工具openssl以及pkcs工具,其中第一個工具用來加密解密,第二 個工具用來操作智能卡。是以要進行網絡認證的用戶端需要安裝有這個兩個工具才能正确通過認證。隻是wpa_supplicant的配置檔案有所不同,下面是使用智能卡認證802.1X配置檔案的例子。
p_scan=0
pkcs11_engine_path=/usr/lib/engines/engine_pkcs11.so
pkcs11_module_path=/usr/lib/opensc-pkcs11.so
network={
key_mgmt=IEEE8021X
eap=TLS
engine=1
engine_id="pkcs11"
key_id="1"
cert_id="2"
ca_cert_id="4"
identity="user"
pin="1234"
eapol_flags=0
}
pkcs11_engine_path和pkcs11_module_path分别表示pkcs的engine和module路徑,這個路徑一定要指定正确,不然加載不成功,自然認證會失敗。
我看有些配置檔案pkcs的module也使用
pkcs11_module_path=/usr/lib/opencryptoki/libopencryptoki.so
這也是可以的,具體使用哪種需要檢視主機所的pkcs工具。
配置好conf檔案後,就可以使用wpa_supplicant來進行認證,我們假定為8021x.conf,那麼認證方法如下:
wpa_supplicant -i $interface -c 8021x.conf -D wired
其中interface就是指網卡的接口,比如eth0。
Microsoft Message Analyzer工具分析認證過程,看看是否成功。
可以看到最近success,說明認證成功。