android - 强制在 Android 应用程序中更新证书 .pem

标签 android ssl

 public static SSLContext getSSL() {
        try {
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            AssetManager assetManager = App.getAppContext()
                    .getAssets();
            InputStream caInput = assetManager.open("cert.pem");
            java.security.cert.X509Certificate ca = null;
            try {
                ca = (java.security.cert.X509Certificate) cf
                        .generateCertificate(caInput);
            } catch (Exception er) {

            } finally {
                caInput.close();
            }
            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca",
                    ca);
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(tmfAlgorithm);
            tmf.init(keyStore);
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, tmf.getTrustManagers(), null);
            return context;
        } catch (Exception e1) {
            return null;
        }
    }

所以我正在使用那个函数,当我调用下面的函数时它起作用了

 ((HttpsURLConnection) conn).setSSLSocketFactory(Common
                                    .getSSL().getSocketFactory()

但是,当我的客户通知我新证书时出现了问题,并且我需要使用新证书更新我的应用程序才能正常工作。我的问题是,正确的做法是什么?为什么我每次都需要在应用程序中更新证书?我把它放在 assets 文件夹中。我应该每次都从某个地方下载证书吗?不更新应用程序的人,由于旧证书将无法使用该应用程序

最佳答案

目前,您只是将一些代码投入到问题中,而没有解释它的确切用途。我的猜测是您使用它来将您的客户提供给您的特定自签名证书视为受信任的。这意味着如果证书在服务器端发生更改,则客户端(即应用程序或至少应用程序使用的 cert.pem 文件)需要更新。

处理证书更新的常用方法首先是不使用自签名证书。相反,应该使用公共(public) CA 颁发的证书,因为应用程序将接受内置信任库中任何 CA 颁发的任何证书,前提是该证书是为预期站点颁发的。这样,即使频繁更新证书也没有问题,应用程序无需更新即可接受新证书。

我建议您与您的客户沟通,从自签名证书转向使用公共(public)证书的既定方法。这些并不昂贵,即像 Let's Encrypt 这样的 CA 免费提供这些。

关于android - 强制在 Android 应用程序中更新证书 .pem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529568/

相关文章:

android - 第二次打开时从数字选择器中突出显示所选项目

android - 如何在Android中使用自定义日历 View 以及如何设置提醒提醒?

php - WP Multisite + SSL 在 wp-admin 上给出 404

iis - 从 powershell 创建自签名 iis ssl 证书

ssl - Iptables 丢弃 SSL 流量 (443)

spring-mvc - 使用 GPC : Cloud SQL, Kubernetes(服务和入口)和带有 Google 托管证书的 HTTP(S) 负载均衡器部署 Spring MVC 应用程序

postgresql - 无法在 PostgreSQL 9.5 中运行 psql

android - 如何在Android手机上强制深度 sleep 以进行测试

android - 如何为长文本添加弹出窗口 Android

java - Android底板不折叠