Wi-Fi CERTIFIED---EAP-TLS认证错误

来源:互联网 发布:尼古丁贴片 知乎 编辑:程序博客网 时间:2024/05/17 02:20

        一个合格的Wi-Fi产品,应该经过Wi-Fi认证,因为认证能确保无线电脑设备之间具有经过测试及证实的互操作性;这项认证让消费者和企业了解贴有Wi-Fi标志的无线局域网产品都通过严格的互操作性认证要求,因此能够放心购买产品。Android4.1.2项目在进行认证时,测试手机能否连接到加密方式为 802.1xEAP的AP时,测试失败了,返回 DUT cannot import the server certificate for EAP-TLS。主要原因是在连接加密方式为EAP的AP时,需要从setting---Security----Install from SD card导入wifi证书,包括wifiuser和wifiserver的证书,在导入的时候界面直接提示证书不能安装。测试手机的版本是Android4.1.2,而在Android4.0.4上,安装证书是没有问题的。
    查看证书安装失败的log,找到以下错误:

D/CertFile( 1900): install cert from /storage/sdcard0/wifiuser.pfxE/yas     (  461): activate enable=0 handle=3E/yas     (  461): activate enable=0 handle=3E/ThermalDaemon(  936): Sensor 'MSM_THERM' -  37*C (37888)D/CredentialHelper( 1900): extracted alias = WiFi-Root-CA, entry=class java.security.KeyStore$TrustedCertificateEntryD/CredentialHelper( 1900): extracted alias = WiFi-Intermediate-CA-sta, entry=class java.security.KeyStore$TrustedCertificateEntryD/CredentialHelper( 1900): extracted alias = WiFi User, entry=class java.security.KeyStore$PrivateKeyEntryD/CredentialHelper( 1900): # certs extracted = 3D/CredentialHelper( 1900): # ca certs extracted = 2E/ThermalDaemon(  936): Sensor 'MSM_THERM' -  37*C (37888)E/ThermalDaemon(  936): CPU[1] offlineE/yas     (  461): activate enable=1 handle=3E/ThermalDaemon(  936): Sensor 'MSM_THERM' -  37*C (37888)E/        (  461): fopen failed: /dev/cpuctl/ux/tasks, Permission deniedE/        (  461): fopen failed: /dev/cpuctl/ux/tasks, Permission deniedE/OpenSSLKeyMaster(  145): OpenSSL error in openssl_import_keypair 218529960: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tagE/keystore(  145): Error while importing keypair: -1E/yas     (  461): activate enable=0 handle=3E/CredentialStorage( 1575): Failed to install USRPKEY_wifiuser


OpenSSLKeyMaster和keystore的打印错误消息是不容易找到的,看最后一句打印消息,它执行代码为:

  if (bundle.containsKey(Credentials.EXTRA_USER_PRIVATE_KEY_NAME)) {                String key = bundle.getString(Credentials.EXTRA_USER_PRIVATE_KEY_NAME);                byte[] value = bundle.getByteArray(Credentials.EXTRA_USER_PRIVATE_KEY_DATA);                if (!mKeyStore.importKey(key, value)) {                    Log.e(TAG, "Failed to install " + key);                    return;                }            }

返回错误值主要由mKeyStore.importKey引起,继续往下走,主要在Keystore.cpp里:

static ResponseCode import(KeyStore* keyStore, int, uid_t uid, Value* keyName, Value* key,        Value*) {    char filename[NAME_MAX];    encode_key_for_uid(filename, uid, keyName);    return keyStore->importKey(key, filename);}    ResponseCode importKey(const Value* key, const char* filename) {        uint8_t* data;        size_t dataLength;        int rc;        if (mDevice->import_keypair == NULL) {            ALOGE("Keymaster doesn't support import!");            return SYSTEM_ERROR;        }        rc = mDevice->import_keypair(mDevice, key->value, key->length, &data, &dataLength);        if (rc) {            ALOGE("Error while importing keypair: %d", rc);            return SYSTEM_ERROR;        }        Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);        free(data);        return put(filename, &keyBlob);    }


 

这个函数里找到了倒数第二个打印错误,mDevice->import_keypair在Keymaster_openssl.cpp里的openssl_open函数里给赋值dev->import_keypair =

openssl_import_keypair;倒数第三个打印错误值也就在openssl_import_keypair函数里找到了。第一步出错的地方也就在这个函数,看过这个函数很明显的找到出错还是因为上层传下去的key值。对比Android4.0.4和Android4.1.2,主要还是在CredentialStorage.java和KeyStore.java.在CredentialStorage.java里Android4.1.2用mKeyStore.importKey对key做处理,在Android4.0.4用 mKeyStore.put处理key。key值传到KeyStore里,Android4.1.2用getKeyBytes(keyName),对keyName做了ModifiedUtf8.encode编码,再toKeyString时又进行解码ModifiedUtf8.decode,而Android4.0.4没做编码解码的处理。
 如果KeyStore里对keyname不做编解码,CredentialStorage.java里的installIfAvailable()函数完全用Android4.0.4的方法:

    private void installIfAvailable() {        if (mInstallBundle != null && !mInstallBundle.isEmpty()) {            Bundle bundle = mInstallBundle;            mInstallBundle = null;            for (String key : bundle.keySet()) {                byte[] value = bundle.getByteArray(key);                if (value != null && !mKeyStore.put(key, value)) {                    Log.e(TAG, "Failed to install " + key);                    return;                }            }            setResult(RESULT_OK);        }    }


 

证书可以安装成功,但在连接AP选择加密方式时,CA certificate和User certificate两个选项里都是没有证书的,所以在修改installIfAvailable()此函数时,不能完全照搬4.0.4的方法,只需要修改处理key值的地方就可以。

 if (bundle.containsKey(Credentials.EXTRA_USER_PRIVATE_KEY_NAME)) {                String key = bundle.getString(Credentials.EXTRA_USER_PRIVATE_KEY_NAME);                byte[] value = bundle.getByteArray(Credentials.EXTRA_USER_PRIVATE_KEY_DATA);                if (!mKeyStore.put(key, value)) {                    Log.e(TAG, "Failed to install " + key);                    return;                }            }



 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 16岁不想上学怎么办 宜宾南门桥逆行怎么办 去加拿大探亲签证怎么办 重庆两路口到菜坝园怎么办 摄像头uid忘了怎么办 电梯钢丝绳断了怎么办 在小区车被砸了怎么办 甲米天气下雨怎么办 电影院不开空调怎么办 电脑总弹广告怎么办 下雨天了怎么办神接 天下雨了怎么办套路 下雨天了怎么办 新套路 万达兑换券过期怎么办 直播间没一个人怎么办 快手直播人少怎么办 快手直播人气少怎么办 被火山主播踢出房间怎么办 遇到同事的排挤怎么办 交警处理事故不公平怎么办 派出所处理事情不公平怎么办 淘宝号不健康了怎么办 作业盒子忘记密码怎么办 一起作业忘记密码怎么办 手机不能录视频怎么办 网络机顶盒连不上wifi怎么办 obs游戏源黑屏怎么办 微信视频打不开怎么办? xp关闭hdmi声音怎么办 大锅天线无信号怎么办 人喝酒喝醉了怎么办 电信网络电视不清楚怎么办 饭店老板拖欠员工工资怎么办 出国旅游不会英语怎么办 香港转机21小时怎么办 动车坐过站了怎么办 在美国开车超速怎么办? 办出国旅游护照怎么办 中关村三小午饭怎么办 电视不能看直播怎么办 电视系统无信号怎么办