{"_id":"@bingtang-rn/react-native-ssl-public-key-pinning","_rev":"2-93fc9a07c545ab7152433322900274d0","name":"@bingtang-rn/react-native-ssl-public-key-pinning","dist-tags":{"latest":"1.2.7"},"versions":{"1.2.6":{"name":"@bingtang-rn/react-native-ssl-public-key-pinning","version":"1.2.6","keywords":["react-native","harmony","harmonyos","react-native-ssl-public-key-pinning"],"license":"MIT","_id":"@bingtang-rn/react-native-ssl-public-key-pinning@1.2.6","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning","dist":{"shasum":"ef9a7ed67697d1163043a60f207a68962af962a0","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-ssl-public-key-pinning/-/react-native-ssl-public-key-pinning-1.2.6.tgz","fileCount":34,"integrity":"sha512-BeJBFv8NzNKcgAjP4kKk2dznsgR52YsqxRlVMW512QebitOI2WukNlVVJ96mJNgGWj9aXiHHWtrYRa0xpPMChA==","signatures":[{"sig":"MEUCIC2iUUHDWzxpVROZjw9Ht+eoAL9puAuBlp6Sa8OyCqMLAiEAlXqmGLR5UZSrxNWgUTk74YO2i69nOlbqitUShOp+9qA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68564},"main":"./src/index.ts","module":"./src/index.ts","engines":{"node":">=18"},"gitHead":"059e9373872d65241d98570eb8c0da485e9b40f9","harmony":{"alias":"react-native-ssl-public-key-pinning","autolinking":{"ohPackageName":"@oh-rn/react-native-ssl-public-key-pinning","cppPackageClassName":"SslPublicKeyPinningPackage","etsPackageClassName":"SslPublicKeyPinningPackage","cmakeLibraryTargetName":"ssl_public_key_pinning"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/ssl_public_key_pinning/src/main/cpp/generated --ets-output-path ./harmony/ssl_public_key_pinning/src/main/ets/generated"},"_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_ssl_public_key_pinning组件。","directories":{},"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"tmp":"tmp/react-native-ssl-public-key-pinning_1.2.6_1785417447995_0.36400664866480703","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"_id":"@bingtang-rn/react-native-ssl-public-key-pinning@1.2.7","dist":{"shasum":"9b55d98fa8f79c82e0abd3a8bf30a386d053e6ab","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-ssl-public-key-pinning/-/react-native-ssl-public-key-pinning-1.2.7.tgz","fileCount":33,"integrity":"sha512-u9I3xXQukSjsP7rtXzAZXMI7XapCncSX/95b03tIQx9DdmYuiB2a2hEu12InqnEhmb4PLXxhB4TpheaPr6HzUQ==","signatures":[{"sig":"MEYCIQDHpMeq2u0mN0rbK25Aq194iYY5U0vkSwAgoejL7QPNigIhAMys5Vg3gP1nxxwFc1L3U6G1RyZhh6wx3iVtHuk8Cq3r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCsxKBPghF64/d1y9BVVQ/7d76kJTaSU/jBjpigXwgjWwIhALb36d2sAxOvIhIlqmjuWUaAYs0Z2TSCCm8q7UW/HizN"}],"unpackedSize":57755},"main":"./src/index.ts","name":"@bingtang-rn/react-native-ssl-public-key-pinning","module":"./src/index.ts","engines":{"node":">=18"},"gitHead":"ccefaaf541926ef4d490c908365ccecd2b4b3027","harmony":{"alias":"react-native-ssl-public-key-pinning","autolinking":{"ohPackageName":"@bingtang-rn/react-native-ssl-public-key-pinning","cppPackageClassName":"SslPublicKeyPinningPackage","etsPackageClassName":"SslPublicKeyPinningPackage","cmakeLibraryTargetName":"ssl_public_key_pinning"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"license":"MIT","private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/ssl_public_key_pinning/src/main/cpp/generated --ets-output-path ./harmony/ssl_public_key_pinning/src/main/ets/generated"},"version":"1.2.7","_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning","keywords":["react-native","harmony","harmonyos","react-native-ssl-public-key-pinning"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_ssl_public_key_pinning组件。","directories":{},"maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-ssl-public-key-pinning_1.2.7_1790014191225_0.3873512234331429"}}},"time":{"created":"2026-07-30T13:17:27.346Z","modified":"2026-09-21T18:09:51.470Z","1.2.6":"2026-07-30T13:17:28.129Z","1.2.7":"2026-09-21T18:09:51.313Z"},"license":"MIT","homepage":"https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning","keywords":["react-native","harmony","harmonyos","react-native-ssl-public-key-pinning"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning","type":"git"},"description":"适配鸿蒙版本，提供react_native_ssl_public_key_pinning组件。","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"readme":"# @bingtang-rn/react-native-ssl-public-key-pinning for HarmonyOS\r\n\r\n本项目基于 [react-native-ssl-public-key-pinning](https://github.com/frw/react-native-ssl-public-key-pinning) 开发，为 React Native 鸿蒙（OpenHarmony）适配版本。如果在使用过程中有任何问题，可以在GitCode提Issue，会及时跟进。issue地址：[issues](https://gitcode.com/rn_ohos_plugin/react_native_ssl_public_key_pinning/issues)。\r\n\r\n## 版本对应关系\r\n\r\n| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 |\r\n| ------------ | ---------- | ------------ | -------- | ------------- |\r\n| 见发布记录 | 1.2.6 | 0.72+ | 是 | API17+ |\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @bingtang-rn/react-native-ssl-public-key-pinning\r\n```\r\n\r\n## 使用\r\n\r\n```tsx\r\nimport {\r\n  initializeSslPinning,\r\n  disableSslPinning,\r\n  addSslPinningErrorListener,\r\n  isSslPinningAvailable,\r\n} from 'react-native-ssl-public-key-pinning';\r\n\r\n// 1. 初始化 pinning（域名 + 其 CA 公钥的 base64 SHA-256 哈希）\r\nawait initializeSslPinning({\r\n  'google.com': {\r\n    includeSubdomains: true,\r\n    publicKeyHashes: [\r\n      'hxqRlPTu1bMS/0DITB1SSu0vd4u/8l8TjPgfaAp63Gc=', // GTS Root R1\r\n      'Vfd95BwDeSQo+NUYxVEEIlvkOlWY2SalKK1lPhzOx78=', // GTS Root R2\r\n    ],\r\n  },\r\n});\r\n\r\n// 2. 监听 pinning 失败事件（pin 不匹配时触发）\r\nconst subscription = addSslPinningErrorListener((error) => {\r\n  console.warn(`Pinning failed for ${error.serverHostname}: ${error.message}`);\r\n});\r\n\r\n// 3. 正常发起 fetch / XMLHttpRequest，自动走 pinning 校验\r\nconst response = await fetch('https://www.google.com');\r\n\r\n// 4. 禁用 pinning\r\nawait disableSslPinning();\r\nsubscription.remove();\r\n```\r\n\r\n> import 时使用原库名 `'react-native-ssl-public-key-pinning'`，而非鸿蒙包名。RNOH 通过 alias 自动映射到 `@bingtang-rn/react-native-ssl-public-key-pinning`。\r\n\r\n**宿主配置（必须）**：HarmonyOS 的 `httpClient` 在 RN 实例创建时注入，pinning 配置运行时由 TurboModule 设置。需在宿主 `EntryAbility` 中注入库导出的 `SslPinningHttpClient`：\r\n\r\n```typescript\r\nimport { SslPinningHttpClient } from '@bingtang-rn/react-native-ssl-public-key-pinning';\r\n\r\n// 在 EntryAbility 中\r\nprotected override onCreateDefaultHttpClient(): HttpClient {\r\n  return new SslPinningHttpClient();\r\n}\r\n```\r\n\r\n**平台差异**：\r\n- iOS TrustKit 强制每域至少 2 个 pin，HarmonyOS 无此限制（与 Android OkHttp 一致）\r\n- pinning 失败事件通过 `emitDeviceEvent('pinning-error', payload)` 发送，`payload = { serverHostname: string, message?: string }`\r\n\r\n**权限要求**：\r\n- 需在 `module.json5` 声明 `ohos.permission.INTERNET`（system_grant，安装时自动授予）\r\n- `certificatePinning` 功能需 HarmonyOS API17+\r\n\r\n## Link\r\n\r\n| 版本 | 是否支持 Autolink |\r\n|------|------------------|\r\n| 当前版本 | 是 |\r\n\r\n如使用版本支持 Autolink 且工程已接入，可跳过手动配置。\r\n\r\n<details>\r\n<summary>Manual Link 配置</summary>\r\n\r\n> **说明**：本模块需要同时在 C++ 侧和 ETS 侧注册 Package。\r\n\r\n### 1. Overrides RN SDK\r\n\r\n在工程根目录 `oh-package.json5` 添加：\r\n\r\n```json\r\n{\r\n  \"overrides\": {\r\n    \"@rnoh/react-native-openharmony\": \"./react_native_openharmony\"\r\n  }\r\n}\r\n```\r\n\r\n### 2. 引入原生端依赖\r\n\r\n打开 `entry/oh-package.json5`，添加：\r\n\r\n```json\r\n\"dependencies\": {\r\n  \"@bingtang-rn/react-native-ssl-public-key-pinning\": \"file:../../node_modules/@bingtang-rn/react-native-ssl-public-key-pinning/harmony/ssl_public_key_pinning.har\"\r\n}\r\n```\r\n\r\n执行 `ohpm install`。\r\n\r\n### 3. 配置 CMakeLists\r\n\r\n打开 `entry/src/main/cpp/CMakeLists.txt`，添加：\r\n\r\n```cmake\r\nset(OH_MODULES \"${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules\")\r\n\r\nadd_subdirectory(\"${OH_MODULES}/@bingtang-rn/react-native-ssl-public-key-pinning/src/main/cpp\" ./ssl_public_key_pinning)\r\n\r\ntarget_link_libraries(rnoh_app PUBLIC ssl_public_key_pinning)\r\n```\r\n\r\n### 4. 注册 Package（C++ 侧）\r\n\r\n打开 `entry/src/main/cpp/PackageProvider.cpp`，添加：\r\n\r\n```cpp\r\n#include \"SslPublicKeyPinningPackage.h\"\r\n\r\nstd::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {\r\n    return {\r\n        std::make_shared<SslPublicKeyPinningPackage>(ctx),\r\n    };\r\n}\r\n```\r\n\r\n### 5. 注册 Package（ETS 侧）\r\n\r\n打开 `entry/src/main/ets/RNPackagesFactory.ets`，添加：\r\n\r\n```typescript\r\nimport { SslPublicKeyPinningPackage } from '@bingtang-rn/react-native-ssl-public-key-pinning/ts';\r\n\r\nexport function createRNPackages(ctx: RNPackageContext): RNPackage[] {\r\n  return [\r\n    new SslPublicKeyPinningPackage(ctx),\r\n  ];\r\n}\r\n```\r\n\r\n</details>\r\n\r\n## 属性 / API\r\n\r\n| API | 描述 | 参数 | 返回值 | HarmonyOS 支持 |\r\n|-----|------|------|--------|----------------|\r\n| isSslPinningAvailable() | 检查 SSL Pinning 模块是否可用 | 无 | boolean | ✅ 完全支持 |\r\n| initializeSslPinning(options) | 初始化并启用 SSL 公钥绑定 | options: `PinningOptions` | `Promise<void>` | ✅ 完全支持 |\r\n| disableSslPinning() | 禁用 SSL 公钥绑定 | 无 | `Promise<void>` | ✅ 完全支持 |\r\n| addSslPinningErrorListener(callback) | 订阅 pinning 失败事件 | callback: `(error: PinningError) => void` | `EmitterSubscription` | ✅ 完全支持 |\r\n\r\n### 平台差异\r\n- iOS TrustKit 强制每个 pinned domain 至少 2 个 pin，HarmonyOS 无此原生限制（与 Android 一致），单 pin 也可用\r\n- pinning 失败识别：Android 用 `SSLPeerUnverifiedException` + message 含 \"Certificate pinning failure\"，iOS 用 `TSKTrustEvaluationFailedNoMatchingPin`；HarmonyOS 用 `@ohos.net.http` 错误码 2300060 / 2300058 / 2300077 识别 SSL 证书校验失败并发送 `pinning-error` 事件\r\n\r\n### 使用限制\r\n- 需 HarmonyOS API17+（`HttpRequestOptions.certificatePinning` 自 API 12 起支持）\r\n- 需在宿主 `EntryAbility.onCreateDefaultHttpClient` 注入 `SslPinningHttpClient`，否则 pinning 配置虽写入全局状态但不生效\r\n- `pin` 格式为 base64 编码的 SHA-256 SPKI 哈希（与原库一致，无需 `sha256/` 前缀，`hashAlgorithm` 字段已指定算法）\r\n\r\n## 快速验证（运行 Example）\r\n\r\n### 前置条件\r\n\r\n| 依赖 | 版本要求 |\r\n|------|----------|\r\n| Node.js | >= 18 |\r\n| DevEco Studio | 5.0+ / 6.0+ |\r\n| HarmonyOS SDK | API 17+ |\r\n\r\n### 运行步骤\r\n\r\n**1. 克隆仓库**\r\n\r\n```bash\r\ngit clone <仓库地址>\r\ncd <仓库目录>\r\n```\r\n\r\n**2. 安装依赖并构建**\r\n\r\n```bash\r\nnpm install --legacy-peer-deps\r\nnpm pack           # 生成 tgz 包（会自动触发 prepare 构建 JS 产物）\r\n```\r\n\r\n**3. 进入 example 目录，安装依赖**\r\n\r\n```bash\r\ncd example\r\nnpm install --legacy-peer-deps\r\n```\r\n\r\n**4. 生成 JS Bundle**\r\n\r\n```bash\r\nnpm run dev\r\n```\r\n\r\n产物：`harmony/entry/src/main/resources/rawfile/bundle.harmony.js`\r\n\r\n**5. 用 DevEco Studio 打开鸿蒙工程**\r\n\r\n- 打开 DevEco Studio\r\n- 选择 `example/harmony` 目录\r\n- 等待 Sync 完成\r\n\r\n**6. 编译并运行 HAP**\r\n\r\n在 DevEco Studio 中点击运行按钮，将 HAP 安装到设备/模拟器。\r\n\r\n> **注意**：Example 中已预置插件依赖和 Package 注册，无需手动配置 Link。\r\n\r\n## 约束与限制\r\n\r\n### 兼容性\r\n\r\n- RNOH: 0.72+\r\n- HarmonyOS SDK: API 17+\r\n- DevEco Studio: 5.0+\r\n\r\n## 遗留问题\r\n\r\n无（或列出已知问题）\r\n\r\n## 开源协议\r\n\r\n本项目基于 [MIT License](https://github.com/frw/react-native-ssl-public-key-pinning/blob/main/LICENSE)，详见 [LICENSE](./LICENSE) 文件。\r\n","readmeFilename":"README.md"}