RSA private or public key is null(android with Kotlin)

2020. 4. 25. 00:21IssueNote

 

오늘 상당히 머리를 아프게한 이슈가 있었습니다.. 

 

그 내용은.. 어떤 유저가 특정 내용을 백업하려는 행위에서 문의가 들어왔고 크래쉬 리포트로 추적한 결과 

 

RSA private or public key is null

 

라는 에러가 올라왔습니다.. (두둥..)

 

특정 내용은 암호화되어 Preference로 저장되는데 이 때 Preference의 값을 불러올 때 KeyPair가 문제가 있는 듯 보였습니다..

 

해서.. 키를 저장하는 키스토어가 문제인지, 저장된 문서가 문제인지. 애초에 문서가 저장되지 않았는지..

 

모든 경우의 수를 파악하면서 코드를 점검하고 테스트 했습니다...

 

..

..

..

 

그러나 코드는 정상적이였고 제가 생각한 경우의 수는 모두 문제 없다는 듯하게 코드는 잘 작성되어 있었습니다..

 

그러던 도중 RSA private or public key is null이라는 주제로 Stackoverflow에서 주제가 있었고 

 

해당 내용은 이러했습니다..

 

Cipher 인스턴스를 가져올 때 일반적으로 

 

Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

를 사용해서 호출하는데.. 이 경우 Cipher 내부적으로 Provider를 각 sdk버전에 맞게 호출하게 됩니다..

 

예를 들어

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // below android m return 
		Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL"); // error in android 6: InvalidKeyException: Need RSA private or public key 
    } else { // android m and above return
   		Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidKeyStoreBCWorkaround"); // error in android 5: NoSuchProviderException: Provider not available: AndroidKeyStoreBCWorkaround 
    }

 

이러한 내용입니다. M버전 이하에서는 AndroidOpenSSL이라는 Provider를 그 이외엔 AndroidKeyStoreBCWorkaround Provider를 사용하라는 내용입니다. 이 내용을 확인하고 저희는 위의 일반적으로 SDK 버전에 맞게 호출되는 일반 호출을 하는 코드가 적용되어 있었습니다..

 

그러나 크래쉬 리포트를 자세히 확인해보니..

 

com.android.org.conscrypt.OpenSSLCipherRSA.engineInitInternal (OpenSSLCipherRSA.java:204)

이런 오류가 있었습니다.. 해당 유저는 9버전을 사용하고 계셨고 api는 당연히 28입니다..그러나 위의 OpenSSL Provider를 사용하라는 버전은 마시멜로우(23)버전 이하였고.. 해당 유저는 왜(?)인지 이 Provider를 사용하고 있는 것 같았습니다..

 

그리하여~ 이 문제일 것 같아 해당 내용을 적용하고 왔습니다...

(결과는 임상실험(?) 후에 알게 될 것 같아요..)

 

오늘의 교훈은.. 크래쉬의 내용을 보고 지레 짐작으로 해당 이슈를 파악하려 하지말고 관련된 이슈를 먼저 찾아보자! 입니다...

'IssueNote' 카테고리의 다른 글

Change Dialog to DialogFragment  (0) 2020.04.10