IEEE 802.1X API 와 동작 방식에 대해 상세히 서술했다.
| Version | Date | Comment | Author |
| 1.0 | 2013-10-08 | 최초 작성 | 시스템 소프트웨어3팀 김우종 선임연구원 |
| 1.1 | 2013-10-30 | API 추가 | 시스템 소프트웨어3팀 김우종 선임연구원 |
| 1.2 | 2013-11-06 | API 추가 | 시스템 소프트웨어3팀 김우종 선임연구원 |
본 문서는 IP 카메라 상에서 802.1X 기능을 사용하기 위해서 알아야 할 802.1X 동작과 이 때 실행되는 API 에 대한 설명을 기술하고 있다. 이 문서를 통해 802.1X 의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.
소스코드와 API 함수 표기는 굴림 글꼴로 표시한다.
내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.
| <Note> | 내용 중 알아두면 편리한 각종 참고 사항 |
| <Caution> | 내용 중 반드시 알아야 하는 중요한 사항 |
본 문서는 다음과 같은 약어를 사용한다.
| 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 | 인증서버 |
802.1X 에 대한 개략적인 내용은 [About8021x] 와 [FreeRADIUS 사용하기] 문서를 참고한다.
802.1X 를 사용하기 위해서는 기본적으로 wpa_supplicant 가 필요하다.
인증 서버인 FreeRADIUS 에서 지원하는 방식에 따라 별도의 인증 파일이 필요할 수도 있다. 이런 경우, 접속 시에 이 파일에 대한 위치 경로가 포함되어야 한다.
성공적으로 인증이 완료되어 접속이 되면, dhcp 를 통해 IP 주소를 얻는다.
8021X API 를 실행한 후 결과값을 저장하는 구조체. 이 값을 통해 원하는 대로 API 가 실행되었는지 여부를 판단한다.
typedef enum
{
RADIUS_SUCCESS = 0, // 성공
RADIUS_FAIL = -1 // 실패
}RADIUS_STATUS_T;
| 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
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;
}
| 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
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);