`
anjxue
  • 浏览: 16898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android Tomcal SSL Https 单向篇

阅读更多
按网上的说明尝试了好久,转载请注明来源。

双向篇还未实现,先记录单向验证方式。
一 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就大功告成了,只需要生成三个文件。

下篇介绍Android通过Apache https转发到tomcat的配置。
1
0
分享到:
评论
5 楼 gys12321 2015-02-27  
请问楼主我再第三步生成server_trust.keystore的时候报错,错误如下:keytool 错误: java.security.NoSuchProviderException: no such provider: BC;请楼主帮忙解决哈
4 楼 branthf 2013-10-18  
楼主,有做好的 https ssl android客户端调用和解密代码,我现在正研究这个能发资料给我么 450370187@qq.com
3 楼 angelsmiling1108 2012-04-13  
请问楼主 Wrong version of key store.是怎么回事呢?我成功生成了BK类型的keystore文件

04-13 04:02:03.203: V/initKey exception(197): Wrong version of key store.

如下是我检验我的keystore文件结果
C:\WINDOWS>keytool -list -keystore "C:\YWJ\axs.bks" -provider org.bouncycastle.j
ce.provider.BouncyCastleProvider -providerpath "C:\YWJ\bcprov-jdk16-145.jar" -st
oretype BKS -storepass 123456

Keystore type: BKS
Keystore provider: BC

Your keystore contains 1 entry

axsCA, Apr 13, 2012, trustedCertEntry,
Certificate fingerprint (MD5): 60:13:24:F0:9A:E9:88:49:58:1B:37:C9:A1:90:57:24
2 楼 anjxue 2012-03-15  
yelwen000 写道
hc.getConnectionManager().getSchemeRegistry().register(sch);
请教下我的这句话怎么就报错了啊

是编译错误还是执行出错呢,编译错误可能是你的包不对
执行出错可能是你的证书路径不对
1 楼 yelwen000 2011-10-20  
hc.getConnectionManager().getSchemeRegistry().register(sch);
请教下我的这句话怎么就报错了啊

相关推荐

    IOS,Android SSL双向认证HTTPS方式请求及配置证书

    `IOS`和`Android`平台都支持使用`SSL`(Secure Sockets Layer)和其升级版`TLS`(Transport Layer Security)进行加密通信,尤其是对于`HTTPS`协议,它是HTTP与SSL/TLS的结合,确保了数据在网络中的传输安全。...

    android MQTT 带SSL加密连接例子demo

    在这个“android MQTT 带SSL加密连接例子demo”中,我们将探讨如何在Android应用中使用BKS(Bouncy Castle Key Store)加密文件来实现安全的MQTT连接。 首先,我们需要理解MQTT协议。MQTT是一种基于发布/订阅模式的...

    android 使用HttpsURLConnection方式的SSL双向认证

    在Android开发中,HTTPS协议是用于安全数据传输的标准,而SSL(Secure Sockets Layer)双向认证则进一步增强了安全性。此项目“android 使用HttpsURLConnection方式的SSL双向认证”着重讲解了如何在Android应用中...

    Android调用大宝CA国密SSL密码套件(0.99版本)访问HTTPS(国密SSL安全通道)的示例代码

    使用方法见:...1. Android使用HTTPCLIENT访问国密SSL协议的HTTPS服务 2. 示例代码为单向认证,可支持双向认证 3. 获取服务端的国密数字证书 4. 适用于Android 7.0(API 24)及以上

    libcurl for Android支持ssl

    本篇文章将深入探讨如何在Android环境下集成并使用libcurl,特别关注其对ssl的支持,以及如何通过cyassl进行编译。 首先,让我们了解libcurl与ssl的结合。SSL(Secure Socket Layer)和其更新版本TLS(Transport ...

    android ssl证书验证

    当客户端(如Android应用)与服务器建立HTTPS连接时,服务器会发送其SSL证书,客户端会验证这个证书的有效性。 在Android中,SSL证书验证主要涉及到以下几个方面: 1. **默认的信任管理器**:Android系统内置了一...

    Android双向SSL例子

    本示例将详细介绍如何在Android应用中实现双向SSL验证,即服务器和客户端都需要提供身份证明。下面我们将逐步解析这个"Android双向SSL例子"。 1. **理解SSL/TLS**: SSL/TLS的主要目标是提供隐私和数据完整性,通过...

    android+java ssldemo

    在Android平台上,SSL(Secure Sockets Layer)与TLS(Transport Layer Security)协议是用于实现安全网络通信的关键技术。本文将深入探讨"android+java ssldemo"中的核心知识点,包括SSL/TLS协议的工作原理、双向...

    Android SSL 安全访问HTTPS服务器案例

    本篇将深入探讨如何在Android应用中实现SSL安全访问HTTPS服务器。 首先,了解SSL/TLS的工作原理。它通过创建一个安全的加密通道,使得客户端(Android设备)和服务器之间进行的通信不会被中间人攻击或监听。SSL握手...

    Why Eve and Mallory Love Android:An Analysis of Android SSL(In) Security

    文章标题为:“Why Eve and Mallory Love Android:An Analysis of Android SSL(In)Security”,从标题我们可以看出,本文将重点分析Android操作系统中SSL/TLS协议安全性的潜在问题,以及这些安全漏洞为何受到攻击者...

    tomcat android 双向ssl通信

    4. **Android平台SSL支持**:在Android开发中,需要引入特定的jar包以支持SSL通信,并在Java安全配置文件中添加新的安全策略。这些配置确保了Android应用可以与使用SSL的Tomcat服务器进行通信。 5. **测试环境配置*...

    webphere中Https单向认证配置

    在IT领域,特别是企业级应用服务器的环境中,WebSphere作为一款知名的Java应用服务器,其HTTPS单向认证配置是一项关键的安全措施。本文将基于给定的文件信息,详细解析WebSphere中HTTPS单向认证配置的过程与原理,以...

    Android libcurl with ssl 预编译库

    在Android平台上,libcurl的使用需要特别关注与SSL(Secure Socket Layer)的整合,因为SSL是HTTPS安全连接的基础,确保了数据传输的加密和完整性。 预编译库的优点在于,开发者无需自己配置编译环境,避免了跨平台...

    android 7.0 SSLsocket

    这篇名为"SSLSOCKET demo 解决7.0认证失败"的博客文章详细介绍了在Android 7.0上处理SSL证书验证问题的方法。作者可能通过实例代码演示了如何正确配置和使用SSLSocket来避免或解决这类问题。 首先,了解SSL/TLS...

    android测试SSL笔记

    在Android开发中,尤其是涉及到网络通信的安全性时,SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议扮演着至关重要的角色。SSL/TLS主要用于加密传输数据,确保用户信息的安全,防止数据被窃取或...

    ssl_android.zip_TLS_android_android ssl_application_ssl/tls

    本篇文章将深入探讨Android应用程序如何利用SSL/TLS进行安全通信。 一、SSL/TLS协议基础 SSL/TLS协议的主要目的是为网络通信提供加密传输,防止数据在传输过程中被窃取或篡改。它包括两个主要阶段:握手阶段和记录...

    Android-SSl.zip_WebView_android_sentencevpr_sslpinning_todayrxi

    本资料包“Android-SSl.zip”显然是为了帮助开发者实施针对`WebView`的SSL(Secure Sockets Layer)安全策略,防止这种类型的攻击。 SSL Pinning,或者称为证书固定,是一种强化网络通信安全性的技术,特别是对于...

Global site tag (gtag.js) - Google Analytics