ssl 使用Retrofit锁定Android证书

kkbh8khc  于 2022-12-19  发布在  Android
关注(0)|答案(2)|浏览(139)

我在我的应用程序中实现ssl固定,我使用的是证书层次结构中我的网站的叶节点证书。

val certificatePinner = CertificatePinner.Builder()
        .add(
            BuildConfig.DOMAIN,
            Constants.SHA256_HASH
        )
    okHttpClientBuilder.certificatePinner(certificatePinner.build())
        .build()

这工作完美,直到证书保持不变。但主要问题是保持应用程序与SHA256哈希最新的证书到期每3个月。如果我错过了更新新的SHA256哈希,应用程序停止工作,由于证书不匹配。有什么办法可以避免这种情况。谢谢提前。

rdrgkggo

rdrgkggo1#

使用根证书的SHA散列解决了我的问题,因为它的寿命更长

ykejflvf

ykejflvf2#

我不得不处理类似的情况:我不得不实施证书绑定,但我不想将应用发布与证书过期同步。
我实现的解决方案(我知道这是一种妥协)是这样工作的:如果证书应用程序使用仍然有效,则应用程序将应用证书固定。如果证书已过期,则应用程序不使用证书固定。这样,应用程序将在证书过期日期和应用程序更新(使用新证书哈希码)之间"公开,但不使用证书固定"。在此期间,应用程序将公开,但它将继续工作!!
代码:

public abstract class CertificatePinnerManager {

    private CertificatePinnerManager() {

    }

    public static final String DATE_FORMAT="dd/MM/yyyy";
    public static final String CERTIFICATE_PINNING_END_CHECK = "12/09/2021";
    public static final String CERTIFICATE_SHA_256 = "sha256/zzz/yyy/xxxx";

    public static CertificatePinner generateCertificatePinner() {
        @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        Date strDate = null;
        try {
            strDate = sdf.parse(CERTIFICATE_PINNING_END_CHECK);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (new Date().before(strDate)) {
            // Certificate pinning enabled
            return new CertificatePinner.Builder()
                    // domain to check
                    .add("dummy.com", CERTIFICATE_SHA_256)
                    .build();

        } else {
            // disable certificate pinning
            return new CertificatePinner.Builder().build();
        }

    }
}
// create okhttp client
OkHttpClient httpClient = new OkHttpClient.Builder()
  .certificatePinner(CertificatePinnerManager.generateCertificatePinner())
  .build()

我认为这是一个更好的解决方案,使用远程配置管理证书SHA,但目前,这是我的解决方案。:D
希望对你有帮助。

相关问题