Как исправить Proguard удаляет java .security code - PullRequest
1 голос
/ 21 января 2020

Я использую java.security.PublicKey в своем проекте

Однако, когда я включаю Proguard, я получаю следующую ошибку:

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String java.security.PublicKey.getAlgorithm()' on a null object reference

После некоторого исследования я обнаружил, что он падает

val entry = KeyStore.PrivateKeyEntry(keyPair.private, arrayOf(certificate)) <--- this line
keyStore.setEntry(alias, entry, keyProtection)

Как мне заставить это работать?

добавление этого в файл proguard не работает:

-keep class java.security.** { *; }
-keepclassmembers class java.security.** { *; }
-keep public interface java.security.Key {*;}
-keep public interface java.security.PublicKey {*;}
-keepclassmembers class * implements java.security.PublicKey {
    public <methods>;
}

После еще большего количества исследований я обнаружил, что более точные c строка в конструкторе KeyStore.PrivateEntry () вызывает проблему

И это

Certificate[] clonedChain = chain.clone();
clonedChain[0].publicKey is left null

Как сделать так, чтобы она клонировала также ключ publi c?

1 Ответ

1 голос
/ 22 января 2020

Проблема была в устаревшем коде.

Я использовал устаревший код spongycastle для создания самозаверяющего сертификата. Ключ publi c в указанном сертификате при обращении в proguard стал нулевым.

Я изменил на следующее:

api 'com.madgag.spongycastle:core:1.58.0.0'
api 'com.madgag.spongycastle:prov:1.58.0.0'
api 'com.madgag.spongycastle:bcpkix-jdk15on:1.58.0.0'
api 'com.madgag.spongycastle:bcpg-jdk15on:1.58.0.0'

А затем:

fun KeyPair.toSelfSignedCertificate(principal: String, signatureAlgorithm: String, validity: Int): X509Certificate? {
    val x500Name =  X500Name("CN=$principal")
    val today = Calendar.getInstance()
    val notBefore = today.timeInMillis
    today.add(Calendar.YEAR, validity)
    val notAfter = today.timeInMillis
    val sigGen: ContentSigner = JcaContentSignerBuilder(signatureAlgorithm).build(private)
    val publicKeyInfo = SubjectPublicKeyInfo.getInstance(ASN1Sequence.getInstance(public.encoded))
    val certGen = X509v3CertificateBuilder(x500Name,
            RSAKeyGenParameterSpec.F4,
            Date(notBefore),
            Date(notAfter),
            x500Name,
            publicKeyInfo)
    val certHolder: X509CertificateHolder = certGen.build(sigGen)
    return JcaX509CertificateConverter().getCertificate(certHolder)
}

И это сработало хорошо.

...