使用 Android Native、Android Studio 和改造在本地网络中信任我自己的自签名证书

2024-03-08

我正在创建一个简单的 Android 应用程序,将在封闭的本地网络中使用。在此本地网络中,正在运行 Flask 服务器,该服务器配置为通过 nginx 代理使用自签名证书。服务器的后端应用程序使用自签名证书可以正常工作,我已经使用浏览器和邮递员验证了这一点。 (显然,我必须明确要求浏览器信任我的证书)。

几天来,我一直试图在网上找到一些关于如何让我的 Android 应用程序接受我的证书的明确答案,但我尝试过的所有事情都让我走进了死胡同。有时这些解决方案已被弃用,有时又对于这样一件微不足道的事情来说太复杂了。

http请求是使用Retrofit发送的;据我了解,我必须以某种方式配置改造实例的 http 客户端以接受我的证书。

我已经设法使用接受的客户端any证书,但这不是我想要的。理想情况下,我的证书将添加到官方 CA 默认信任的证书“集”中,以便应用程序也可以向外部资源发送请求。

因此,考虑到后端应用程序正在运行,例如192.168.1.10:443,我该怎么办?

注意:我已阅读此处给出的说明https://developer.android.com/training/articles/security-config.html#TrustingAdditionalCas https://developer.android.com/training/articles/security-config.html#TrustingAdditionalCas并添加了

android:networkSecurityConfig="@xml/network_security_config"

到我的清单文件,但我收到以下错误:

Hostname 192.168.1.10 not verified: certificate sha256/...../.....并继续列出证书的信息,如通用名称等。


Shlomi Katriel 的答案是我已经尝试过的,但它间接引导我找到了解决方案。请记住,我能够解决这个问题的唯一原因是因为我拥有服务器的 root 访问权限,并且可以随心所欲地使用它。

This https://stackoverflow.com/a/61809513/5763896答案基本上就是解决整个问题的关键。我将发布所有步骤,以防其他人需要。

Step 1创建您的自签名证书。就我而言,我使用了 openssl 实用程序。包含 -addext 标志非常重要。这是直接取自我上面链接的答案的示例:

openssl req \
-newkey rsa:2048 \
-nodes \
-x509 \
-days 36500 -nodes \
-addext "subjectAltName = IP.1:1.2.3.4" \
-keyout /etc/ssl/private/nginx-selfsigned2.key \
-out /etc/ssl/certs/nginx-selfsigned2.crt

将 1.2.3.4 替换为您服务器的本地 ip。这将在证书的 subjectAltName 属性中包含服务器的本地 IP。如果没有这个,您将不断收到错误“主机名...未验证...”

在正在运行的 nginx 实例中使用证书是一个不同的主题,可以轻松完成,并且在线有大量资源。

Step 2打开 android studio 并在下面创建一个新的 android 资源目录(如果您还没有)res named raw。在此目录中,复制上述命令生成的 .crt 文件的内容。

Step 3下创建一个android资源目录res named xml。在那里,创建一个新的 xml 文件,在我的例子中我称之为network_security_config.xml。我在那里插入了以下内容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="@raw/certificate"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

使用您在步骤 2 中复制的证书文件的文件名,而不是“证书”。

