Android如何通过https协议下载自己的https网站上的文件/apk等
2014-05-20 17:27
846 查看
我的服务器端是用Centos6.4+apache搭建的https 网站。
Android通过http下载不需要证书,不需要SSLfactory等,所以https和http的区别仅此而已。
1.证书相关的类,添加如下类:
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class TrustAllManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] cert, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] cert, String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
2.SSLFactory相关的类如下:
import java.io.IOException;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
public class TrustAllSSLSocketFactory extends SSLSocketFactory {
private javax.net.ssl.SSLSocketFactory factory;
public TrustAllSSLSocketFactory() throws KeyManagementException,
NoSuchAlgorithmException, KeyStoreException,
UnrecoverableKeyException {
super(null);
try {
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[] { new TrustAllManager() },
null);
factory = sslcontext.getSocketFactory();
setHostnameVerifier(new AllowAllHostnameVerifier());
} catch (Exception ex) {
}
}
public static SSLSocketFactory getDefault() throws KeyManagementException,
NoSuchAlgorithmException, KeyStoreException,
UnrecoverableKeyException {
return new TrustAllSSLSocketFactory();
}
@Override
public Socket createSocket() throws IOException {
return factory.createSocket();
}
@Override
public Socket createSocket(Socket socket, String s, int i, boolean flag)
throws IOException {
return factory.createSocket(socket, s, i, flag);
}
public javax.net.ssl.SSLSocketFactory getSSLSocketFactory() {
return factory;
}
}
3.https需要把上面的Factory注册上,TrustAllManager 已经用在Factory上面了。
// Step One register scheme of https
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
SSLSocketFactory socketFactory = null;
try {
socketFactory = TrustAllSSLSocketFactory.getDefault();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
HttpsURLConnection.setDefaultSSLSocketFactory(((TrustAllSSLSocketFactory)socketFactory).getSSLSocketFactory());
注意第三步应该放在等到HttpsURLConnection得到连接之前,或者DefaultHttpClient类初始化之间,否则就会报各种各样的错误。
Android通过http下载不需要证书,不需要SSLfactory等,所以https和http的区别仅此而已。
1.证书相关的类,添加如下类:
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class TrustAllManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] cert, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] cert, String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
2.SSLFactory相关的类如下:
import java.io.IOException;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
public class TrustAllSSLSocketFactory extends SSLSocketFactory {
private javax.net.ssl.SSLSocketFactory factory;
public TrustAllSSLSocketFactory() throws KeyManagementException,
NoSuchAlgorithmException, KeyStoreException,
UnrecoverableKeyException {
super(null);
try {
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[] { new TrustAllManager() },
null);
factory = sslcontext.getSocketFactory();
setHostnameVerifier(new AllowAllHostnameVerifier());
} catch (Exception ex) {
}
}
public static SSLSocketFactory getDefault() throws KeyManagementException,
NoSuchAlgorithmException, KeyStoreException,
UnrecoverableKeyException {
return new TrustAllSSLSocketFactory();
}
@Override
public Socket createSocket() throws IOException {
return factory.createSocket();
}
@Override
public Socket createSocket(Socket socket, String s, int i, boolean flag)
throws IOException {
return factory.createSocket(socket, s, i, flag);
}
public javax.net.ssl.SSLSocketFactory getSSLSocketFactory() {
return factory;
}
}
3.https需要把上面的Factory注册上,TrustAllManager 已经用在Factory上面了。
// Step One register scheme of https
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
SSLSocketFactory socketFactory = null;
try {
socketFactory = TrustAllSSLSocketFactory.getDefault();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
HttpsURLConnection.setDefaultSSLSocketFactory(((TrustAllSSLSocketFactory)socketFactory).getSSLSocketFactory());
注意第三步应该放在等到HttpsURLConnection得到连接之前,或者DefaultHttpClient类初始化之间,否则就会报各种各样的错误。
相关文章推荐
- android-如何从Play.google.com上下载APK文件到电脑
- 已经越狱的 iPhone、iPad 设备,当通过其自带的 safari 浏览器访问 ipa 应用下载网站时,利用 itms-services 协议,可以一键安装 ipa 文件的 iOS 应用
- 如何从Google Play下载Android应用的APK安装文件?
- 【Android】如何创建自己的证书文件,如何为apk以及zip文件签名 openssl
- 如何让网站所在虚拟主机支持apk格式文件下载
- 如何让网站所在虚拟主机支持apk格式文件下载
- android+https网址屏蔽证书+IntentService+NotifyManager通知栏+下载apk文件+在通知栏显示下载进度+完成之后提示安装
- Android开发实践经验谈:如何让各式手机浏览器可以直接下载apk安装文件且实现自动安装APP
- 如何解决APK文件传到网站上出现不能被下载的问题
- 如何通过手机客户端Android、Iphone 等访问要求使用客户端证书SSL加密的https网站
- Android如何实现文件下载并自动安装apk包!!!
- 如何在html中通过下载对话框来下载服务器端的文件
- 如何安装apk文件在Android仿真器中
- Android教程之如何安装(卸载)apk文件到模拟器
- Problem shooting:为什么有时在Android平台上通过代理网关访问HTTPS网站会出现连接失败
- C++如何从支持证书或账号认证的https网站上,用账号下载
- Android如何通过content provider构建媒体文件数据库
- Android学习之HTTP协议文件下载并写入SD卡
- 如何给自己的网站申请SSL数字证书以支持https
- 转载:如何安装apk文件在Android仿真器中