React Native原生Android SSL双向认证

在项目开发中遇到不少的开发问题,比如最近一直在解决React Native原生Android SSL双向认证,查阅了很多资料和博客,其中有不少的解决方案,在实际使用之后发现,要不历史久远方法很多依赖库已经无法满足现代开发,要不就是叙述不够清楚,导致在使用中一直处于试错的阶段。 当然,通过一些AI提出的一些方案也存在第三方库过时和方案代码不生效的问题,在结合多个方案和实际验证后,得出了以下的方案:

添加认证文件

将认证文件放入Android项目assets文件夹下,认证文件有.cer和.p12文件

Android原生代码

Application.kt `

kotlin 复制代码
override fun onCreate() {
 .....
    OkHttpClientProvider.setOkHttpClientFactory { client }
}
  // 加载服务器CA证书
  fun createTrustManager(context: Context): X509TrustManager {
      val certificateFactory = CertificateFactory.getInstance("X.509")
      val inputStream = context.assets.open("youcer.cer")
      val ca = certificateFactory.generateCertificate(inputStream) as X509Certificate
      inputStream.close()

      // 创建包含CA的KeyStore
      val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
          load(null, null)
          setCertificateEntry("ca", ca)
      }

      // 初始化TrustManagerFactory
      val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
          init(keyStore)
      }

      return tmf.trustManagers.first { it is X509TrustManager } as X509TrustManager
  }
  // 加载客户端证书
  fun createKeyManager(context: Context): KeyManagerFactory {
      val keyStore = KeyStore.getInstance("PKCS12").apply {
          val inputStream = context.assets.open("youp12.p12")
          load(inputStream, "youpassword".toCharArray()) // 替换为实际密码
          inputStream.close()
      }

      return KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()).apply {
          init(keyStore, "youpassword".toCharArray()) // 替换为实际密码
      }
  }
  fun createSslContext(context: Context): SSLContext {
      val trustManager = createTrustManager(context)
      val keyManagerFactory = createKeyManager(context)

      val sslContext = SSLContext.getInstance("TLS").apply {
          init(keyManagerFactory.keyManagers, arrayOf(trustManager), SecureRandom())
      }

      return sslContext
  }
  fun createSecureOkHttpClient(context: Context): OkHttpClient {
      val sslContext = createSslContext(context)
      val trustManager = createTrustManager(context)

      return OkHttpClientProvider.createClientBuilder()
          .sslSocketFactory(sslContext.socketFactory, trustManager)
          .hostnameVerifier { hostname, session ->
              // 生产环境应验证主机名,此处示例接受所有(仅测试用)
              true
          }
          .build()
  }

`

重新打包Android安装包

React Native 项目打包分为 Android 和 iOS 两部分,以下分别介绍详细步骤。

Android 打包

  1. 准备签名密钥

使用以下命令生成签名密钥:

vbnet 复制代码
keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

将生成的 my-release-key.keystore 文件放置在 android/app 文件夹下。

  1. 配置签名信息

编辑 android/gradle.properties 文件,添加以下内容:

ini 复制代码
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=你的密码
MYAPP_RELEASE_KEY_PASSWORD=你的密码

在 android/app/build.gradle 中添加签名配置:

arduino 复制代码
android {
signingConfigs {
release {
storeFile file(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
  1. 打包 APK 或 AAB

打包 APK:

bash 复制代码
cd android
/gradlew assembleRelease

打包 AAB(Google Play 推荐格式):

bash 复制代码
/gradlew bundleRelease

打包完成后,文件路径: APK: android/app/build/outputs/apk/release/app-release.apk AAB: android/app/build/outputs/bundle/release/app-release.aab

相关推荐
一个扣子15 小时前
降低 Android APK 体积:Hermes 的字节码格式与资源压缩
react native·字节码·构建优化·包体积优化·android性能·hermes·apk瘦身
cn_mengbei1 天前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
祖国的好青年4 天前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
一个扣子4 天前
性能面板解读:通过 Hermes Runtime 测量函数执行耗时
react native·chrome devtools·hermes·性能面板·函数耗时·performance api
一个扣子5 天前
Hermes 的 Android 与 iOS 平台差异化配置详解
react native·字节码·新架构·hermes·android配置·ios配置·平台差异
茅盾体6 天前
React Native
android·react native·react.js
一个扣子6 天前
多环境配置:开发/生产环境下 Hermes 的开启与关闭策略
react native·开发模式·多环境配置·生产模式·hermes·环境切换·构建配置
TechMasterPlus8 天前
Hermes 深度解析:React Native 高性能 JavaScript 引擎实践指南
javascript·react native·react.js
令人头秃的代码0_08 天前
React Native Bundle更新升级
react native
用户600071819109 天前
【翻译】React Native JSI 深度解析(第 3 篇):面向 JavaScript 开发者的 C++
react native