Android Tomcal SSL Https 单向篇
2011-09-26 20:46
344 查看
本文转载自:
http://anjxue.iteye.com/blog/1140275
按网上的说明尝试了好久,转载请注明来源。
双向篇还未实现,先记录单向验证方式。
一 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就大功告成了,只需要生成三个文件。
本文转载自:
http://anjxue.iteye.com/blog/1140275
http://anjxue.iteye.com/blog/1140275
按网上的说明尝试了好久,转载请注明来源。
双向篇还未实现,先记录单向验证方式。
一 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就大功告成了,只需要生成三个文件。
本文转载自:
http://anjxue.iteye.com/blog/1140275
相关文章推荐
- android 让webview支持https 双向认证(SSL)
- android环境搭建--解决SDK Manager更新SDK时的“https://dl-ssl.google.com refused”异常
- 【Android问题】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused”的问题
- Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常
- windows和linux下配置tomcat的https通信(ssl单向认证)
- Android or java https ssl exception
- 完美解决 Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml
- 解决 最近出现的 Failed to fetch URL https://dl-ssl.google.com/android/repository ...
- 解决mac无法更新android sdk报Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml错误
- Eclipse安装ADT Plugin时发生错误,提示连接不到 https://dl-ssl.google.com/android/eclipse/...的解决办法!
- 解决:Unable to connect to repository https://dl-ssl.google.com/android/eclipse/site.xml
- android sdk manager 不能连接到https://dl-ssl.google.com
- adt安装路径https://dl-ssl.google.com/android/eclipse/
- 解决:Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_li .
- [Android开发常见问题-18] Connection to https://dl-ssl.google.com refused
- https 单向认证和双向认证及tomcat配置及各种证书类型之间的转换,适用ios,Android,网页端
- Android中SDK安装出错Failed to fectch URl https://dl-ssl.google.com/android/repository/addons_list.xml
- 【Android问题】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused”的问题
- eclipse ADT在线安装 https://dl-ssl.google.com/android/eclipse无法访问