[樹莓派] WPA_supplicant的設定方式

wpa_supplicant設定檔大致分成三個區塊,這邊的例子主要介紹網路設定區塊

  1. 全域設定 (Global configuration)
  2. 驗證設定區塊 (credential block)
  3. 網路設定區塊 (network block)

全域設定

這裡的設定會套用到全部的「網路設定區塊」

驗證設定

專門設定802.11u的相關驗證設定

網路設定

要連線到AP的相關設定,也是最主要的設定
採用的是由上到下,第一個符合就使用的規則
也可以用priority修改優先使用的順序


無線網路的一些基本說明
驗證方式
目前常用的驗證方式有 兩種 : WPA和WPA2(RSN)
一般WPA會配合TKIP加密
而WPA2會配合AES(CCMP)加密
有些高級的AP可以混搭使用,如WPA2使用TKIP加密



輸入密碼的方式分兩種
PSK : AP預先打好一組密碼,使用者要連線就要輸入相同的密碼。
有些AP會稱為「個人」(Personal)

EAP : 密碼自動產生。使用者需要經過認證(如輸入帳號和密碼)才能加入AP。
有些AP會稱為「企業」(Enterprise)



注 : 全域設定要有這兩行,最好是放在最上面
ctrl_interface=/var/run/wpa_supplicant #讓supplicant可以建立行程pid
update_config=1 #讓wpa_cli程式可以更新控制wpa_supplicant



常見的例子

想直接設定的人可以看底下的常用例子

例子1 使用WPA/TKIP,密碼是用PSK的方式
network={
 ssid="你的SSID名稱,限英文"
 proto=WPA                     #要用WPA或WPA2
 key_mgmt=WPA-PSK    #要用PSK或EAP
 pairwise=TKIP                #要用AES(CCMP)或TKIP加密
 group=TKIP                    #廣播和群播在用的加密
 psk=無線網路的密碼          #psk的密碼,如果用key_mgmt=WPA-PSK,就必須要有
}


例子2 使用WPA2/AES,密碼是用PSK的方式
network={
 ssid="example"
 proto=RSN
 key_mgmt=WPA-PSK
 pairwise=CCMP
 group=CCMP
 psk=無線網路的密碼
}


例子3 使用WPA/WPA2,加密都支援,密碼是用PSK的方式
network={
 ssid="example"
 proto=RSN WPA
 key_mgmt=WPA-PSK
 pairwise=CCMP TKIP
 group=CCMP TKIP
 psk=無線網路的密碼
}


例子4 使用WPA2/AES,密碼是用PSK的方式,並且SSID沒有被廣播
network={
 ssid="example"
 scan_ssid=1                    #如果SSID沒有被廣播就要加上這行
 proto=RSN
 key_mgmt=WPA-PSK
 pairwise=CCMP
 group=CCMP
 psk=無線網路的密碼
}


例子5 使用WPA2/AES,PSK,SSID沒有廣播,範圍內有多的可以用的SSID時,會優先使用這個SSID
network={
 ssid="example"
 scan_ssid=1
 proto=RSN
 key_mgmt=WPA-PSK
 pairwise=CCMP
 group=CCMP
 psk=無線網路的密碼
 priority=2                       #優先權,越高越優先,預設是0
}


例子6 使用OPEN的方式
network={
 ssid="example"
 key_mgmt=NONE
}


例子7 使用WPA2/AES,使用EAP驗證,而驗證的機制是用TLS
network={
 ssid="example"
 proto=RSN
 key_mgmt=WPA-EAP
 pairwise=CCMP
 group=CCMP
 eap=TLS
 ca_cert="/etc/cert/ca.pem"           #公司的CA憑證(根憑證)
 client_cert="/etc/cert/user.pem"   #client的公鑰
 private_key="/etc/cert/user.prv"  #client的私鑰
 priority=1
}


