IEEE 802.1X API 와 동작 방식에 대해 상세히 서술했다.

About This Document

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 인증서버

Overview

802.1X 에 대한 개략적인 내용은 [About8021x] 와 [FreeRADIUS 사용하기] 문서를 참고한다.

802.1X Operation

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);
  • computer/itx/8021x_api_명세서.txt
  • Last modified: 3 years ago
  • by likewind