`
king_tt
  • 浏览: 2260382 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android在使用HttpClient访问https时认证策略

 
阅读更多
Android中自带Apache的HttpClient包,详见google的API[url]
http://developer.android.com/reference/org/apache/http/package-summary.html
[/url]所以在无需要任何引用的情况下就可以使用HttpClient相关的东西。但是,Android中的HttpClient与http://hc.apache.org/downloads.cgi中的httpclient还是有所区别的,最主要的一个区别就是,Post方法时,Android的包支持自动重定向,而Apache官方的包不支持。
当访问https时,认证方案在客户端可以决定是否验证服务器,而服务器端可以选择是否验证客户端,如果双方都选择验证那么,就是双向验证;如果有一方选择不验证,那就是单向验证。作为客户端的Android单向验证和双向验证如下。
1 单向验证,即不验证服务器,在连接过程中首先读取本地客户端证书,然后采用不验证服务端信任证书的方式建立SSLContext,建立主要过程如下:
Java代码收藏代码
  1. protectedObjectdoInBackground(Object...params){
  2. //TODOAuto-generatedmethodstub
  3. try{
  4. KeyManagerFactorykeyManager=KeyManagerFactory.getInstance(KEY_MANAGER);
  5. KeyStorekeyKeyStore=KeyStore.getInstance(KEY_KEYSTORE);
  6. Filefk=newFile(mKPath);
  7. FileInputStreamkIs=newFileInputStream(fk);
  8. keyKeyStore.load(kIs,KSPWD.toCharArray());
  9. kIs.close();
  10. keyManager.init(keyKeyStore,KSPWD.toCharArray());
  11. GetSecPolicyclient=newGetSecPolicy(HOST,SERVER_PORT,keyManager.getKeyManagers());
  12. UserID=client.getUserID(targetPage,null,null,true);
  13. toast.setText(UserID);
  14. toast.show();
  15. if("1".equals(UserID)){
  16. System.out.println("用户名或密码错误!UserID:"+UserID);
  17. toast.setText("用户名或密码错误!");
  18. toast.show();
  19. }else{
  20. System.out.println("用户名和密码认证成功!UserID:"+UserID);
  21. //toast.setText("用户名和密码认证成功!");
  22. //toast.show();
  23. //取出IMEI值,进行终端检查
  24. TelephonyManagertm=(TelephonyManager)SoftCertUserLogin.this.getSystemService(Context.TELEPHONY_SERVICE);
  25. StringdeviceId=tm.getDeviceId();//取出IMEI
  26. //进行终端检查
  27. System.out.println(OpenVpnAnimationActivity.USER_TYPE);
  28. booleancheck=client.secCheck(UserID,OpenVpnAnimationActivity.USER_TYPE,deviceId);
  29. System.out.println(OpenVpnAnimationActivity.USER_TYPE);
  30. if(check){//验证通过
  31. //获取用户的的用户信息策略
  32. System.out.println("checked!");
  33. StringloginPolicy=client.getSecLoginPolicy(UserID);
  34. if(loginPolicy==null){
  35. toast.setText("获取用户信息策略失败!");
  36. toast.show();
  37. System.out.println("获取用户信息策略失败!");
  38. }else{//成功获取seclogininfo
  39. System.out.println(loginPolicy);
  40. Intentintent=newIntent();
  41. //intent.putExtra("loginPolicy",loginPolicy);//传给下一个Activity
  42. intent.setClass(SoftCertUserLogin.this,MainpageActivity.class);
  43. BundlemBundle=newBundle();
  44. mBundle.putString("Seclogin",loginPolicy);//压入数据
  45. intent.putExtras(mBundle);
  46. SoftCertUserLogin.this.startActivity(intent);
  47. if(version>=5){
  48. overridePendingTransition(R.anim.zoomin,R.anim.zoomout);//此为自定义的动画效果,下面两个为系统的动画效果
  49. //overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
  50. //overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
  51. }
  52. SoftCertUserLogin.this.finish();
  53. }
  54. }else{//验证失败
  55. toast.setText("并没有绑定此手机,请重新登录!");
  56. toast.show();
  57. System.out.println("并没有绑定此手机,请重新登录!");
  58. }
  59. }
  60. }catch(Exceptione){
  61. toast.setText("错误:"+e.getMessage());
  62. toast.show();
  63. }
  64. returnnull;
  65. }

其中MySSLSocketFactory实现如下:
Java代码收藏代码
  1. importjava.io.IOException;
  2. importjava.net.Socket;
  3. importjava.net.UnknownHostException;
  4. importjava.security.KeyManagementException;
  5. importjava.security.KeyStore;
  6. importjava.security.KeyStoreException;
  7. importjava.security.NoSuchAlgorithmException;
  8. importjava.security.UnrecoverableKeyException;
  9. importjava.security.cert.CertificateException;
  10. importjava.security.cert.X509Certificate;
  11. importjavax.net.ssl.KeyManager;
  12. importjavax.net.ssl.SSLContext;
  13. importjavax.net.ssl.TrustManager;
  14. importjavax.net.ssl.X509TrustManager;
  15. importorg.apache.http.conn.ssl.SSLSocketFactory;
  16. publicclassMySSLSocketFactoryextendsSSLSocketFactory{
  17. SSLContextsslContext=SSLContext.getInstance("TLS");
  18. publicMySSLSocketFactory(KeyStoretruststore)throwsNoSuchAlgorithmException,KeyManagementException,KeyStoreException,UnrecoverableKeyException{
  19. super(truststore);
  20. TrustManagertm=newX509TrustManager(){
  21. publicvoidcheckClientTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{
  22. }
  23. publicvoidcheckServerTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{
  24. }
  25. publicX509Certificate[]getAcceptedIssuers(){
  26. returnnull;
  27. }
  28. };
  29. sslContext.init(null,newTrustManager[]{tm},null);
  30. }
  31. publicMySSLSocketFactory(KeyManager[]keys,KeyStoretruststore)throwsNoSuchAlgorithmException,KeyManagementException,KeyStoreException,UnrecoverableKeyException{
  32. super(truststore);
  33. TrustManagertm=newX509TrustManager(){
  34. publicvoidcheckClientTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{
  35. }
  36. publicvoidcheckServerTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{
  37. }
  38. publicX509Certificate[]getAcceptedIssuers(){
  39. returnnull;
  40. }
  41. };
  42. sslContext.init(keys,newTrustManager[]{tm},null);
  43. }
  44. @Override
  45. publicSocketcreateSocket(Socketsocket,Stringhost,intport,booleanautoClose)throwsIOException,UnknownHostException{
  46. returnsslContext.getSocketFactory().createSocket(socket,host,port,autoClose);
  47. }
  48. @Override
  49. publicSocketcreateSocket()throwsIOException{
  50. returnsslContext.getSocketFactory().createSocket();
  51. }
  52. }

2 双向认证,即读取服务器端的信任证书
建立httpclient的SSLContext如下:
Java代码收藏代码
  1. SSLContextsslContext=SSLContext.getInstance(Constants.SSL.AGREEMENT);
  2. KeyManagerFactorykeyManager=KeyManagerFactory.getInstance(Constants.SSL.KEY_MANAGER);
  3. TrustManagerFactorytrustManager=TrustManagerFactory.getInstance(Constants.SSL.TRUST_MANAGER);
  4. KeyStorekeyKeyStore=KeyStore.getInstance(Constants.SSL.KEY_KEYSTORE);
  5. KeyStoretrustKeyStore=KeyStore.getInstance(Constants.SSL.TRUST_KEYSTORE);
  6. FileInputStreamkIs=newFileInputStream(mPath);
  7. keyKeyStore.load(kIs,KSPWD.toCharArray());
  8. kIs.close();
  9. FileInputStreamtkIS=newFileInputStream(mPath);
  10. trustKeyStore.load(tkIS,TKSPWD.toCharArray());
  11. tkIS.close();
  12. keyManager.init(keyKeyStore,KSPWD.toCharArray());
  13. trustManager.init(trustKeyStore);
  14. sslContext.init(keyManager.getKeyManagers(),trustManager.getTrustManagers(),null);

在MySSLSocketFactory中添加相应构造函数即可。

    [同时需要指明,android只支持bks格式的密库,而且android中自带 BouncyCastle的包,不同版本 BouncyCastle生成的密库是不兼容的,所以要注意密库版本]
分享到:
评论

相关推荐

    HttpClient for android 4 3 5 jar

    在Android中使用HttpClient时,需要注意以下几点: 1. **兼容性问题**:自Android 6.0(API级别23)开始,HttpClient被标记为废弃,建议使用OkHttp或其他现代替代品。不过,HttpClient 4.3.5版本仍可以在较低版本的...

    Android使用Https访问Demo

    本文将深入探讨如何在Android应用中实现HTTPS协议的访问,基于提供的"Android使用Https访问Demo",我们将详细解析这一过程。 首先,HTTPS(HyperText Transfer Protocol Secure)是一种基于SSL/TLS的安全通信协议,...

    HttpClient jar包

    Android平台上的网络访问虽然可以使用内置的HttpURLConnection,但HttpClient提供了更多的控制和定制选项,对于处理复杂的网络请求特别有用。 HttpClient的主要组件包括: 1. **HttpClient类**:它是整个库的核心...

    ANDROID中使用WEBSERVICE验证用户登录的示例

    考虑使用缓存策略,比如在网络不稳定时使用本地存储的登录状态,以提高用户体验。 10. **最佳实践** - 使用成熟的网络库,如Retrofit,它简化了网络请求和响应处理,同时支持Gson、Jackson等多种数据解析库。 - ...

    httpclient-tutorial.pdf

    - **1.2.1 HttpClient线程安全性**:分析HttpClient对象是否可以安全地用于多线程环境,以及如何确保其在并发访问下的稳定性。 - **1.2.2 HttpClient资源释放**:讨论在使用完毕后如何正确释放HttpClient相关的资源...

    HttpCoreAndHttpClientjar包

    在进行HttpClient网站爬虫开发时,通常需要以下步骤: 1. **创建HttpClient实例**:首先,你需要创建一个HttpClient实例,这通常是通过使用`HttpClientBuilder`或`HttpAsyncClientBuilder`来完成的。你可以配置各种...

    淘宝客Android源码,真正可以请求到数据的

    - Android 6.0以上版本需要在运行时申请网络访问权限,确保应用能正常发送网络请求。 - 在AndroidManifest.xml中声明所需的权限,如INTERNET权限。 6. **数据缓存**: - 为了提高用户体验,可采用本地缓存策略,...

    android、登录和验证

    在Android开发中,登录验证是应用的基本功能之一,它确保只有授权用户才能访问特定的数据和服务。这个项目提供了从服务器端到Android客户端的完整登录验证流程,对于初学者来说,是理解这一过程的好起点。 首先,...

    Android-and-server.zip_android_tomcat

    9. **缓存策略**:对于减少网络延迟和节省流量,可以考虑在Android客户端实现缓存策略,如使用SQLite数据库或内部存储来缓存服务器数据。 10. **测试与调试**:在开发过程中,使用模拟器或真实设备进行集成测试,...

    疯狂Android讲义(第三版)17-19章源码,内附19章详细使用说明

    此外,学习过程中,还应关注Android的权限管理、多线程同步、异常处理等基础知识,以及如何优化网络请求性能,如使用缓存策略、处理网络异常等。对于服务器端,还需要关注安全性,例如数据加密、防止SQL注入和XSS...

    Android 4.0网络编程详解

    HttpClient则是Android早期版本中广泛使用的,但在4.2之后逐渐被弃用。两种方式都可以实现GET、POST等HTTP方法,处理头信息和Cookie,以及进行HTTP基本认证。 2. **HTTPS与安全**:为了保证数据传输的安全性,...

    访问金蝶webapi自定义代码

    6. **安全和性能**:确保在与金蝶云API交互时遵循最佳实践,如使用HTTPS、定期更新访问令牌、限制并发请求以避免超出速率限制,以及正确管理敏感信息。 7. **KingDee.api.ServicesStub**:这个文件名可能是金蝶云...

    Android和PHP开发最佳实践 下

    Android客户端获取访问令牌,然后在与服务器通信时携带该令牌,PHP服务器负责验证并授权。这个过程涉及授权码流、密码流、刷新令牌等概念。 5. **PHP服务器端开发:** PHP服务器端主要负责业务逻辑处理、数据存储...

    JSON在Android和Web通信中的应用研究.pdf

    - 在Android与Web通信时,应确保数据传输的安全性,例如使用HTTPS协议加密通信,防止数据被窃取。 - 对敏感数据进行加密,避免明文传输。 - 使用认证机制,如OAuth,确保只有授权的客户端才能访问服务器资源。 7...

    Android源码——口袋微博服务器客户端代码.zip

    在Android中,应用需要声明特定权限才能访问网络、写入存储等。在AndroidManifest.xml文件中,开发者需要添加如INTERNET和WRITE_EXTERNAL_STORAGE等权限。 7. **API接口调用**: 开发者会根据微博服务器提供的API...

    httpcore jar包

    1. **HttpClient构建**:HttpClient允许开发者定制连接策略、重试策略、身份验证策略等,以满足特定的网络访问需求。 2. **认证与安全**:支持基本认证、摘要认证等多种HTTP认证方式,同时提供了SSL/TLS支持,可以...

    OkHttp网络框架源码

    在Android Studio中,使用Java语言集成OkHttp非常简单。首先,需要在项目中添加OkHttp的依赖,通常是在`build.gradle`文件中添加相应的Maven仓库和依赖项。然后,引入OkHttp的相关类,就可以开始编写网络请求代码了...

    UIwithJSONWebService:Android中带有JSON Web服务的UI

    在Android中,还需要处理运行时权限,如INTERNET权限,以确保应用能够正常访问网络。 10. **测试**:为确保功能的正确性和稳定性,项目可能包含单元测试和集成测试。Mockito、Espresso等工具可以帮助我们编写和运行...

    Projeto_JavaSpringBootAndroidStudio_CSharpDesktop:Java(移动e Web服务其余部分)CShap Desktop

    在Java方面,项目可能使用了Spring Boot框架来构建后端服务。Spring Boot简化了Spring的应用程序开发,通过预配置的依赖和自动化配置提供快速启动的能力。开发者可以利用Spring Data、Spring Security等模块,实现...

Global site tag (gtag.js) - Google Analytics