例子8 使用WPA2/AES,EAP,使用PEAP驗證機制(通常要打帳號和密碼)
network={
 ssid="example"
 proto=RSN
 key_mgmt=WPA-EAP
 eap=PEAP
 pairwise=CCMP
 group=CCMP
 identity="user@example.com"      #帳號
 password="foobar"                        #密碼
 ca_cert="/etc/cert/ca.pem"             #公司的CA憑證(根憑證)
 phase1="peaplabel=1"                   #使用新式的label
 phase2="auth=MSCHAPV2"        #第二段驗證方式用微軟的MSCHAPV2
 priority=10
}


例子9 將自己變為ad-hoc,並嘗試加入一樣的ad-hoc,並指定使用channel 1
# IBSS/ad-hoc network with RSN
network={
 ssid="ibss-rsn"
 key_mgmt=WPA-PSK
 proto=RSN
 psk="12345678"
 mode=1
 frequency=2412         #指定無線網路的發射頻道,只有ad-hoc才有用
 pairwise=CCMP
 group=CCMP
}




開始設定前的作者建議

作者建議
最好只允許 root 使用者有讀寫的權限
有牽涉到檔案路徑的設定,一定要用完整路徑來表示,如 /etc/wpa_supplicant/wpa_supplicant.conf
最好是允許wpa_supplicant自動更新設定檔,update_config=1,如使用wpa_cli進行修改時才會動態的更新設定檔


底下的說明主要是根據
https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf




全域設定
For UNIX domain sockets
DIR=路徑 GROUP=群組名稱或GID
建立socket file的目錄,建議使用官方預設值/var/run/wpa_supplicant
GROUP是可以用外部程式(如wpa_cli)控制這個設定檔的使用者群組,如果要給非root使用者使用可以使用預設的設定
DIR=/var/run/wpa_supplicant GROUP=wheel  (預設值)
再把使用者加到這個群組內就可以用外部程式控制設定檔
(因為一般這個設定檔的權限是root的readonly)
如果要多個群組可以操控可以用以下方式
DIR=/var/run/wpa_supplicant GROUP=wheel
DIR=/var/run/wpa_supplicant GROUP=1000


ctrl_interface
讓supplicant可以建立行程pid
ctrl_interface=/var/run/wpa_supplicant


IEEE 802.1X/EAPOL 的版本
eapol_version=1或2 (預設是1)
設定802.1X的版本號
因為wpa_supplicant是依照IEEE Std 802.1X-2004所撰寫,而802.1X-2004是第2版
但是作者發現有些AP不太支援第2版,因此預設值為1


AP的掃描和選擇
ap_scan=1或0或2
設定AP在掃描完畢後的行為
1 會先進行掃描,掃描完後會選擇適合的AP,如果都找不到適合的AP,則自己會嘗試當一個AP(IBSS或AP mode)(前提是要先設定好如何當一個AP)(預設)
0 會進行完整的掃描,但不會連接AP,也不可以用外部程式強制連接AP。適合用在有線的環境下
2 功能類似0(完整掃描),但是會進行AP的連接,不過僅限於有設定安全規則(security policy)和SSID(不是BSSID)的情況下。
在這模式下,網路設定區塊的設定,回逐個進行連結測試,直到成功連結,而且每個網路設定都必須有精確的安全原則設定(就是不要有兩個以上的安全設定出現,如WPA-TKIE和WPA-CCM)


peer的憑證紀錄
cert_in_cb=1 預設值


EAP快速重新驗證
fast_reauth=1 預設值
如果支援EAP re-authentication  protocol(ERP),可以減少再次進行EAP驗證的時間
freeRADIUS如果要使用這個功能要在eap.conf裡面啟用TLS session


國碼
country=TW
ISO/IEC的兩碼國家代碼,可以讓設備準確的運作


PMKSA的最大lifetime(單位 秒)
dot11RSNAConfigPMKLifetime=43200 (預設值)

重新驗證的門檻(單位 PMK lifetime的百分比)
dot11RSNAConfigPMKReauthThreshold=70 (預設值)

協商安全性連結的逾期時間 (單位 秒)
dot11RSNAConfigSATimeout=60 (預設值)


記憶體能儲存的最大BSS數量
bss_max_count=200 (預設值)
如果設定ap_scan=1(預設),會將掃描的結果儲存到記憶體中,如果環境內有超多的(AP),或許需要更大的數字





網路設定

