Android——自建CA证书,实现https请求

 

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】Volley的Https请求 

der pem cer crt key pfx等概念及区别

java证书以及证书管理

Android网络安全配置官方文档


写在开头:

最近在自学Android ,记得17年 也就是H5火起来的时候,听说很多培训机构都不再开设Android培训班了,因为没钱赚,培训出来的学生也不好找工作,弄不好还砸了自己培训班的口碑。

随后再想入门安卓的人,只有自学这一条路。这就导致一个现象, 安卓开发人员两级分化太严重,要么就是搞了三五年甚至年限更久经验丰富的developer,要么就是刚入行没人带,只能自己一点点踩坑积累经验的菜鸡。

而且网上能找到的 Android的自学资料简直太少太老,也可能是我比较懒,找到一份资料就开始看,懒得再去找其他资料。

BUT!

Android 的项目目录结构是真花哨(相比java 而言)而且还用的gradle 编译项目,无奈之下 把gradle 也学了一遍,在此由衷的感谢 runoob.com 

AND!

Android 的各个SDK 版本之间的差别大了去了,做版本兼容什么的着实叫人头大

正题:

server端操作

  • 自己创建 CA 证书(这里以 nodejs 搭建 https 服务为例)

在用户目录下创建 my_ca目录
~ ] $ mkdir myCA
进入my_ca 目录,依次执行下面指令(都有注释) 生成 CA 证书请求 最后的密码(change password) 以及 optional company name 可以不用填 直接回车跳过
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

 

Android——自建CA证书,实现https请求_第1张图片
  • 拿自建CA 证书创建 server 端证书

 

在用户目录下创建 myCA目录
~ ] $ mkdir myCA
进入myCA 目录,依次执行下面指令(都有注释) 生成 CA 证书请求 最后的密码(change password) 以及 optional company name 可以不用填 直接回车跳过
openssl genrsa -out server.key 1028
openssl req -new -key server.key -out server.csr

 

  Android——自建CA证书,实现https请求_第2张图片

          生成server端 根证书,在 myCA 目录下编辑一个 opsnssl.cnf

~/myCA ] $ vim 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 目录 ,并将刚刚生成的 server.key & server.crt 拷贝到 该目录下 
~ ] $ mkdir server && cd  server && cp ../myCA/server.key ../myCA/server.crt ~/server
server 目录下创建 server.js
// 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);
});
至此 服务端 就搭建好了 ,可以使用浏览器地址栏直接输 https://helloworld.com:8088 访问试试,(需要在本地配host  127.0.0.1 helloworld.com)
配置完 host 之后需要打开CMD 窗口 执行  ipconfig /flushdns 刷新DNS 

你可能感兴趣的:(Android,android,ssl,https,nodejs,ca证书)