一、场景

由于需求和安全的考虑,需要将上一篇文档,使用NanoHttpd搭建的http server改成https的协议,但由于我们测试没办法正式的CA机构颁发的数字证书,所以就使用自签名的方式来验证https server。

由于查看源码得知,NanoHttpd是支持Https的,Support for HTTPS (SSL)

二、Https协议相关的基础知识

HTTPS的基本工作原理想必对于许多开发者来说是非常熟悉的了,我们一起先回忆一下HTTP常见的八股文中的描述:

1.客户端(浏览器)访问 HTTPS 的URL;
2.服务器返回 HTTPS 使用的 CA 证书;
3.客户端(浏览器)验证 CA 证书是否为合法证书;
4.验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;
5.发送公钥加密后的随机数给服务器;
6.服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
7.服务器把要发送给浏览器的内容,使用随机数进行加密后传输给客户端(浏览器);
8.此时客户端(浏览器)可以使用随机数进行解密,获取到服务器的真实传输内容。

那么我们回到我们的主题里,首先需要知道CA证书是什么,CA是证书颁发机构(Certificate Authority)的缩写,那么CA证书就是证书机构颁发的一种数字证书,为什么需要这个机构来颁发证书呢?可以理解为就是一个第三方担保机构,这个担保机构保证了在客户端和服务器的通讯阶段的安全,这样客户端只要是看到证书是这个担保机构担保过的,那就会认可这个服务器并和它进行后续交互,反之其他证书都是不合法的,不会进行更进一步的交互了。

其次,这个证书不光是用来证明其合法性,其中还包含了一个公钥,公钥是什么呢?这边就涉及到一些密码学相关知识点了,我们需要先知道非对称加密的一点概念,可以猜出来,有非对称加密那肯定有对称加密,对称加密就是使用同一把密钥进行加密和解密,而非对称加密会用到2个密钥,一把公钥和一把私钥进行加密和解密,公钥会公开出去给客户端,而私钥会保存在本地防止泄漏,所以会更安全,使用这个公钥加密后的数据可以被私钥解开,反过来也是一样的,在上面的HTTPS的连接过程中,1-6步骤所涉及到的就是非对称加解密过程,而后续则会采用对称加密的方式,即使用一个随机数充当了对称加密的密钥进行了通讯,这样一方面是为了提高通讯的效率更重要的是为了保证安全,因为如果还使用原有的公钥和私钥的方式在服务端使用私钥加密,那么只要有公钥的客户端都可以截获服务端发来的信息进行解密,显然这样是不行的。

知道了概念后,那自签证书的概念就是我们自己充当这个CA机构给自己颁发一个证书,然后想办法让客户端信任这个证书(一般的默认做法是系统会有一个受信任的证书列表,其中就会有存放一些CA机构的根证书),并且证书里面包含了我们的公钥,客户端使用这个公钥进行数据加密,再传输数据,服务端接收并用私钥解开,从而完成整个加解密的通讯过程。那接下来我们就来模拟这样一个通讯过程

三、自签名证书过程

使用KeyStore Explorer创建一个BKS-V1密钥库,并将其作为“keystore.bks”保存到android的raw文件夹。或者,您也可以使用以下代码来创建密钥库文件,然后只需使用密钥库资源管理器将其打开,并将其类型更改为 BKS-V1。

密钥库资源管理器 - 下载 (keystore-explorer.org)

windows打开cmd终端,粘贴下面这一段命令,其中的-storepass后面的值可以自己修改成自己的storepass。

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.bks -storepass myKeyStorePass -validity 360 -keysize 2048 -ext SAN=DNS:localhost,IP:127.0.0.1  -validity 9999

上面的命令应该不难理解,就是你给密钥文件设置的生成位置,key aliaskey passwordkey store、validity ,回车后,需要继续按照提示输入相关信息,依次填写好信息后,输入 Y 确认信息即可。上面一行的storepass为myKeyStorePass,别名为selfsigned,有效期为360天,keystore.bks保存在了C盘的当前用户目录(C:\Users\sunbinkang)。

然后用上面安装好的密钥库资源管理器KeyStore Explorer去找到这个keystore.bks文件打开,打开的时候输入上面的storepass密码就行(ps:我被这里坑了好久,记住要输入storepass的这个密码,不是keypass的密码),打开后,找到Tools--->change KeyStore Type--->BKS-V1保存就行。

四、Android项目中使用自签名证书

将上一步中生成的keystore.bks做了type转换后,将文件放入到项目的main->res->raw目录下,如果没这个文件夹,新建一个就行;

在HttpServer.kt的文件中的次构造中加入如下代码:

    //服务器信任的客户端证书constructor(context: Context, hostname: String?, port: Int) : this(hostname, port) {//从文件中拿到流对象val keystoreStream: InputStream =context.resources.openRawResource(R.raw.keystore)//拿到keystore对象val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())//keystore加载流对象,并把storepass参数传入keyStore.load(keystoreStream, "myKeyStorePass".toCharArray())val keyManagerFactory =KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())//这里的第二个参数就是密钥密码,keypasskeyManagerFactory.init(keyStore, "*******".toCharArray())//调用 NanoHttpd的makeSecure()方法makeSecure(makeSSLSocketFactory(keyStore, keyManagerFactory), null)}

五、postman或者浏览器发起https请求验证