disabled
是否取消此設定
0 : 可以使用  (預設值)
1 : 取消,但可用控制介面啟用,如wpa_cli


id_str
給外部腳本(script)使用的參數,透由wpa_cli把此參數的值存到環境變數WPA_ID_STR,以方便讓外部腳本進行網路環境的設定


ssid (必要參數)
SSID的名稱,用以下三種方式的其中一種格式命名
前後用 " 符號包住的ASCII格式的名字,如"thessid"
16進位數字的SSID(two characters per octet,兩個數字為一組)
a printf-escaped ASCII string P""


scan_ssid
0 : 預設值,藉由AP發出的probe(AP自動廣播自己的SSID)來尋找SSID,而不會發送特定的SSID probe去尋找這個SSID的存在
1 : 如果AP不廣播SSID時可用這個選項,會發送特定的SSID probe 尋找SSID的存在。會增加連結的時間。建議有需要才設定


bssid (選填)
發送訊號的AP的MAC位置
如果設定了就只會嘗試用連結這個MAC位置的AP


priority
priority group (用整數)
預設每個網路設定區塊的priority都是 0 ,數字越高的設定,會越早被比對。可以使用此方式改變優先使用哪個SSID
如果是相同的priority,則會用訊號強度、安全原則等方式去選擇
如果設定ap_scan=2和ssid=1,會忽略priority的設定,而是依照設定檔按的順序,由上到下確認每個網路設定區塊的設定


mode
0 : infrastructure,預設值,會嘗試連結AP
1 : IBSS,ad-hoc, peer to peer
2 : AP


frequency
IBSS要使用的頻道,在infrastructure模式會被忽略
2412代表2.4G的第一個頻道


scan_freq
要掃描的頻道列表
如果知道環境內設定的AP所發送的頻道,可以用這個功能最佳化掃描
如,scan_freq=2412 2437 2462



freq_list
允許的頻率
選擇一個BSS連結時,所參考的頻率,如果BSS的頻率不在設定內,則不考慮連結


bgscan
背景掃描
設定在背景掃描訊號強度的行為,主要做為漫遊用,在相同ESS下掃描訊號的強度
這個設定也可以設定在全域設定下
格式為,bgscan="<掃描的模組>:<參數>"
掃描的模組有兩個,simple和learn(實驗階段)
simple : 周期性的觀察訊號強度
bgscan="simple:<最短掃描周期>:<訊號強度門檻>:<最長掃描周期>"
bgscan="simple:30:-70:60"
learn : 學習無線網路的頻道被使用的程度
bgscan="learn:<最短掃描周期>:<訊號強度門檻>:<最長掃描周期>:資料儲存的位置"
bgscan="learn:30:-40:60:/var/wpa_supplicant/network1.bgscan"
關閉bgscan的行為
bgscan=""


proto
允許接受的協定
WPA = WPA/IEEE 802.11i/D3.0
RSN = WPA2/IEEE 802.11i (RSN是WPA2的另一種稱呼)(預設)


key_mgmt
驗證金鑰的方法
預設是,WPA-PSK WPA-EAP
WPA-PSK = WPA pre-shared key (需要再設定 'psk' 欄位)
WPA-EAP = WPA using EAP authentication
IEEE8021X = IEEE 802.1X using EAP authentication and (optionally) dynamically generated WEP keys (WEP 802.1X)
NONE = WPA is not used; plaintext or static WEP could be used (無密碼)
WPA-PSK-SHA256 = Like WPA-PSK but using stronger SHA256-based algorithms
WPA-EAP-SHA256 = Like WPA-EAP but using stronger SHA256-based algorithms


auth_alg
驗證演算法
OPEN = Open System authentication (必須是WPA/WPA2)
SHARED = Shared Key authentication (必須再設定static WEP keys)
LEAP = LEAP/Network EAP (only used with LEAP)
# If not set, automatic selection is used (Open System with LEAP enabled if
# LEAP is allowed as one of the EAP methods).


