流程很简单
1.生成自签名的ssl证书, 一般后缀为.crt
2.将证书部署到服务器,例如可以使用该证书配置nginx监听https请求,再通过nginx将https请求转发到实际的http服务器
3.客户端发起https请求时,附带上证书。
1.生成自签名证书
首先openssl生成自签名的根证书命令为

执行生成证书请求的命令
openssl req -new -key server.key -out server.csr
时会要求输入相关信息,在Common Name这一步要注意输入正确的域名,由于我连接的服务器没有域名所以我实际输入了ip。

客户端发出https请求后,得到服务器下发的ssl证书,客户端需要验证证书是否由期望的服务器下发的。这时就会用到Common Name来验证下发证书的域名是否和客户端请求的域名一致,如果不一致说明证书不是所请求的服务器下发的,有可能是中间人攻击时发送给客户端的假证书。
纠结我好久的问题就在于Common Name上,原本以为填ip地址也行,但是android端一直报错
google了好多资料后发现,根据规范http://tools.ietf.org/html/rfc2818#section-3.1

cn字段为ip时是通不过验证的,这点大家可以看下android sdk源码DefaultHostnameVerifier验证:
这时候生成证书时要求指定证书的subjectAltName,通过subjectAltName附带上服务器ip地址以完成验证。
所以我们修改生成证书的配置文件openssl.cnf, 加上段

最后将生成证书的命令相应修改为使用自定义的扩展:
2.将证书部署到服务器
以nginx为例,配置nginx处理https连接请求,再将https请求转发到实际的http服务器
3.客户端发起https请求时,附带上证书
以XmlHttpRequest为例,在构造函数里加上一句:
最后,来看下安卓端的请求,拿到了服务器证书中的subjectAltName值,请求也已经成功发送出去了
关于证书crt文件,可以放到项目根目录,然后修改project.android-studio/app目录下的build.gradle,加上一句,这样打包的时候就能将crt文件放到assets目录
而安卓端HttpClient-android.cpp实际上会调用cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2dxHttpURLConnection.java将证书文件传入,相关代码为





