====== 8021X API 명세서 ====== 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 ==== 내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다. | | 내용 중 알아두면 편리한 각종 참고 사항 | | | 내용 중 반드시 알아야 하는 중요한 사항 | ==== 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|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 ==== ==== 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; } ==== ==== 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|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 ==== ==== 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; } ==== ==== 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); ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----