- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的公司正在开发一个使用 Android 平板电脑的信息亭。我们使用 TLS 与私有(private)服务器通信。我们拥有平台 key 来授予我们的客户端应用程序系统权限。仅当客户端使用授权的客户端证书进行连接时,服务器才会允许客户端进行连接。为了制造平板电脑,我们需要将 PFX 格式的客户端证书和私钥加载到 Android 系统可信 CA 用户 keystore 中。多个应用程序需要从用户 keystore 检索私钥和证书链。我们的制造过程是一个自动化过程,没有人可以单击"is"和“确定”来屏幕提示。我们还需要静默证书安装过程来替换将来过期的客户端证书。
如何将 PFX 文件从平台签名应用程序静默加载到系统受信任的 CA 用户存储中,无需用户交互?
最佳答案
这仅适用于企业 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();}
关于java - 将 PFX 静默安装到 Android 系统受信任的 CA 用户 keystore 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44860422/
继承了一个VS2k5项目;它是作为 DLL 分发的 Outlook 加载项。 当我尝试编译项目时,它要求输入密码(我不知道),因为有一个受密码保护的 pfx 文件并且程序集已签名。由于我不知道密码,如
我找到了一个 answer that uses OpenSSL ,但我在 Windows 上,而且我不容易拿到它。有没有办法(例如使用 CERTUTIL 或 VBScript)查看 .PFX 文件中的
当您将 PFX 转换为 Base64,然后再将其转换回 PFX 时,是否有可能? $PFX_FILE = get-content 'dummy.pfx' -Encoding Byte [Convert
当您将 PFX 转换为 Base64,然后再将其转换回 PFX 时,是否有可能? $PFX_FILE = get-content 'dummy.pfx' -Encoding Byte [Convert
我丢失了 pfx 文件,但我有 .cer 文件并且我知道用于打开丢失的 pfx 文件的密码。如何生成 pfx?这可能吗? 最佳答案 只要您拥有该证书的私钥: 将 PEM 转换为 PFX: openss
我关注了这个 link 签署我的exe应用程序。 我在 Windows 7 上安装了 SDK 工具, 运行 C:\Program Files\Microsoft SDKs\Windows\v6.1\B
我需要在 .pfx 文件中上传合格的证书,我有 .req 和 .pfx 以及请求证书的私钥文件,并且我从执行这些操作的公司那里获得了合格的 .crt 证书。如何加入密码和具有合格根的证书? 我已经尝试
我有 Java 网络服务,并使用 Java Keytool 创建的 jks 文件实现了 X.509。 keytool -genkey -keyalg RSA -sigalg SHA1withRSA -
因此,我调用的 API 要求我将 pfx 证书链接到我的浏览器或 Postman(如果我调用该 API)。我想以编程方式执行此操作。如果 R 中有代码让我在传递 post 请求时使用我现有的 pfx
我搜索了 Stack,试图找到这个问题的答案。我基本上已经安装了证书,并且可以通过 chrome 访问 XML 文件,但我尝试使用 requests 将其直接拉入 python 中。 我只是使用 re
我试图用 PFX 强命名一个程序集也用于数字签名的文件。 PFX 证书具有 CodeSigning 选项,由 CA 提供。 . 当我尝试使用它时,出现以下错误: error MSB3325: Cann
PFX 包含以下类别的证书,它们是叶证书链的一部分。 颁发公共(public)证书(客户端/服务器) 中级 CA 证书 根 CA 证书 私钥 它可以有不属于链的证书吗? 最佳答案 是的,PFX/PKC
我的老板从 Comodo 获得了证书,我一直在努力寻找解决将证书放入 VB6 应用程序的问题的方法。证书本身采用 VB6 格式,我对此类事情几乎一无所知。 Comodo的人非常乐于助人(从我的老板那里
我花时间整理了诸如 these 之类的问题。 到目前为止没有运气。我的公司有一个我们使用的 VeriSign 的 pfx 文件。我将它添加到我的项目中并在添加时输入密码,然后检查我的解决方案。然后我转
我有一个 Azure 应用服务,我们已在其中上传(通过 Key Vault).pfx 文件以将它们添加到证书存储中。我们还添加了配置“WEBSITE_LOAD_CERTIFICATES”以在代码中访问
我正在尝试使用以下代码获取受密码保护的 pfx 文件的指纹: function Get-CertificateThumbprint { # # This will return a c
使用 CertUtil 将证书从 pfx 文件导入用户的个人存储相对容易: certutil –f –p [certificate_password] –importpfx C:\[certifica
您好,我正在尝试将我的 azure 网站连接到我购买的域(它是 .dk 域),但我无法找到需要通过门户上传到我的 azure 网站的 .pfx 证书文件。我具体需要做什么?我迷路了,谢谢。 最佳答案
我尝试通过 powershell 创建自签名代码签名证书,然后通过 Visual Studio 2017 将其作为 pfx 签署 .NET 程序集。使用 -ProtectTo 参数将 pfx 导出为受
如何从 .pfx 文件导入证书的私钥?我有这个代码: X509Certificate2 cert = new X509Certificate2("C:/amazon.pfx", "he
我是一名优秀的程序员,十分优秀!