Android 使用https 协议请求客户端
server端操作
-
自己创建 CA 证书
-
拿自建CA 证书创建 server 端证书
-
创建 https 服务
Android客户端操作
-
创建项目并引入相关依赖
-
生成 Android端 keystore
-
MainActivity.java & 布局文件 activity_main.xml
-
修改 Android 模拟器的 hosts 文件
-
Android 端发送HTTPS 请求进行验证
本文 Android 端 DEMO案例 下载
https://github.com/Jxyxl259/android-https_demo/tree/master/app
Volley 官方git地址(需要vans——"off the wall")
https://android.googlesource.com/platform/frameworks/volley
参考链接:
写在开头:
最近在自学Android ,记得17年 也就是H5火起来的时候,听说很多培训机构都不再开设Android培训班了,因为没钱赚,培训出来的学生也不好找工作,弄不好还砸了自己培训班的口碑。
随后再想入门安卓的人,只有自学这一条路。这就导致一个现象, 安卓开发人员两级分化太严重,要么就是搞了三五年甚至年限更久经验丰富的developer,要么就是刚入行没人带,只能自己一点点踩坑积累经验的菜鸡。
而且网上能找到的 Android的自学资料简直太少太老,也可能是我比较懒,找到一份资料就开始看,懒得再去找其他资料。
BUT!
Android 的项目目录结构是真花哨(相比java 而言)而且还用的gradle 编译项目,无奈之下 把gradle 也学了一遍,在此由衷的感谢 runoob.com
AND!
Android 的各个SDK 版本之间的差别大了去了,做版本兼容什么的着实叫人头大
正题:
server端操作
-
自己创建 CA 证书(这里以 nodejs 搭建 https 服务为例)
openssl genrsa -des3 -out ica.key 1024
openssl req -new -key ica.key -out ssl.csr
sudo openssl x509 -req -in ssl.csr -extensions v3_ca -signkey ica.key -out ica.crt

-
拿自建CA 证书创建 server 端证书
openssl genrsa -out server.key 1028
openssl req -new -key server.key -out server.csr
生成server端 根证书,在 myCA 目录下编辑一个 opsnssl.cnf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
countryName = CN
countryName_default = CN
stateOrProvinceName = BJ
stateOrProvinceName_default = BJ
localityName = Beijing
localityName_default = Beijing
organizationalUnitName = 组织名称(随便填)
organizationalUnitName_default = 默认组织名称(随便填)
commonName = helloworld.com
commonName_max = 64
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
#注意这个IP.1的设置,IP地址需要和你的服务器的监听地址一样 DNS为server网址,可设置多个ip和dns
IP.1 = 0.0.0.0
DNS.1 = helloworld.com
生成server端证书
openssl x509 -days 365 -req -in server.csr -extensions v3_req -CAkey ica.key -CA ica.crt -CAcreateserial -out server.crt -extfile openssl.cnf
-
创建 https 服务(nodejs ,有javaScript基础的可以去 runoob.com 自学, 没有基础的先学 javaScript)
// server.js server 端启动入口
// 使用nodejs自带的http、https、express、 fs、path 、url模块
const https = require('https');
const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
//根据项目的路径导入生成的证书文件
const privateKey = fs.readFileSync(path.join(__dirname, './server.key'), 'utf8');
const certificate = fs.readFileSync(path.join(__dirname, './server.crt'), 'utf8');
const credentials = {key: privateKey, cert: certificate};
//创建http与HTTPS服务器
const httpServer = http.createServer(function(req, res){
var pathname = url.parse(req.url).pathname;
console.log("Request for http " + pathname + " received.");
// ... 处理请求
res.write('http request received');
res.end();
});
const httpsServer = https.createServer(credentials, function(req, res){
var pathname = url.parse(req.url).pathname;
console.log("Request for https" + pathname + " received.");
// 请求处理
res.write('https request received');
res.end();
});
//可以分别设置http、https的访问端口号
const PORT = 8087;
const SSLPORT = 8088;
//创建http服务器
httpServer.listen(PORT, function() {
console.log('HTTP Server is running on: http://localhost:%s', PORT);
});
//创建https服务器
httpsServer.listen(SSLPORT, function() {
console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});