跳到主要内容

扩展认证

简介

部分企业用户的PC网络接入认证使用802.1X认证方式,认证客户端由第三方厂商提供。

扩展认证能力从API version 20开始支持。

认证客户端有以下定制行为:

  1. 在EAP协议报文内封装私有数据,该私有数据遵循客户端与认证服务器约定的数据结构。

  2. 在认证过程中,客户端在本地进行安检扫描等定制动作,定制动作结束后,客户端向接入设备回复认证消息。

    在这种机制下,需要操作系统提供三方客户端介入802.1X认证流程的机制,支撑客户端的定制认证。

为满足以上需求场景,定制化802.1X认证提供如下功能:

  1. 定制化监听与修改802.1X报文交互流程的能力。
  2. 对eth网口发起802.1X认证和去认证的能力。

场景介绍

定制化802.1X认证流程的典型场景如下:

  1. 企业网管应用,需要在企业Wi-Fi的802.1X认证流程中加入自定义的安全校验,来接入企业内网。

    • 支持指定要进行定制化处理的报文类型和EAP类型。
    • 支持根据自定义的安全校验结果来指定标准认证流程的结果。
  2. 企业网管应用,需要支持使用eth网口进行802.1X安全认证流程来接入企业内网。

    • 支持标准802.1X认证流程。
    • 支持定制化802.1X认证流程。

具体开发方式介绍如下。

802.1X认证流程中加入自定义的安全校验

  1. 从@kit.NetworkKit中导入eap命名空间。

    import { eap } from '@kit.NetworkKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
  2. 调用regCustomEapHandler方法,注册所需监听的EAP报文类型。

    在802.1X认证过程中,系统会将符合条件的EAP报文传递至callback函数(如示例代码中的eapData函数)中,供企业应用获取。报文传递至callback函数后,802.1X认证流程会阻塞等待,用户能够获取到完整的报文内容。

    (1)若注册的是由服务器发送给客户端的报文类型(即eapCode=1),则此时可以从报文中看到由服务器加入的自定义内容。应用根据自定义内容,判断认证是否应该继续往后续步骤进行,并调用replyCustomEapData方法通知系统。

    (2)若注册的报文类型是由客户端发给服务器的(即eapCode=2),则此时获取到的是原始的802.1X认证报文,应用需要在原始报文内容中加入自己的自定义内容,并将加入自定义内容后的报文内容调用replyCustomEapData方法通知系统。

    (3)若注册的报文类型是服务器返回的成功(即eapCode=3)或失败(即eapCode=4)的结果,客户端可在接收到此结果之后做定制处理。

    以下注册服务器发送给客户端的报文类型(即eapCode=1,eapType=25)为例,若需注册其他类型,修改eapCode值后再调用regCustomEapHandler方法即可。

    let netType = 1;
    let eapCode= 1; // eap request
    let eapType= 25; // EAP_PEAP
    let result = 1;

    let eapData = (eapData:eap.EapData):void => {
    hilog.info(0x0000, 'testTag', 'rsp result',JSON.stringify(eapData));
    const newBuffer = new Uint8Array(eapData.bufferLen);
    newBuffer.set(eapData.eapBuffer, 0);
    let eapData2: eap.EapData = {
    msgId: eapData.msgId,
    eapBuffer: newBuffer,
    bufferLen: newBuffer.length
    }
    try{
    eap.replyCustomEapData(result, eapData2);
    hilog.info(0x0000, 'testTag', 'replyCustomEapData success');
    } catch (err) {
    hilog.error(0x0000, 'testTag', 'errCode: ' + err.code + ' , errMessage: ' + err.message);
    }
    }
    function serverReplyCustomEapData() {
    try{
    eap.regCustomEapHandler(netType, eapCode, eapType, eapData);
    hilog.info(0x0000, 'testTag', 'regCustomEapHandler success');
    // ...
    } catch (err) {
    hilog.error(0x0000, 'testTag', 'errCode: ' + err.code + 'errMessage: ' + err.message);
    // ...
    }
    }
  3. 若需取消定制化,可调用unregCustomEapHandler方法。

    let netType = 1;
    let eapCode= 1; // eap request
    let eapType= 25; // EAP_PEAP
    let result = 1;

    let eapData = (eapData:eap.EapData):void => {
    hilog.info(0x0000, 'testTag', 'rsp result',JSON.stringify(eapData));
    const newBuffer = new Uint8Array(eapData.bufferLen);
    newBuffer.set(eapData.eapBuffer, 0);
    let eapData2: eap.EapData = {
    msgId: eapData.msgId,
    eapBuffer: newBuffer,
    bufferLen: newBuffer.length
    }
    // ...
    }
    // ...
    try {
    eap.unregCustomEapHandler(netType, eapCode, eapType, eapData);
    hilog.info(0x0000, 'testTag', 'unregCustomEapHandler success');
    // ...
    } catch (err) {
    hilog.error(0x0000, 'testTag', 'errCode: ' + err.code + ', errMessage: ' + err.message);
    // ...
    }

使用eth接口发起802.1X认证流程

  1. 设备通过硬件接口,插入网线。

  2. 从@kit.NetworkKit中导入eap命名空间。

    import { eap } from '@kit.NetworkKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
  3. 当企业管理软件需要进行认证,调用startEthEap方法时,会发起802.1X认证流程。

    const netId: number = 100;
    // ...
    let profile: eap.EthEapProfile = {
    eapMethod: eap.EapMethod.EAP_TTLS,
    phase2Method: eap.Phase2Method.PHASE2_AKA_PRIME,
    identity: 'identity',
    anonymousIdentity: 'anonymousIdentity',
    password: 'password',
    caCertAliases: 'caCertAliases',
    caPath: 'caPath',
    clientCertAliases: 'clientCertAliases',
    certEntry: new Uint8Array([5,6,7,8,9,10]),
    certPassword: 'certPassword',
    altSubjectMatch: 'altSubjectMatch',
    domainSuffixMatch: 'domainSuffixMatch',
    realm: 'realm',
    plmn: 'plmn',
    eapSubId: 1
    };

    try {
    eap.startEthEap(netId, profile);
    hilog.info(0x0000, 'testTag', 'startEthEap success');
    // ...
    } catch (err) {
    // ...
    hilog.error(0x0000, 'testTag', 'errCode: ' + err.code + ', errMessage: ' + err.message);
    }
  4. 当企业管理软件需要退出认证状态,调用logOffEthEap方法,即会发起802.1X取消认证流程。

    const netId: number = 100;
    // ...
    try{
    eap.logOffEthEap(netId);
    hilog.error(0x0000, 'testTag', 'logOffEthEap success');
    // ...
    } catch (err) {
    // ...
    hilog.error(0x0000, 'testTag', 'errCode: ' + err.code + ', errMessage: ' + err.message);
    }