Step 4 Add android:networkSecurityConfig="@xml/network_security_config"到 AndroidManifest.xml 中的应用程序元素

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Android Native、Android Studio 和改造在本地网络中信任我自己的自签名证书 的相关文章

  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • 如何访问 Android 心率传感器原始数据? (反射光,不是心跳)

    心率传感器上的 android sdk 仅返回计算出的 bpm 我对此不感兴趣 我需要访问 Android 心率传感器原始数据 例如就反射值的强度而言将会很大 因为心率传感器基本上使用 LED 并测量随时间变化的反射率 如果可能 访问由任何
  • 在工具栏下显示内容

    您好 我试图简单地将我的内容放在工具栏下方 但是当我运行我的应用程序时 某些内容本应位于工具栏下方 却隐藏在工具栏后面 我已经阅读了有关使用框架布局来尝试将其分离的内容 但我有点卡住了 我目前正在使用该软件提供的基本 android stu
  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 使用同一个侦听器的多个活动

    我有 4 个活动 它们都包含一个 xml 页脚 其中包含 4 个按钮 每个活动一个 我现在想为这些按钮设置 onclicklistener 它是页脚中的自制菜单 问题是 如何使用侦听器以便重用代码 我有两个想法 创建一个实现 onclick
  • 为什么不能在 Fragment 中使用 ViewPager?它实际上是

    有信息无法使用ViewPager在一个Fragment在许多来源中 例如 Android 开发者繁忙编码指南 http commonsware com 作者 Mark Murphy 或者类似的帖子this https stackoverfl
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 虚拟回调接口

    在 Eclipse 为您创建的来自 Google 的示例主从流代码中 片段中包含以下内容 private Callbacks mCallbacks sDummyCallbacks public interface Callbacks pub
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 无法在 Android Studio 中导出签名的 APK

    当我使用keytool list keystore path to keyfile jks并提供我的密码 我可以看到那里的条目 但是当我在尝试使用相同的密码生成签名的 APK 时使用相同的密码时 我收到错误 无法加载密钥库 密钥库被篡改 或
  • 如何使用 RecyclerView 创建此布局?

    我正在尝试使用这种类型的布局创建回收器视图 这些项目是字符串 可以以不同的大小出现 我不知道每行中有多少项目 我可以使用 StaggeredGridLayoutManager 来做到这一点吗 该图像只是一个假示例 每行可以有更多项目 您可能
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • 我在 android studio 中使用 kotlin 时出现错误

    为什么会出现这个错误 09 12 16 36 31 502 1886 1886 com getloction nourmedhat smartgate getlocation E AndroidRuntime 致命异常 main 进程 co
  • Android 的 Intent 和 Parcelable 对象

    为什么我需要打包我的对象 即使我只需将其发送到同一任务的另一个线程 实际上 我需要打开一个甚至可以在同一线程 主线程 上运行的活动 换句话说 为什么 Google 不提供一个 startActivity 版本 它采用通用对象广告参数而不是捆
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • onPrepareOptionsMenu 复制 ActionBar 中的项目

    当我使用 onPrepareOptionsMenu 添加菜单项时 该菜单项会在操作栏中复制其自身 我正在使用片段并在主要活动的 ActionBar 中创建初始菜单 如下所示 Override public boolean onCreateO
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 动态更改按钮上的图像视图

    在我的应用程序中 我有按钮和ImageView 当我按下按钮时我想改变ImageView 我的可绘制文件夹中有 5 张图像 按下按钮时 ImageView 根据按钮单击一张一张地更改图像 我想要它的解决方案 感谢任何可以提供帮助的人 维护一

