IEEE 802.1X API 와 동작 방식에 대해 상세히 서술했다.
About This Document
Revision History
Version | Date | Comment | Author |
1.0 | 2013-10-08 | 최초 작성 | 시스템 소프트웨어3팀 김우종 선임연구원 |
1.1 | 2013-10-30 | API 추가 | 시스템 소프트웨어3팀 김우종 선임연구원 |
1.2 | 2013-11-06 | API 추가 | 시스템 소프트웨어3팀 김우종 선임연구원 |
Purpose
본 문서는 IP 카메라 상에서 802.1X 기능을 사용하기 위해서 알아야 할 802.1X 동작과 이 때 실행되는 API 에 대한 설명을 기술하고 있다. 이 문서를 통해 802.1X 의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.
Conventions and Acronyms
Codes
소스코드와 API 함수 표기는 굴림 글꼴로 표시한다.
Notes & Cautions
내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.
<Note> | 내용 중 알아두면 편리한 각종 참고 사항 |
<Caution> | 내용 중 반드시 알아야 하는 중요한 사항 |
Acronyms
본 문서는 다음과 같은 약어를 사용한다.
Acronym | Description |
PPPOE | an IEEE Standard for Port-based Network Access Control (PNAC). It is part of the IEEE 802.1 group of networking protocols |
FreeRadius | 인증서버 |
Overview
802.1X 에 대한 개략적인 내용은 [About8021x] 와 [FreeRADIUS 사용하기] 문서를 참고한다.
802.1X Operation
Initialization
802.1X 를 사용하기 위해서는 기본적으로 wpa_supplicant 가 필요하다.
인증 서버인 FreeRADIUS 에서 지원하는 방식에 따라 별도의 인증 파일이 필요할 수도 있다. 이런 경우, 접속 시에 이 파일에 대한 위치 경로가 포함되어야 한다.
성공적으로 인증이 완료되어 접속이 되면, dhcp 를 통해 IP 주소를 얻는다.
Structures
RADIUS_STATUS_T
8021X API 를 실행한 후 결과값을 저장하는 구조체. 이 값을 통해 원하는 대로 API 가 실행되었는지 여부를 판단한다.
typedef enum { RADIUS_SUCCESS = 0, // 성공 RADIUS_FAIL = -1 // 실패 }RADIUS_STATUS_T;
Common API Functions
RADIUS_SetConnection_Wired
Description | 유선으로 802.1X 를 접속 시, ID 와 패스워드 및 인증서 파일을 인자로 받아 연결을 시도한다 |
Syntax | RADIUS_STATUS_T RADIUS_SetConnection_Wired(char* id, char* ca_cert, char* client_cert, char* private_key, char* password) |
Parameters | id(IN) - Radius 서버에 등록된 ID |
ca_cert(IN) - Radius 서버에서 생성된 인증서 파일 | |
client_cert(IN) - Radius 서버에서 생성된 클라이언트 인증서 파일 | |
private_key(IN) - Radius 서버에 생성된 인증서의 패스워드 | |
password(IN) - Radius 서버에 등록된 패스워드 | |
Return Value | If the function succeeds, the return value is SUCCESS |
If the function fails, the return is FAIL | |
Remarks | supplicant 가 Initialization 된 이후에 호출가능하다. 입력된 인자와 함께 쉘 스크립트가 실행되면, 접속을 시도하게 된다. |
See Also | 8021x api 명세서 |
Details | 유선으로 접속 시에만 사용한다 |
w-tls 파일은 아래와 같다.
#!/bin/sh RESULT=`ps | grep -c "w-tls"` echo $RESULT if [ "$RESULT" -eq 1 ]; then echo "only grep process running!!" elif [ "$RESULT" -eq 2 ]; then echo "one process running!!" elif [ "$RESULT" -eq 3 ]; then echo "one process running!!" elif [ "$RESULT" -gt 4 ]; then echo "multi process running!!" exit 0 fi /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant remove_network 0 sleep 2 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant remove_network 0 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant ap_scan 0 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant add_network /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 eapol_flags 0 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt IEEE8021X /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 eap TLS /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 identity \"$1\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 ca_cert \"$2\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 client_cert \"$3\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 private_key \"$4\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 private_key_passwd \"$5\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant select_network 0
<Code>
RADIUS_STATUS_T RADIUS_SetConnection_Wired(char* id, char* ca_cert, char* client_cert, char* private_key, char* password) { char cmd[256] = {0,}; int ret; sprintf(cmd, "/srv/wifi/bcm/supplicant/w-tls %s %s %s %s %s", id, ca_cert, client_cert, private_key, password); ret = proxy_시스템(cmd, PROXY_TYPE_SYSTEM, 10); // 한글주의 if(ret != 0) { printf("\nWIFI_GetScanResult error code : %d\n", WEXITSTATUS(ret)); return RADIUS_FAIL; } return RADIUS_SUCCESS; }
<Example>
sleep(3); char* id = "testing"; char* ca_cert = "/srv/wifi/bcm/supplicant/ca.pem"; char* client_cert = "/srv/wifi/bcm/supplicant/client.pem"; char* private_key = "/srv/wifi/bcm/supplicant/client.p12"; char* password = "whatever"; int ret; ret = RADIUS_SetConnection_Wired(id, ca_cert, client_cert, private_key, password); if(ret < 0) { return WEBBASE_ERR_RET_INTERNAL; }
RADIUS_SetConnection_WiFI
Description | 무선으로 802.1X 를 접속 시, ID 와 패스워드를 인자로 받아 연결을 시도한다 |
Syntax | WIFI_STATUS_T RADIUS_SetConnection_WiFI(char* ssid, char* method, char* id, char* password, char* auth) |
Parameters | ssid(IN) - 접속할 공유기의 이름 |
method(IN) - Radius 서버에서 지원하는 암호화 방식 | |
id(IN) - Radius 서버에 등록된 id | |
password(IN) - Radius 서버에 등록된 패스워드 | |
auth(IN) - Radius 서버에서 지원하는 인증 방식 | |
Return Value | If the function succeeds, the return value is SUCCESS |
If the function fails, the return is FAIL | |
Remarks | supplicant 가 Initialization 된 이후에 호출가능하다. 입력된 인자와 함께 쉘 스크립트가 실행되면, 접속을 시도하게 된다 |
See Also | 8021x api 명세서 |
Details | 무선으로 접속 시에만 사용한다 |
w-eap 파일은 아래와 같다.
#!/bin/sh RESULT=`ps | grep -c "w-eap"` echo $RESULT if [ "$RESULT" -eq 1 ]; then echo "only grep process running!!" elif [ "$RESULT" -eq 2 ]; then echo "one process running!!" elif [ "$RESULT" -eq 3 ]; then echo "one process running!!" elif [ "$RESULT" -gt 4 ]; then echo "multi process running!!" exit 0 fi /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant remove_network 0 sleep 2 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant remove_network 0 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant ap_scan 1 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant add_network /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid \"$1\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 scan_ssid 1 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt $2 /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 eap PEAP /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 identity \"$3\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 password \"$4\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 phase1 '"peaplabel=0"' /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 phase2 \"auth=$5\" /srv/wifi/bcm/supplicant/wpa_cli -p /var/run/wpa_supplicant select_network 0
<Code>
RADIUS_STATUS_T RADIUS_SetConnection_WiFI(char* ssid, char* method, char* id, char* password, char* auth) { char cmd[256] = {0,}; int ret; sprintf(cmd, "/srv/wifi/bcm/supplicant/w-eap %s %s %s %s %s", ssid, method, id, password, auth); ret = proxy_시스템(cmd, PROXY_TYPE_SYSTEM, 10); // 한글주의 if(ret != 0) { printf("\nWIFI_GetScanResult error code : %d\n", WEXITSTATUS(ret)); return RADIUS_FAIL; } return RADIUS_SUCCESS; }
<Example>
sleep(3); char* ssid = "WIFI_DEV3"; char* method = "WPA-EAP"; char* id = "testing"; char* password = "password"; char* auth = "MSCHAPV2"; int ret; ret = RADIUS_SetConnection_WiFI(ssid, method, id, password, auth); if(ret < 0) { return WEBBASE_ERR_RET_INTERNAL; } sleep(20);