设为首页 收藏本站
查看: 279|回复: 0

[经验分享] android httpclient https 单向连接tomcat

[复制链接]

尚未签到

发表于 2017-1-27 10:06:27 | 显示全部楼层 |阅读模式
双向篇还未实现,先记录单向验证方式。?
一 Android直接连接tomcat?
这个实现比较简单,先建立一个工作目录为tomcat。打开命令行切换到该目录。如果是win7需要用管理员身份打开命令行。?

1 生成服务器端私钥(or 公钥?)?
keytool -genkey -alias tomcat -keyalg RSA -keystore server.keystore -validity 3600?
解释:keytool是jdk下的命令行工具。?
alias 随意指定,表示别名。keyalg表示加密算法为RSA,输出文件为server.keystore?
这里面需要输入密码(我们输入123456),另外注意“您的名字与姓氏是什么?”,这一项要输入tomcat所在主机的IP或域名,客户端访问tomcat时会涉及到这个地址。?

2 用server.keystore生成server.cer?
keytool -export -alias tomcat?-file server.cer -keystore server.keystore -storepass 123456?

解释:这个是浏览器可以识别的证书,用于导入浏览器。?
这个时候tomcat就可以启动ssl了,以tomcat6.0为例,在server.xml中拷入(或是更改)如下片段:?
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false" disableUploadTimeout="true" enableLookups="true" keystoreFile="D:/cer/tomcat/server.keystore" keystorePass="123456" maxSpareThreads="75" maxThreads="200" minSpareThreads="5" port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslProtocol="TLS"/>?
其中clientAuth="false" ,目前只搞定了单向验证。?

这时启动tomcat,打开IE,输入https://ip:8443/?会提示没有证书,但能点进去。?
我们可以双击刚才生成的server.cer,把它导入“受信任的根证书颁发机构”,就能看到浏览器上的小锁了。?

那我们的Android程序怎么来连接服务器呢,我们需要生成第三个文件server_trust.keystore:?
3 keytool -import -alias tomcat -file server.cer -keystore server_trust.keystore -storepass 123456 -storetype BKS -providername "BC"?
注意:这里的密码与前面保持一致。因为Android只支持BKS格式的,所以这里要指定类型。?
你执行到这里可能会出错,因为jdk下的keytool默认没有BKS的类库。?
我们需要下载bcprov-jdk15-135.jar及sunjce_provider.jar,放入jdk1.6.0_10\jre\lib\ext下面。同时要修改jdk1.6.0_10\jre\lib\security\java.security?
找到security.provider.1=sun.security.provider.Sun这行,这里有好几行,在最后一行加上security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider,我本来有9号,所以新一行的序号为10。?

我们把server_trust.keystore拷入Android程序的res/raw目录下。?
使用httpClient进行连接,示例代码如下:?
HttpClient hc = new DefaultHttpClient();?
initKey();?
String url = "https://10.1.32.33:8443/SSLTestServer/SSLServlet?action=login";?
Toast.makeText(SSLTestAndroidActivity.this, getData(url), 1).show();?

private void initKey() throws Exception {?
KeyStore trustStore = KeyStore.getInstance("BKS");?
trustStore.load(getBaseContext().getResources().openRawResource(R.raw.server_trust), "123456".toCharArray());?

SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);?
Scheme sch = new Scheme("https", socketFactory, 8443);?
hc.getConnectionManager().getSchemeRegistry().register(sch);?
}?

private String getData(String url) throws Exception {?
HttpUriRequest hr = new HttpGet(url);?
HttpResponse hres = hc.execute(hr);?
HttpEntity he = hres.getEntity();?
InputStream is = he.getContent();?
StringBuffer sb = new StringBuffer();?
byte[] bytes = new byte[1024];?
for (int len = 0; (len = is.read(bytes)) != -1;) {?
sb.append(new String(bytes, 0, len, "gb2312"));?
}?
return sb.toString();?
}?

对应的servlet中只是简单的response.getWriter().write("some char");?

至此Android连接tomcat进行单向ssl就大功告成了,只需要生成三个文件。





?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333978-1-1.html 上篇帖子: Maven实战-远程部署到Tomcat容器 下篇帖子: log4j在tomcat 和 工程中的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表