Android HTTPS通信:服务器端与客户端实现步骤

需积分: 9 0 下载量 196 浏览量 更新于2024-07-26 1 收藏 191KB DOC 举报
"AndroidHttps服务器端和客户端简单实例" 在Android应用开发中,有时需要通过HTTPS协议来实现安全的数据传输,确保用户信息的安全性。本文将详细介绍如何在Android平台上搭建HTTPS服务器端以及创建对应的客户端实例。 首先,我们需要确保开发环境已准备就绪。这里使用的工具有Eclipse 3.7集成开发环境、Tomcat 6.0.18 作为Web服务器,以及Android 2.1的开发环境。为了确保开发过程中使用的是正确的JDK版本,需要在Eclipse的“Window” -> “Preferences” -> “Installed JREs”中设置,并在Eclipse与Tomcat的整合中选择该JRE环境。 一、搭建服务器端 1. 在Eclipse中创建一个动态Web项目(Dynamic Web Project),命名为“HttpsServer”。这将是我们的服务器端程序。 2. 编写`index.jsp`文件,这是一个简单的HTML表单,用于向服务器发送请求。表单的提交地址是"/HttpsServer/TestService",方法类型为GET。表单内容包括一个输入框供用户输入名字。 ```jsp <%@page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>name+age JSP Page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <form action="/HttpsServer/TestService" method="get"> name: &nbsp; <input type="text" name="name" value=""><br/> <input type="submit" value="Submit"> </form> </body> </html> ``` 接下来,我们需要在服务器端实现处理这些请求的服务。这通常涉及创建Servlet,例如`TestService.java`,它会接收并处理来自客户端的HTTPS请求。 二、配置HTTPS 要使服务器支持HTTPS,我们需要生成一对密钥对(公钥和私钥)并创建一个信任证书。这通常涉及到以下步骤: 1. 使用`keytool`命令生成自签名证书,存储在Tomcat的`conf`目录下的`keystore`文件中。 2. 修改Tomcat的`server.xml`配置文件,配置`Connector`元素以启用HTTPS,并指定密钥库路径、密码等信息。 ```xml <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="${catalina.base}/conf/keystore" keystorePass="password" clientAuth="false" sslProtocol="TLS"/> ``` 三、创建Android客户端 在Android客户端,我们需要使用`HttpsURLConnection`类来建立安全的连接。以下是一个简单的示例: 1. 首先,确保在AndroidManifest.xml中添加了网络访问权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 2. 创建一个方法来发送HTTPS请求,获取服务器响应: ```java public String sendHttpsRequest(String url) throws IOException { URL urlObj = new URL(url); HttpsURLConnection connection = (HttpsURLConnection) urlObj.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); // 设置信任所有主机证书 TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}; // 创建一个不验证的SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); // 使用创建的SSLContext配置连接 connection.setSSLSocketFactory(sslContext.getSocketFactory()); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); return response.toString(); } else { return "请求失败,响应码:" + responseCode; } } ``` 3. 在客户端活动中,调用上述方法发送请求并处理响应: ```java Button submitBtn = findViewById(R.id.submitBtn); submitBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String serverUrl = "https://your-server-url.com/HttpsServer/TestService?name=" + nameEditText.getText().toString(); try { String response = sendHttpsRequest(serverUrl); Toast.makeText(MainActivity.this, response, Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "请求出错", Toast.LENGTH_SHORT).show(); } } }); ``` 这样,我们就完成了Android客户端和HTTPS服务器的简单通信实例。然而,实际应用中,为了安全性,不应完全信任所有证书,而是应该使用权威机构签发的证书或者自签名证书,并在客户端进行证书校验。此外,还应考虑异常处理、连接超时等问题,以提高应用程序的健壮性。