pairwise (unicast)
WPA的加密方式,專門針對unicast封包的加密方式,也是一般在選擇SSID時的加密方式
預設是,CCMP TKIP
CCMP = AES in Counter mode with CBC-MAC (WPA2一般會搭配這個)
TKIP = Temporal Key Integrity Protocol (WPA一般會搭配這個)
NONE = Use only Group Keys (無密碼)


group (broadcast/multicast)
WPA的加密方式,專門針對廣播封包或群播封包的加密方式 (一般unicast和broadcast應該是一樣)
預設是,CCMP TKIP WEP104 WEP40
CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key [IEEE 802.11]


psk
WPA的preshared key


mem_only_psk
只允許PSK儲存在記憶體
0 : 允許PKS存在設定檔內 (預設)
1 : 不允許PKS存在設定檔內



eapol_flags
給WEP 802.1X使用的旗標(flag)
(1)bit0 : 需要動態產生 unicast 的WEP KEY
(2)bit1 : 需要動態產生 broadcast和multicast 的WEP KEY
(3)不使用此功能 : 需要兩者都動態產生WEP KEY(預設)
作者註記 : 環境中有使用「有線網路」的驗證(包括MACsec),這個功能必須設定為,eapol_flags=bit0


peerkey (IEEE 802.11e DLS)
限WPA2時才有用
Whether PeerKey negotiation for direct links (IEEE 802.11e DLS) is allowed.
0 : 取消 (預設)
1 : 啟用


wpa_ptk_rekey (單位 秒)
PTK的lifetime,可強制AP更換WPA的KEY


group_rekey
Group rekeying time in seconds. This value, if non-zero,
is used as the dot11RSNAConfigGroupRekeyTime parameter
when operating in Authenticator role in IBSS.




接下來的是EAP相關的參數
eap
接受哪幾種EAP的機制
如果沒有設定代表全部都接受
MD5 = EAP-MD5 用在AP-PEAP或EAP-TTLS的第2階段驗證(Phase 2)(不安全,無法用在WPA)
MSCHAPV2 = EAP-MSCHAPv2 用在AP-PEAP或EAP-TTLS的第2階段驗證(必須和WPA一起使用)
OTP = EAP-OTP 用在AP-PEAP或EAP-TTLS的第2階段驗證(必須和WPA一起使用)
GTC = EAP-GTC 用在AP-PEAP或EAP-TTLS的第2階段驗證(必須和WPA一起使用)
TLS = EAP-TLS (client and server certificate)
PEAP = EAP-PEAP (with tunnelled EAP authentication)
TTLS = EAP-TTLS (with tunnelled EAP or PAP/CHAP/MSCHAP/MSCHAPV2 authentication)


identity
類似帳號


anonymous_identity
匿名驗證


password
帳號的密碼,可以使用明碼或NtPasswordHash(windows在用的,密碼的16-byte MD4 hash)
使用NtPasswordHash時,格式為,hash:<32 digits="" hex="">
NtPasswordHash只能用在MSCHAPv2或MSCHAP (EAP-MSCHAPv2, EAP-TTLS/MSCHAPv2, EAP-TTLS/MSCHAP, LEAP)
也可以指向外部用來儲存密碼的檔案,格式為,ext:


ca_cert
CA憑證的檔案路徑(PEM或DER),可以指向多個檔案
如果沒有設定ca_cert和ca_path,將不會驗證驗證伺服器的憑證 (無條件允許任何伺服器憑證)
如果是運作在windows上,可以用windows的專用格式,ca_cert="cert_store://" (wpa_supplicant只會讀取使用者憑證)
如,ca_cert="cert_store://CA" 或 ca_cert="cert_store://ROOT"


ca_path
功能是指向專門放置CA憑證的資料夾,如/etc/ssl/certs
檔案的格式必須是PEM,可以用OpenSSL編碼


client_cert
用戶憑證的檔案路徑(PEM或DER)


private_key
用戶憑證的祕鑰的檔案路徑(PEM/DER/PFX)
如果是使用PKCS#12/PFX格式的憑證(windows在用的格式),絕對不能使用client_cert
另外windows可以使用hash://certificate_thumbprint_in_hex格式指定包含秘鑰的憑證
如,private_key="hash://63093aa9c47f56ae88334c7b65a4"


