Java 将PFX静默安装到ANDROID系统受信任的CA用户密钥库中

Java 将PFX静默安装到ANDROID系统受信任的CA用户密钥库中,java,android,ssl-certificate,x509,pfx,Java,Android,Ssl Certificate,X509,Pfx,我的公司正在开发一个使用安卓平板电脑的信息亭。我们使用TLS与专用服务器通信。我们拥有平台密钥,可以授予客户端应用程序系统权限。服务器仅允许客户端使用授权客户端证书进行连接。为了制造平板电脑,我们需要以PFX格式将客户端证书和私钥加载到Android系统可信CA用户密钥库中。多个应用程序需要从用户密钥库检索私钥和证书链。我们的制造过程是一个自动化过程,没有人可以单击“是”和“确定”来显示提示。我们还需要静默证书安装过程,以便在客户端证书将来过期时替换它们 如何在没有用户交互的情况下,从平台签名的

我的公司正在开发一个使用安卓平板电脑的信息亭。我们使用TLS与专用服务器通信。我们拥有平台密钥,可以授予客户端应用程序系统权限。服务器仅允许客户端使用授权客户端证书进行连接。为了制造平板电脑,我们需要以PFX格式将客户端证书和私钥加载到Android系统可信CA用户密钥库中。多个应用程序需要从用户密钥库检索私钥和证书链。我们的制造过程是一个自动化过程,没有人可以单击“是”和“确定”来显示提示。我们还需要静默证书安装过程,以便在客户端证书将来过期时替换它们


如何在没有用户交互的情况下,从平台签名的应用程序将PFX文件以静默方式加载到System Trusted CA User store中?

这仅适用于企业wifi配置。以下方法将使用CA证书和用户证书配置WPA/EAP-TLS wifi配置

