1. 程式人生 > >FIDO U2F應用與開發(三)-開發支持U2F的站點

FIDO U2F應用與開發(三)-開發支持U2F的站點

c2c ica ofo https ext 對象 ffffff 項目啟動 store

1. 設計中的約束

??U2F協議只能在支持HTTPS的網站上才可被支持,對於商業站點這不是問題,但對於局域網內或內部開發環境,我們使用自簽名證書來實現HTTPS。
??U2F設備在網頁上進行簽名和註冊時,會對請求中的“appId”進行檢查,“appId”中必須為域名或機器名,不可為IP地址,否則會出現錯誤。

2. 一個支持U2F的站點DEMO

2.1. 如何獲取代碼

https://github.com/solarkai/FIDO_U2F_KEDACOM 提供了一個支持U2F的站點項目。雖然只是一個站點DEMO,但提供了對用戶和U2F設備管理的完整功能。

2.2. 如何構建運行

??該項目客戶端使用jquery和jquery-ui編寫,服務端使用spring-boot框架編寫。可使用maven進行構建,使用如下命令:

./mvnw clean package

??對於生成的jar包,可使用如下命令(建議JDK1.8)直接運行(需要註意當前工作目錄下要有tomcat.keystore文件,不然會報spring的註入錯誤):

java -jar Kedacom-U2F-DEMO-0.0.1-SNAPSHOT.jar

??上面的程序運行後,啟動了一個tomcat服務器,支持http和https兩種模式。用戶可在瀏覽器中使用“http://localhost:8080” 和 “https://localhost:8443” 兩種模式訪問,在http模式下不支持U2F設備。

2.3 如何支持HTTPS

??為使用HTTPS,需要使用自簽名證書,我們使用JDK自帶的keytool生成自簽名證書tomcat.keystore,項目運行時放在當前工作目錄下。生成命令如下:

keytool -genkeypair -keystore tomcat.keystore  -alias tomcat -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=localhost, OU=kedacom, O=kedacom, L=shanghai, ST=shanghai, C=cn" -ext "SAN=DNS:localhost,IP:172.16.64.59" -ext "BC=ca:true"

??為使得瀏覽器對自簽名證書不產生告警,需要從tomcat.keystore中導出公鑰證書(cer文件)以導入瀏覽器的“受信任的根證書頒發機構”,導出公鑰證書的命令如下:

keytool -keystore tomcat.keystore -export -alias tomcat -file tomcat.cer

??在項目的application.properties文件中,定義了相關HTTPS參數,這些參數在項目啟動時,被spring註入到變量中,application.properties定義如下:

#https
https.port=8443
https.ssl.key-store=tomcat.keystore
https.ssl.key-store-password=tomcat
https.ssl.keyAlias=tomcat

#u2f
u2f.appId=https://localhost:8443

??如果讀者使用該項目的代碼構建自己的站點時,一定要註意保證application.properties文件中“u2f.appId”,tomcat.keystore中CN,SAN對域名(機器名)的一致性。

2.4. 如何實現用戶數據的持久化

??該項目中未實現用戶數據的磁盤持久化,這意味著服務器一重啟,之前保存的用戶數據都將丟失。但要實現持久化對於有興趣的讀者而言也是非常簡單的事情,項目中對於用戶數據的操作是使用com.kedacom.u2f.users.IUserStore實現的,系統啟動時註入該接口的實現對象,目前項目代碼中使用的是com.kedacom.u2f.users.UsersStoreInmemory對象註入的。讀者只需將實現IUserStore的自定義持久化對象替代UsersStoreInmemory註入即可。

2.5. 站點功能

??該項目站點DEMO提供完整的用戶和U2F設備管理功能,提供用戶的增加刪除修改,U2F設備的註冊綁定和鑒權等功能。

2.5.1 用戶管理功能

??站點啟動時已經缺省生成了admin用戶,可使用“admin/admin”的初始用戶名和密碼登錄。圖1展示了用戶的增加、刪除和修改密碼功能。
技術分享圖片

2.5.2. 綁定、解綁U2F設備

??該站點中一個用戶可綁定(註冊)多個U2F設備,對同一個U2F設備不可綁定兩次。而同一個U2F設備可被多個用戶綁定。
?? 圖2顯示了一個用戶的設備綁定過程,站點在綁定時會提示用戶觸摸設備。
技術分享圖片
??圖3顯示了設備綁定後的數據。
技術分享圖片
??圖4顯示了一個用戶綁定多個設備的註冊數據,每個設備的綁定數據以keyHandle作為標識。
技術分享圖片
??可選擇其中的一個keyHandle解除綁定,該keyHandle對應的U2F設備在登錄鑒權時將不再起作用,如圖5所示。
技術分享圖片

2.5.3. 用戶登錄鑒權

??對於綁定了U2F設備的用戶,在登錄時不僅要校驗用戶名和密碼,還需要驗證U2F設備,如圖6所示。
技術分享圖片

2.6. 使用的第三方庫

??該項目在客戶端使用的U2F簽名和註冊接口腳本均來自https://demo.yubico.com/js/u2f-api.js , 服務端使用了yubico提供的u2flib-server-core和u2flib-server-attestation這兩個庫,可在pom文件中增加如下依賴:

        <dependency>
            <groupId>com.yubico</groupId>
            <artifactId>u2flib-server-core</artifactId>
            <version>0.19.0</version>
        </dependency>

        <dependency>
            <groupId>com.yubico</groupId>
            <artifactId>u2flib-server-attestation</artifactId>
            <version>0.19.0</version>
        </dependency>

??這兩個庫完成U2F設備註冊信息中證書的驗證、公鑰的提取、簽名的驗證等功能,其核心類為com.yubico.u2f.U2F類,引用了java.security相關的包和類,代碼值得一讀。

3. 參考文獻

  1. https://fidoalliance.org/how-fido-works/
  2. https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/FIDO-U2F-COMPLETE-v1.2-ps-20170411.pdf
  3. http://www.ietf.org/rfc/rfc4648.txt

FIDO U2F應用與開發(三)-開發支持U2F的站點