private_key_passwd
用戶憑證的祕鑰的密碼,如果需要但沒設定會由控制介面顯示出提示訊息


subject_match
比對伺服器憑證的subject,格式為/C=US/ST=CA/L=SanFrancisco/CN=Test/emailAddress=test@example.com
如果有設定這個並比對成功,則domain(CN)名稱的比對方式將會被忽略,如domain_suffix_match或domain_match
如果有設定,比對不成功就不會使用這個網路設定區塊


altsubject_match
使用TYPE:VALUE的格式比對其他的標題

EMAIL:server@example.com
DNS:server.example.com;DNS:server2.example.com
如果有設定,比對不成功就不會使用這個網路設定區塊


domain_suffix_match
如果有dNSName,只會比對此欄位
如果沒有dNSName,則會比對subject_match的CN欄位


domain_match
功能跟domain_suffix_match一樣,只是在比對上屬於完整比對


phase1
TLS通道的外層的驗證(EAP-TTLS或EAP-PEAP)
會同時使用底下的各種參數,如phase1="peapver=0"或phase1="peapver=1 peaplabel=1"
peapver : 強制使用PEAP的版本 (0 或 1)
peaplabel=1 : 強制使用新的標題"client PEAP encryption",舊的標題是"client EAP encryption" (預設是peapver=1 peaplabel=1)


peap_outer_success=0
This is required with some RADIUS servers that implement draft-josefsson-pppext-eap-tls-eap-05.txt (e.g.,Lucent NavisRadius v4.4.0 with PEAP in "IETF Draft 5" mode)
include_tls_length=1 : 強制增加TLS Message Length的欄位在每個驗證訊框中
sim_min_num_chal=3 : 設定EAP-SIM需要3因素驗證,數值可以是2或3
result_ind=1


allow_canned_success=1 : 總是驗證成功,不需要經過驗證步驟就回傳驗證成功訊息


phase2
TLS通道的內層的驗證
會同時使用底下的參數
auth=MSCHAPV2 : 給EAP-PEAP使用
autheap=MSCHAPV2或autheap=MD5 : 給EAP-TTLS使用
mschapv2_retry=0 : 如果發生MSCHAPV2驗證失敗會取消再次嘗試驗證的動作


TLS相關參數,可用於控制TLS驗證時的動作
tls_allow_md5=1 : 允許MD5驗證,需要TLS函示庫(TLS library)支援
tls_disable_time_checks=1 : 不去確認伺服器的憑證有效時間,不管憑證已經過期還是尚未生效都可以使用
tls_disable_tlsv1_0=1 : 不使用TLS1.0
tls_disable_tlsv1_1=1 : 不使用TLS1.1
tls_disable_tlsv1_2=1 : 不使用TLS1.2
tls_ext_cert_check=0 : 不允許使用外部驗證伺服器 (預設)
tls_ext_cert_check=1 : 使用外部驗證伺服器,當控制介面(如wpa_cli)收到CTRL-RSP-EXT_CERT_CHECK時,要有一個外部程式可以執行外部驗證伺服器的驗證,並且回傳CTRL-RSP_EXT_CERT_CHECK

底下的功能是給phase2使用EAP-TTLS 或 EAP-PEAP時才有用
ca_cert2 : 用來驗證phase2的CA憑證,功能同 ca_cert,只是這個是專門給phase2使用
ca_path2 : 底下同上面所述,只是這個是專門給phase2使用
client_cert2
private_key2
private_key2_passwd
dh_file2
subject_match2
altsubject_match2
domain_suffix_match2



fragment_size
EAP訊框的最大大小 (預設是1398)


ocsp
使用OCSP協定驗證伺服器憑證
0 : 不使用
1 : 嘗試使用,不依定需要回應
2 : 強制使用,而且要收到回應
3 : 強制使用,但只對不受信任的伺服器憑證使用


 ------------------------------------
相關系列文章:

留言

這個網誌中的熱門文章

[TCL] 基本語法與指令 - 3. 資料型態

[TCL] 基本語法與指令 - 2. TCL 語法

[TCL] 基本語法與指令 - 1. TCL 簡介