生成和安装SSL证书

时间:2016-06-05 10:50:48

标签: android ssl https android-emulator

当我成功将自定义SSL证书添加到Android 6模拟器(我对system.img文件进行持久更改)时,我觉得我破解了原子。但浏览器无法以任何方式识别它。 我跟着这个很棒的tutorial,我觉得我在散列方面做错了。以下是我所做的全部步骤,以及到目前为止所做的工作。

我的系统

Windows 10,64 BIT
预建模拟器

  • 名称:Nexus_64
  • API:23
  • 目标:Android 6(Android API)
  • CPU / ABI x86 / 64
  • 磁盘大小3 GB

高级模拟器设置

  • RAM:512 MB
  • VM堆:128 MB
  • 内部存储2 GB (从右下角选择)
  • SD卡:Studio管理的2 GB

系统文件

  • 从教程中获取证书文件:890c6016.0
  • 创建用于在c:\device_tmp
  • 存储系统文件的空文件夹

实用程序:

    来自emulator
  • /android_sdk/tools/emulator.exe 来自adb
  • /android_sdk/platform-tools/adb.exe

我做了什么

启动模拟器:

 emulator -avd Nexus_64 -no-snapshot-load

现在它启动,我打开命令行窗口

找到外部存储的名称,因为sdcard没有足够的存储空间用于图像文件。

adb shell df 

在我的情况下,/storage/13E4-1F02/获得了2GB空间

安装证书

adb shell "rm /sdcard/"
adb push 890c6016.0 /sdcard/
adb shell "mount -o remount,rw /system"
adb shell "cp /sdcard/890c6016.0 /system/etc/security/cacerts/"
adb shell "chmod 644 /system/etc/security/cacerts/890c6016.0"
adb shell "dd if=/dev/block/vda of=/storage/13E4-1F02/system.img"
adb pull /storage/13E4-1F02/system.img c:/device_tmp

每个最后一行大约需要5分钟。之后,我通过关闭所有shell窗口并从system.img文件

启动它来终止设备
emulator -http-proxy my.ip:8888 -system c:/device_tmp/system.img

当设备启动时,它的系统中有该证书。

构建证书文件

这是我构建证书文件的方式。我使用Charles openssl ,因此我从 help-> SSL-Proxing->导出Charles根证书下载了Charles证书:{{1} }。

制作crt

go.p12

制作PEM

openssl pkcs12 -in go.p12 -clcerts -nokeys -out go.crt 

获取用作扩展名为.0的文件名的哈希码

openssl pkcs12 -in go.p12 -out go.pem

复制openssl x509 -inform PEM -subject_hash_old -in go.crt 并将其名称更改为我们刚刚获得的哈希值(890c6016.0)

go.crt

*类型 cat (Mac)的Windows命令

将所有签名信息附加到文件

type go.crt > 890c6016.0

完成!

证书结果890c6016.0

以下是结果证书的内容: 890c6016.0 它也是你跑步时会得到的:
openssl x509 -inform PEM -text -fingerprint -in go.crt -out /dev/null >> 890c6016.0

890c6016.0:

openssl x509 -in 890c6016.0 -text -noout

我的问题

当我从模拟器运行默认的android浏览器时,它表示在运行我的应用程序时它无法信任SSL和类似的问题。这表示代理正在运行,但我建立的证书不被接受。我还检查了文件系统以确保。它在那里!
那我在这里想念什么?

修改

我在Genymotion模拟器上测试了这种方法,并且它可以工作!!! 为什么Android模拟器会有所不同?

1 个答案:

答案 0 :(得分:0)

因此,您拥有的证书是自签名证书,即证书的问题颁发具有相同的值。客户端应该抛出它不信任证书的错误,因为在这种情况下它不知道发行者。我不知道为什么它适用于Genymotion。 :)

我建议您参考:https://android.stackexchange.com/questions/61540/self-signed-certificate-install-claims-success-but-android-acts-as-if-cert-isn