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; } }
- Wi-Fi CERTIFIED---EAP-TLS认证错误
- Android Wi-Fi EAP-TLS/EAP-PEAP/EAP-TTLS(扩展认证协议)简介
- Android Wi-Fi EAP-SIM认证流程
- Redpine的Lite-Fi解决方案获Wi-Fi CERTIFIED认证
- Wi-Fi CERTIFIED Miracast ™的认证、测试需求
- EAP-TLS认证过程
- Wi-Fi CERTIFIED™ for Wi-Fi Protected Setup™:
- Wi-Fi CERTIFIED™ for Wi-Fi Protected Setup™
- Wi-Fi Alliance认证
- WI-FI联盟认证
- Android Wi-Fi EAP-SIM代码解析
- Android Wi-Fi Wi-Fi联盟PMK Caching认证简介
- Android手机进行无线EAP-TLS证书认证配置
- Wi-Fi
- Wi-Fi
- wi-fi
- Wi-Fi
- Wi-Fi中的连接认证的问题笔记记录
- 运行地址和加载地址
- 看看牛人是如何学习嵌入式的
- ios 字符串的base64编解码
- 看看高手对如何学习ARM的讨论
- nginx的进程模型
- Wi-Fi CERTIFIED---EAP-TLS认证错误
- 把不想让别人看到的应用都隐藏起来的方法
- 使用CoreAnimation实现最简单的拖拽转盘效果
- 有关signal的函数(像SIG_IGN等等)
- 聊聊并发(五)——原子操作的实现原理
- java内部类详解
- 如何访问一个进程的内存空间
- 关于javascript面向对象
- MYSQL数据及表格导出