文档章节

Android上使用Https连接

CrazyManDF
 CrazyManDF
发布于 2015/12/24 16:17
字数 717
阅读 120
收藏 13

Android开发环境、tomcat

整体的步骤就是

1. 用keystore生成服务器端所用的密钥,用它配置服务器  

2.客户端导入其中的公钥,将其添加到信任的证书库中。

下面是具体的参考资料。

1.密码学基础(像我这样非科班出身的需要看一下,知其然还得知其所以然)
http://www.williamlong.info/archives/499.html

2.keytool使用与tomcat配置
英文好的朋友请直接看tomcat文档,SSL部分;
英文不好的朋友请寻找中文版文档,或者看这篇文章:
http://ln-ydc.iteye.com/blog/1330674

注意:具体的配置可能不一样,请找你的tomcat文档,SSL部分。


<!-- 不配置APR时 -->
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
			   keystoreFile="conf/cert/tomcat.keystore" keystorePass="password"
			   />




3.android配置
如果不需要验证服务器端证书,直接照这里做
http://elsila.blog.163.com/blog/static/17319715820101128832427/

如果需要验证服务器端证书(这样能够防钓鱼),我是这样做的,还有些问题问大牛:
    a. 导出公钥。在浏览器上用https访问tomcat,查看其证书,并另存为一个文件(存成了X.509格式:xxxx.cer)

   b. 导入公钥。把xxxx.cer放在Android的assets文件夹中,以方便在运行时通过代码读取此证书。


获取本地的证书
public static KeyStore getCertificate(Context context) {
		AssetManager assetManager = context.getAssets();
		InputStream ins = null;
		KeyStore keyStore = null;
		try {
			ins = assetManager.open("darrenf.crt");
			// 读取证书
			CertificateFactory cerFactory = CertificateFactory.getInstance("X.509"); //Certificate的type
			Certificate cer = cerFactory.generateCertificate(ins);
			// 创建一个证书库,并将证书导入证书库
			//android平台上支持的keystore type好像只有PKCS12,不支持JKS
			keyStore = KeyStore.getInstance("PKCS12", "BC"); 
			keyStore.load(null, null);

			keyStore.setCertificateEntry("trust", cer);
			return keyStore;

		} catch (IOException e) {
			e.printStackTrace();
		} catch (CertificateException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (NoSuchProviderException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} finally {
			try {
				if(ins != null){
					ins.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return keyStore;
	}



// 连接服务器获取信息
	public void connectServer() {
		// 获取本地证书
		KeyStore keystore = CertificateUtils.getCertificate(getContext());
		if(keystore == null){
			Log.e(TAG, "获取证书错误");
			return;
		}
		// 把咱的证书库作为信任证书库
		SSLSocketFactory socketFactory = null;
		try {
			socketFactory = new SSLSocketFactory(keystore);
			// 允许所有主机
			socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (UnrecoverableKeyException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		final Scheme sch = new Scheme("https", socketFactory, 443);

		Thread thread = new Thread() {

			public void run() {
				String path = "https://192.168.16.34:8443/SpringREST/simple/22";
				HttpClient mHttpClient = new DefaultHttpClient();
				mHttpClient.getConnectionManager().getSchemeRegistry().register(sch);

				HttpGet httpGet = new HttpGet(path);
				InputStream inputStream = null;
				ByteArrayOutputStream baos = null;
				try {
					HttpResponse response = mHttpClient.execute(httpGet);
					StatusLine stateLine = response.getStatusLine();
					if (stateLine.getStatusCode() == HttpStatus.SC_OK) {
						HttpEntity entity = response.getEntity();
						inputStream = entity.getContent();

						baos = new ByteArrayOutputStream();
						int len = 0;
						byte[] buffer = new byte[1024];
						while ((len = inputStream.read(buffer)) != -1) {
							baos.write(buffer, 0, len);
						}
						String content = new String(baos.toByteArray());
					}
				} catch (ClientProtocolException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					try {
						if (baos != null) {
							baos.close();
						}
						if (inputStream != null) {
							inputStream.close();
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		};
		thread.start();
	}


web.xml中配置http访问转向https



<!-- 配置使http访问转向https -->
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>SSL</web-resource-name>
			<url-pattern>/*</url-pattern>
		</web-resource-collection>
		<user-data-constraint>
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
		</user-data-constraint>
	</security-constraint>


 为 Tomcat 安装 apr

http://pengranxiang.iteye.com/blog/1128905


在tomcat7中启用HTTPS的详细配置

http://blog.sina.com.cn/s/blog_64a52f2a0101g35m.html


TOMCAT官方文档

http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration


本文转载自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=71580&page=1&_dsign=95e3b959

CrazyManDF
粉丝 3
博文 82
码字总数 33871
作品 0
程序员
私信 提问
Android USB的ADB协议通信(2)

ADB连接:ADB Wireless source has gone missing- https://github.com/slightlywobbly/adbwireless USB与PC通信之ADB方式- https://github.com/GavinAndre/UsbAccessoryDemo Android 使用USB......

desaco
01/29
0
0
Android获取当前手机蓝牙Mac地址(5.0,6.0-7.0,8.0-9.0) -(进行中),蓝牙电话

注意:当前Android手机5.0,6.0-7.0能获取蓝牙Mac地址;而当前Android手机8.0-9.0蓝牙Mac地址获取不到,API被隐藏的更深了?? Oreo(Android O) 8.0 2017年8月22日 API level 26 Oreo(And...

desaco
01/30
0
0
Android USB与AOA协议设备端(主机模式,配件模式)

-- UsbManager public static final String ACTIONUSBACCESSORYATTACHED = "android.hardware.usb.action.USBACCESSORYATTACHED"; public static final String ACTIONUSBACCESSORYDETACHED =......

desaco
2018/12/26
0
0
加密传输才是王道!谷歌在 Android P 上默认启用 TLS

上周四谷歌表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 ...

局长
2018/04/16
2.9K
10
在Android P上使用Http

前言 不少同学在适配Android P的时候会遇到not permitted by network security policy问题: 这是由于我们所使用的接口并非https导致的: Google表示,为保证用户数据和设备的安全,针对下一...

jarvanmo
2018/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

龙芯版办公软件wps和yozo永中

wps:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm yozo永中:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/y/yozo-offi......

gugudu
8分钟前
2
0
IDEA使用本机指定的java环境

idea 的安装包内有自己的jre。 idea 默认使用自己的jre 如果要使用自己的jdk,可以在bin目录下,找到idea.bat :: ---------------------------------------------------------------------:...

ol_O_O_lo
8分钟前
1
0
分析工厂模式中的问题并改造

工厂模式基本与简单工厂模式差不多,上面也说了,每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂模式就是为了解决这个问题而产生的。 既然每次...

骚年锦时
11分钟前
1
0
异常检测的N种方法,阿里工程师都盘出来了

阿里妹导读:互联网黑产盛行,其作弊手段层出不穷,导致广告效果降低,APP推广成本暴增。精准识别作弊是互联网公司和广告主的殷切期望。今天我们将从时间序列、统计、距离、线性方法、分布、...

阿里云云栖社区
16分钟前
0
0
今天是 Java 诞生日,Java 24 岁了!

今天是 Java 诞生日,Java 今年 24 岁了,比栈长还年轻。。还有得搞,别慌!作为一名Java语言的学习者,对Java的起源和发展有个大概的了解应是必要的。 1991年,Sun公司成立Green项目。Oak语...

Java技术栈
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部