当前位置: 首页 > 知识库问答 >
问题:

如何修复TrustManager的不安全实现?

戚学文
2023-03-14

我的应用程序在Google Play中被拒绝了,因为TrustManager的一些不安全的实现。

但是在我的库中,我只有TrustManager的一个实现(这是我的SSLUtil类)。

import android.content.Context;

import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class SSLUtil {

    /**
     * @param ctx
     * @param certRaw File from /res/raw
     * @return
     * @throws Exception
     */
    public static SSLSocketFactory trustCert(Context ctx, int certRaw) throws Exception {
        // Load CAs from an InputStream

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        // File at /res/raw
        InputStream caInput = FileUtils.readRawFile(ctx, certRaw);
        Certificate ca;
        try {
            ca = cf.generateCertificate(caInput);
        } finally {
            caInput.close();
        }

// Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);
//      Log.d(TAG, "KeyStore: " + keyStore);

// Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        SSLSocketFactory socketFactory = context.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);

        return socketFactory;
    }
}

我不明白为什么我的申请被拒绝了。

共有1个答案

柯乐池
2023-03-14

不,您的代码不安全。从名称allhostsvalid中可以看出,代码盲目地接受所有主机名,这意味着连接可以是中间人连接。您应该删除该类。

 类似资料:
  • Google建议我在Android应用程序中有一个不安全的X509TrustManager接口实现,需要更改代码如下: 若要正确处理SSL证书验证,请更改自定义X509TrustManager接口的checkServerTrusted方法中的代码,以便在服务器提供的证书不符合预期时引发CertificateException或IllegalArgumentException。对于技术问题,您可以p

  • 谷歌正在取消不太安全的应用程序访问功能。我正在为我的网站的联系人页面使用smtp电子邮件服务。但在2022年5月30日之后,这项服务可能无法工作。 有没有其他方法可以让第三方不太安全的应用程序访问我的Gmail帐户。。? 应用程序密码能解决这个问题吗...?我怀疑设置应用程序密码也不会提供访问权限,因为谷歌表示这可能不适用于不太安全的应用程序。 那么有什么方法可以解决这个问题,以便smtp电子邮件

  • 我使用下面的firebase rest API访问firestore数据库数据 为了访问我的firestore数据库,我在关键部分使用了我的访问令牌,但我收到了来自firebase的电子邮件,称“[firebase]您的云firestore数据库有不安全的规则”。直到那时,我才发现任何人都可以访问我的数据库数据,即使没有有效的访问令牌 谢谢

  • TL;DR 每次localhost:4200(通过cors过滤器)都会发出超文本传输协议请求localhost:8080它会丢失持有身份验证的会话范围bean,这基本上会使403的所有调用失败。不包括第一个超文本传输协议请求(它不支持Spring安全) 我有一个Spring Boot应用程序,它在localhost:8080中运行良好。我们正在其内部创建一个角度iframe,它也可以很好地工作(当