随机推荐

  • 更改Android自定义SurfaceView的大小

    我正在尝试为 Android 应用程序创建 2D 游戏引擎 我已经关注了本教程 http www droidnova com 2d tutorial series part ii 772 html 这对于创建全屏显示效果很好 但我不想要这样
  • servicestack ormlite 中的分页

    我正在寻找一种在 ormlite 中实现分页的好方法 我发现了另一种question https stackoverflow com questions 15705419 passing params expression results
  • 从 Intent.createChooser 获取选择的应用程序

    我正在尝试捕捉结果Intent createChooser了解用户选择共享哪个应用程序 我知道有很多与此相关的帖子 如何知道用户在使用意图选择器时选择了哪个应用程序 https stackoverflow com questions 106
  • Filemaker GetAs...如何在网页上显示容器字段?

    我有一个 ASP Net 应用程序 需要显示存储在 Filemaker 容器字段中的图像 我的查询语句如下所示 SELECT GetAs Image JPG FROM UA Item Pictures WHERE Stock Number
  • PyGame Space Invaders 游戏 - 让外星人一起移动

    我已经使用 PyGame 模块在 Python 中创建了一个 Space Invaders 克隆 但是当它们到达游戏屏幕边缘时 让它们一起向下移动时遇到了一些困难 当外星人到达游戏屏幕边缘时 我该如何做到这一点 他们都同时改变方向并下降一个
  • 多对一,全部删除孤儿,将属性设置为 null 但实体未删除

    使用 NHibernate v3 0 我有一个与此类似的课程 class Foo bool barActive Bar bar Bar 实例完全由 Foo 内部管理 当 barActive 为 true 时 bar 被设置为 Bar 实例
  • makePrimss 的用例和示例

    我不清楚 makeLense 和 makePrisms 之间的区别 我知道当我们想要访问嵌套结构 数据时 请像这样使用 makeLense data Point Point x Int y Int data Test Test name S
  • 螺纹扭曲...如何正确使用它们?

    我需要编写一个运行两个线程的简单应用程序 线程 1 按定时运行 假设每 1 分钟运行一次 线程 2 只是一个执行 操作 的 正常 while True 循环 如果不是按定时间隔运行的要求 我根本不会考虑扭曲 但简单的 sleep 60 还不
  • ImageIO 对原始图像的支持 (jrawio)

    我一直在寻找原始图像支持 并找到了这个库 jrawio 1 6 1 它扩展了 imageio 以添加原始支持 它似乎有效 但速度非常慢 我见过跑得更快的蜗牛 我的代码在几秒钟内处理 Jpeg 而处理一个不太大的 cr2 文件或 nef 则需
  • 如何使用 UIButtonBarItem 触发方法?

    我有一个带有工具栏的 xib 上面有 2 个按钮 全部用 IB 制作 我可以将插座连接到按钮 但是当我单击它们时 该方法不会被触发 这是为什么 在我的头文件中我有这个 property nonatomic retain IBOutlet U
  • WinExec 和 ShellExecute 之间有哪些区别?

    我需要执行另一个应用程序 我想知道我是否应该使用WinExec代替ShellExecute或相反亦然 两种方法有哪些区别 有应该优先选择的吗 WinExec长期以来已被弃用 仅出于向后兼容性的原因而保留 它用于启动可执行文件 不要使用它 因
  • 使用ajax调用php并返回多个变量?

    我正在尝试使用 javascript 调用 php 脚本 然后该脚本会将多个变量返回给我的 javascript 以便我可以操作它们 这是我的JS ajax url test php data id lastFileId success f
  • 使用 escaped_list_separator 和 boost split

    我正在使用 boost 字符串库 刚刚发现 split 方法非常简单 string delimiters string str string with comma delimited tokens and delimiters inside
  • R将EXIF数据写入JPEG文件

    对于 R 我发现有机会只读取 EXIF 数据 R 中是否有可能将 EXIF 数据写入 JPEG 文件 感谢所有回复的人 结果 我得到了以下解决方案 Install ExifTool https sno phy queensu ca phil
  • 从查找表创建新变量

    我的数据集中有以下列 presult aresult I single I double I triple I home run SS strikeout 我想添加第三列 bases 它取决于列 areresult 中结果的值 例如 我希望
  • SASS 文件内链接的缓存清除图像

    我对 Laravel 5 0 相当陌生 但对 PHP 不太熟悉 我一直在使用 Elixir 来编译我的 SASS 从我的资源目录复制图像并通过mix version防止缓存的功能 然而 这对于 CSS 图像和 JavaScript 来说非常
  • 多字节字符是否会干扰正则表达式中的结束行字符?

    使用这个正则表达式 regex1 z 以下字符串匹配 hello regex1 gt 5 regex1 gt 5 但使用这些正则表达式 regex2 z regex3 n z 他们表现出差异 hello regex2 gt 5 hello
  • 用例之间的 UML 关系(扩展/包含)

    我不太理解以下主题 因为它与我读到的内容有点含糊 Inlcude就像对下一部分的引用一样 没有它 用例就不完整 这部分应该从更多地方引用 否则它的使用没有意义 但我见过一个例子 其中 include 仅在某些 IF 语句中为真 例如 添加新
  • 从 pandas dataframe 列更新 sqlalchemy orm 列的正确方法是什么

    我已经加载了一些数据并修改了数据框中的一列 并且想要更新数据库以反映更改 I tried db session query sqlTableName update sqlTableName sql col name pdDataframe
  • 使用 Android Native、Android Studio 和改造在本地网络中信任我自己的自签名证书

    我正在创建一个简单的 Android 应用程序 将在封闭的本地网络中使用 在此本地网络中 正在运行 Flask 服务器 该服务器配置为通过 nginx 代理使用自签名证书 服务器的后端应用程序使用自签名证书可以正常工作 我已经使用浏览器和邮