public static void createEapConfig(Context context, String ssid, String password, boolean connectAutomatically, boolean hiddenNetwork, Integer eapMethod, Integer phase2, String identity, String anonymousIdentity, String caCertificateData, String clientCertificateData, String clientCertPass) { if (ssid == null || eapMethod == null) { return; } WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); boolean connect = connectAutomatically; boolean isWifiReceiverRegistered = false; try { Logger.logEnteringOld(); WifiConfiguration config = new WifiConfiguration(); config.SSID = "\"" + ssid + "\""; config.hiddenSSID = hiddenNetwork;//false; //hidden network is always set to false. config.status = WifiConfiguration.Status.ENABLED; config.priority = 40; try { wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class).invoke(wifiManager, config, false); } catch (Exception e) { Logger.logError(e); } Settings.isWifiHotspotEnabled(false); if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); Thread.sleep(5000); } if (connect) { lastActNetId = wifiManager.getConnectionInfo().getNetworkId(); wifiManager.disableNetwork(lastActNetId); wifiManager.disconnect(); } config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); // Set defaults if (phase2 == null) phase2 = WifiEnterpriseConfig.Phase2.NONE; if (identity == null) identity = ""; if (anonymousIdentity == null) anonymousIdentity = ""; if (caCertificateData == null) caCertificateData = ""; if (clientCertificateData == null) clientCertificateData = ""; if (Build.VERSION.SDK_INT >= 18) { if (Util.isNullOrEmpty(password)) { config.enterpriseConfig.setPassword(password); } config.enterpriseConfig.setEapMethod(eapMethod); if (phase2 != null) { config.enterpriseConfig.setPhase2Method(phase2); } if (!Util.isNullOrEmpty(identity)) { config.enterpriseConfig.setIdentity(identity); } if (!Util.isNullOrEmpty(anonymousIdentity)) { config.enterpriseConfig.setAnonymousIdentity(anonymousIdentity); } InputStream is = null; if (!Util.isNullOrEmpty(caCertificateData)) { try { byte[] decodedCaCert = Base64.decode(caCertificateData); //is = new FileInputStream(Environment.getExternalStorageDirectory()+"/local-root(1).cer" ); CertificateFactory cf = CertificateFactory.getInstance("X.509"); try { is = new ByteArrayInputStream(decodedCaCert); X509Certificate caCert = (X509Certificate) cf.generateCertificate(is); config.enterpriseConfig.setCaCertificate(caCert); } catch (CertificateException ex) { Logger.logError(ex); } finally { if (is != null) { is.close(); } } } catch (Throwable t) { Logger.logError(t); } } if (!Util.isNullOrEmpty(clientCertificateData) && !Util.isNullOrEmpty(clientCertPass)) { try { byte[] decodedClientCert = Base64.decode(clientCertificateData); KeyStore p12 = KeyStore.getInstance("pkcs12"); is = new ByteArrayInputStream(decodedClientCert); //is = new FileInputStream(Environment.getExternalStorageDirectory()+"/createdDERCert(1).pfx"); p12.load(is, clientCertPass.toCharArray()); Enumeration aliases = p12.aliases(); for (String alias : Collections.list(aliases)) { if (alias == null) { continue; } PrivateKey privateKey = (PrivateKey) p12.getKey(alias, clientCertPass.toCharArray()); if (privateKey == null) { continue; } X509Certificate clientCert = (X509Certificate) p12.getCertificate(alias); if (clientCert != null) { config.enterpriseConfig.setClientKeyEntry(privateKey, clientCert); } } } catch (Throwable t) { Logger.logError(t); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } } int networkId = -1; networkId = wifiManager.addNetwork(config); wifiManager.enableNetwork(networkId, true); wifiManager.saveConfiguration(); if (connect) { wifiManager.reconnect(); IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); Settings.cntxt.registerReceiver(wifiReceiver, filter); isWifiReceiverRegistered = true; Thread.sleep(15000); } } catch (InterruptedException ie) { if (NetworkStateReceiver.activeConnection(Settings.cntxt)) { lastActNetId = wifiManager.getConnectionInfo().getNetworkId(); } } catch (Exception ex) { Logger.logError(ex); } finally { // unregister wifi state receiver if (connect && isWifiReceiverRegistered) { isWifiReceiverRegistered = false; Settings.cntxt.unregisterReceiver(wifiReceiver); } } Logger.logEnteringOld(); } 公共静态void CreateApConfig(上下文上下文、字符串ssid、字符串密码、布尔连接自动、布尔hiddenNetwork、, 整数方法,整数阶段2,字符串标识,字符串匿名标识,字符串证书数据, 字符串clientCertificateData、字符串clientCertPass){ if(ssid==null | | eapMethod==null){ 返回; } WifiManager=(WifiManager)context.getSystemService(context.WIFI\u SERVICE); 布尔连接=自动连接; 布尔值iswifireceiverregisted=false; 试一试{ Logger.logEnteringOld(); WifiConfiguration config=新的WifiConfiguration(); config.SSID=“\”+SSID+“\”; config.hiddenSSID=hiddenNetwork;//false;//隐藏网络始终设置为false。 config.status=WifiConfiguration.status.ENABLED; config.priority=40; 试一试{ wifiManager.getClass().getMethod(“setWifiApEnabled”,WifiConfiguration.class,boolean.class).invoke(wifiManager,config,false); }捕获(例外e){ Logger.logError(e); } 设置。iswifihospoteabled(假); 如果(!wifiManager.isWifiEnabled()){ wifiManager.setWifiEnabled(true); 睡眠(5000); } 如果(连接){ lastActNetId=wifiManager.getConnectionInfo().getNetworkId(); wifiManager.disableNetwork(lastActNetId); wifiManager.disconnect(); } config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); config.allowedKeyManagement.set(WifiConfiguration.keymagmt.IEEE8021X); //设置默认值 如果(phase2==null)phase2=WIFIENERPRISECONFIG.phase2.NONE; 如果(identity==null)identity=“”; 如果(anonymousIdentity==null)anonymousIdentity=“”; 如果(caCertificateData==null)caCertificateData=“”; 如果(clientCertificateData==null)clientCertificateData=“”; 如果(Build.VERSION.SDK_INT>=18){ if(Util.isNullOrEmpty(密码)){ config.enterpriseConfig.setPassword(密码); } config.enterpriseConfig.setEapMethod(eapMethod); 如果(相位2!=null){ config.enterpriseConfig.SetPhase2方法(phase2); } 如果(!Util.isNullOrEmpty(identity)){ config.enterpriseConfig.setIdentity(标识); } 如果(!Util.isNullOrEmpty(匿名身份)){ config.enterpriseConfig.setAnonymousIdentity(anonymousIdentity); } InputStream=null; 如果(!Util.isNullOrEmpty(caCertificateData)){ 试一试{ 字节[]decodedCaCert=Base64.decode(caCertificateData); //is=newfileinputstream(Environment.getExternalStorageDirectory()+“/localroot(1.cer”); CertificateFactory cf=CertificateFactory.getInstance(“X.509”); 试一试{ is=新的ByteArrayInputStream(DecodedAcert); X509证书caCert=(X509证书)cf.generateCertificate(is); 配置企业配置设置证书(caCert); }捕获(证书例外){ Logger.logError(ex); }最后{ 如果(is!=null){ is.close(); } } }捕获(可丢弃的t){ Logger.logError(t); } } 如果(!Util.isNullOrEmpty(clientCertificateData)和&!Util.isNullOrEmpty(clientCertPass)){ 试一试{ 字节[]decodedClientCert=Base64.decode(客户端认证数据); KeyStore p12=KeyStore.getInstance(“pkcs12”); is=新的ByteArrayInputStream(decodedClientCert); //is=新文件输入流(Environment.getExternalStorageDirectory()+“/createdDERCert(1.pfx”); p12.load(is,clientCertPass.toCharArray()); 枚举别名=p12.alias(); for(字符串别名:Collections.list(别名)){ 如果(别名==null){ 继续; } PrivateKey PrivateKey=(PrivateKey)p12.getKey(别名,clientCertPass.toCharArray()); if(privateKey==null){ 继续; } X509CertificateClientCert=(X509Certificate)p12.getCertificate(别名); if(clientCert!=null){