第一张图是因为自签名的原因,需要用户自己手动信任证书。图二为发起的https的get 请求,请求成功。

至此,我们在Nanohttpd的httpserver的基础上做了支持https协议。

最后附上mainactivity的代码。

class MainActivity : AppCompatActivity() {var mHttpServer: HttpServer? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)mHttpServer = HttpServer(MainActivity@ this, HTTP_IP, HTTP_PORT)//三种启动方式都行
//        mHttpServer.start()
//        mHttpServer.start(NanoHTTPD.SOCKET_READ_TIMEOUT)mHttpServer?.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false)}override fun onDestroy() {super.onDestroy()mHttpServer?.stop()//停止}
}

项目代码地址:GitHub - sunbinkang/NanoHttpdDemo: android app 使用nanohttpd搭建http server,并且支持https协议

需要注意的是,项目中的raw文件需要你自己生成证书,因为证书是有密码的,我自己证书的密码在代码中用******标记了,所以拿到我的keystore.bks也没用。所以要想跑起来就得自己生成了。具体生成看步骤,有不懂的提问找我。

Android使用NanoHttpd在app内搭建https server(二)相关推荐

  1. 在内部局域网内搭建HTTPs

    在内部局域网内搭建HTTPs 配置环境 Windows版本:Windows Server 2008 R2 Standard Service Pack 1 系统类型:       64 位操作系统 内存 ...

  2. android搭建https,android 搭建https Server(示例代码)

    在android上采用http协议的服务器,需求有点奇葩,非要用https更是醉了.这里只要求单向https认证,不要双向认证. 本文采用的开源框架Nanohttpd( https://github. ...

  3. mtk android apk lib,Android MTK 拷贝第三方App 内置apk文件到系统目录

    MTK 的第三方App文件或者so库,都存在在Vendor目录下面 vendor\retch\thirdapp 我们要实现App 的拷贝,可以在pacakage\apps 下面去新建一个文件夹Retc ...

  4. android webview 百度地图,APP内的网页怎么调起地图导航服务

    高德地图和百度地图可以用scheme调起地图,具体可参考API,里面讲的很清楚,配置好相应的Schema之后根据例子使用就好了. 百度:http://lbsyun.baidu.com/index... ...

  5. 使用nodejs搭建HTTPS server

    From 我的简书 第一步:创建一个项目目录,npm init初始化项目后,安装express. npm install express --save 第二步:新建http.js文件,初始代码如下. ...

  6. 友盟开放日: 通过 App 内社区提高留存率的 6 个技巧

    很多开发者都有这样的疑问:应用内社区究竟能够将 App 的用户留存率提升多少? 在日前友盟开放日深圳站中,友盟微社区产品负责人陆义元给出了答案:通过有效的社区运营能够将次日留存提升最少 5%,最高达到 ...

  7. 基于Android平台的记事本软件(Android Studio项目+报告+app文件)

    移动应用开发技术 期末考核报告 题   目:        基于Android平台的记事本软件             学生姓名     学生学号                           ...

  8. 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)

    使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 传送门 转载于:https://www.cnblogs.com/momozjm/p/9389912.html

  9. App工程结构搭建:几种常见Android代码架构分析

    原文:http://mobile.51cto.com/abased-386212.htm 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优 ...

  10. Android app内语言环境切换

    逻辑很简单: 1  app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创 ...

最新文章

  1. wxWidgets:wxAuiManagerEvent类用法
  2. vs2013+EF6+Mysql
  3. socket异步处理问题
  4. lib和dll的区别
  5. 模拟太阳系的html,纯HTML5制作的震撼太阳系网页
  6. 这个严重的无补丁 UPnP 漏洞影响几乎所有的IoT设备:绕过安全系统、扫描LANs
  7. 神经网络 测试集loss不下降_代码实践 | 全连接神经网络回归---房价预测
  8. wifi6无线网卡驱动linux,Centos6.5 WIFI无线网卡驱动BCM43142驱动安装
  9. 火狐浏览器安全连接失败解决办法
  10. Qt小项目(二):调色器
  11. 测相伪距观测方程、线性组合
  12. 简单实现redis实现高并发下的抢购/秒杀功能
  13. ubuntu下重装WIN7
  14. endnote文件enl突然没了_科学网—实际操作中的Endnote库文件损坏修复方法 - 尹卓忻的博文...
  15. c++虚函数实现原理
  16. h5物体拖动_【点我解锁】11种网易爆款H5交互手势及案例
  17. ecshop2.7.3+windows10(64bit)+phpstudy2018(php5.4.45+apache+mysql)
  18. n1 盒子安装armbian 5.6
  19. 英雄杀-如何通关挑战
  20. 如何用linux指令集,linux – 如何知道我是否可以使用FMA指令集进行编译?

热门文章

  1. 深度学习之torch(一)MINIST手写字符分类
  2. Ardunio开发实例-光敏电阻光线强度检测
  3. 《Java 面经手册》PDF,全书5章29节,417页11.5万字,完稿发版!
  4. IDEA使用maven命令打包
  5. PHP TCPDF导出订单合同并且每页加一个印章
  6. 随机森林算法的扩展-深度森林(deep forest)
  7. java jdk9_jdk9下载-jdk9下载9.0.4 官方最新版-西西软件下载
  8. Unity 屏幕坐标转UI坐标
  9. Sketch 51 for Mac(矢量绘图软件)汉化激活版
  10. php base64原理