如何修复 Google 播放警告:SSL 错误处理程序漏洞
How to fix the Google Play Warning: SSL Error Handler Vulnerability
我最近向 google play 发布了一个正式版应用程序,我收到了一封来自 Google 的电子邮件:
我按照 Google Support 建议更新我的代码:
class SslErrorHelper {
companion object {
private val DIGITS_LOWER = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
fun onSslError(context: Context, sslErrorHandler: SslErrorHandler, error: SslError) {
// https://support.google.com/faqs/answer/7071387
LogUtil.log("onSslError --> ${error.primaryError}")
if (checkCertificate(error.certificate)) {
sslErrorHandler.proceed()
} else {
ToastUtils.getInstance().showToast(context.getString(R.string.ssl_certificate_error))
sslErrorHandler.cancel()
}
}
/**
* check the certificate
*/
private fun checkCertificate(cert: SslCertificate): Boolean {
val myCertSHA256Str = "SHA256 fingerprint of my server https certificate "
val bundle = SslCertificate.saveState(cert)
val bytes = bundle.getByteArray("x509-certificate")
if (bytes != null) {
try {
val factory = CertificateFactory.getInstance("X.509")
val ca = factory.generateCertificate(ByteArrayInputStream(bytes))
val sha256 = MessageDigest.getInstance("SHA-256")
val key = sha256.digest((ca as X509Certificate).encoded)
val errorCertSHA256 = String(encodeHex(key))
if (errorCertSHA256 == myCertSHA256Str) {
return true
}
} catch (e: Exception) {
e.printStackTrace()
}
}
return false
}
private fun encodeHex(data: ByteArray): CharArray {
return encodeHex(data, DIGITS_LOWER)
}
private fun encodeHex(data: ByteArray, toDigits: CharArray): CharArray {
val l = data.size
val out = CharArray(l shl 1)
var i = 0
var j = 0
while (i < l) {
out[j++] = toDigits[0xF0 and data[i].toInt() ushr 4]
out[j++] = toDigits[0x0F and data[i].toInt()]
i++
}
return out
}
}
}
我在 WebClient#onReceivedSslError
中调用了 onSslError
方法。
虽然我将我的应用程序重新发布到 Google 播放,它仍然报告 SSL 错误处理程序的漏洞。
我也试过这个答案 ,不幸的是,还是不行!!
之后,我尝试通过执行命令find . -name '*.jar' -exec zipgrep -i onreceivedsslerror {} \;
来查找是哪个class或lib实现了onReceivedSslError
,发现Facebook-login sdk和ShareSdk都实现了,所以我尝试将它们从我的项目中删除。
经过以上所有,它仍然报告漏洞。
现在我 运行 没主意了。请问有人知道要解决这个漏洞吗,或者您可以在这里分享您的经验。
谢谢,祝你有美好的一天!
我更改了包名,然后重新发布。
它在没有任何警告的情况下通过了。
我最近向 google play 发布了一个正式版应用程序,我收到了一封来自 Google 的电子邮件:
我按照 Google Support 建议更新我的代码:
class SslErrorHelper {
companion object {
private val DIGITS_LOWER = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
fun onSslError(context: Context, sslErrorHandler: SslErrorHandler, error: SslError) {
// https://support.google.com/faqs/answer/7071387
LogUtil.log("onSslError --> ${error.primaryError}")
if (checkCertificate(error.certificate)) {
sslErrorHandler.proceed()
} else {
ToastUtils.getInstance().showToast(context.getString(R.string.ssl_certificate_error))
sslErrorHandler.cancel()
}
}
/**
* check the certificate
*/
private fun checkCertificate(cert: SslCertificate): Boolean {
val myCertSHA256Str = "SHA256 fingerprint of my server https certificate "
val bundle = SslCertificate.saveState(cert)
val bytes = bundle.getByteArray("x509-certificate")
if (bytes != null) {
try {
val factory = CertificateFactory.getInstance("X.509")
val ca = factory.generateCertificate(ByteArrayInputStream(bytes))
val sha256 = MessageDigest.getInstance("SHA-256")
val key = sha256.digest((ca as X509Certificate).encoded)
val errorCertSHA256 = String(encodeHex(key))
if (errorCertSHA256 == myCertSHA256Str) {
return true
}
} catch (e: Exception) {
e.printStackTrace()
}
}
return false
}
private fun encodeHex(data: ByteArray): CharArray {
return encodeHex(data, DIGITS_LOWER)
}
private fun encodeHex(data: ByteArray, toDigits: CharArray): CharArray {
val l = data.size
val out = CharArray(l shl 1)
var i = 0
var j = 0
while (i < l) {
out[j++] = toDigits[0xF0 and data[i].toInt() ushr 4]
out[j++] = toDigits[0x0F and data[i].toInt()]
i++
}
return out
}
}
}
我在 WebClient#onReceivedSslError
中调用了 onSslError
方法。
虽然我将我的应用程序重新发布到 Google 播放,它仍然报告 SSL 错误处理程序的漏洞。
我也试过这个答案
之后,我尝试通过执行命令find . -name '*.jar' -exec zipgrep -i onreceivedsslerror {} \;
来查找是哪个class或lib实现了onReceivedSslError
,发现Facebook-login sdk和ShareSdk都实现了,所以我尝试将它们从我的项目中删除。
经过以上所有,它仍然报告漏洞。
现在我 运行 没主意了。请问有人知道要解决这个漏洞吗,或者您可以在这里分享您的经验。
谢谢,祝你有美好的一天!
我更改了包名,然后重新发布。 它在没有任何警告的情况下通过了。