在项目中遇到了https传输问题,使用自签名证书,是的android手机端与服务器可与进行数据通信,尝试了多种方法,最终实现。在此做笔记,以防忘记、加固记忆。
1、生成证书
服务器端 证书库 keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore server.keystore -dname "CN=192.168.1.110,OU=monkey,O=monkey,L=BeiJIng,ST=BeiJing,c=cn" -storepass 123456 -keypass 123456
客户端 证书库 keytool -validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname "CN=client,OU=monkey,O=monkey,L=BeiJing,ST=BeiJing,c=cn" -storepass 123456 -keypass 123456
服务器端证书库导出服务器端证书 keytool -export -v -alias server -keystore server.keystore -storepass 123456 -rfc -file server.cer
从客户端证书库导入客户端证书 keytool -export -v -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer
生成Android客户端信任证书库(由服务端证书生成的证书库) keytool -importcert -keystore server.bks -file server.cer -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
将客户端证书导入到服务器证书库(使得服务器信任客户端证书) keytool -import -v -alias client -file client.cer -keystore server.keystore -storepass 123456
将client.p12和server.bks复制到手机端的某个文件夹下,关于一些说放到assets文件夹下的,其实并不非要放到那里,那个文件夹是系统文件夹,一般来说你无法直接查看或者读写。
2、配置tomcat
在tomca的conf文件夹下的server.xml找到被注释掉的端口为8443的HTTPS打开
加入
keystoreFile="D:\\test\\server.keystore" keystorePass="123456"
truststoreFile="D:\\test\\server.keystore" truststorePass="123456"
保存后重启服务器
3、测试服务器
配置浏览器 双击client.p12导入浏览器,选择安装到“受信任的根证书颁发机构”。输入https://192.x.x.x:8443 访问服务器,观察是否成功访问,出现tomcat首页即为访问成功,地址处出现小锁标志。
4、android 客户端代码
很惭愧 代码是网上一位前辈写的 经过测试 非常完美的实现了android端的https的配置,结合项目 我对于部分代码做出了调整。
菜鸟一个 互相学习
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509KeyManager;
/**
* Created by Administrator on 2016/7/11.
*/
public class SSLConnection {
private static TrustManager[] trustManagers;
private static final String KEY_STORE_TYPE_BKS = "bks";
private static final String KEY_STORE_TYPE_P12 = "PKCS12";
private static final String keyStoreFileName = Environment.getExternalStorageDirectory().getPath() + "/asset/client.p12";
private static final String keyStorePassword = "123456";
private static final String trustStoreFileName = Environment.getExternalStorageDirectory().getPath() + "/asset/server.bks";
private static final String trustStorePassword = "123456";
private static final String alias = null;//"client";
private static Context pContext = null;
public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//TODO Auto-generated method stub
return true;
}
});
// pContext = ct;
SSLContext context;
if (trustManagers == null) {
try {
KeyManager[] keyManagers = createKeyManagers(keyStoreFileName, keyStorePassword, alias);
trustManagers = createTrustManagers(trustStoreFileName, trustStorePassword);
context = SSLContext.getInstance("TLS");
context.init(keyManagers, trustManagers, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
} catch (KeyStoreException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
Log.e("allowAllSSL", e.toString());
}//new TrustManager[]{new _FakeX509TrustManager()};
}
}
private static KeyManager[] createKeyManagers(String keyStoreFileName, String eyStorePassword, String alias)
throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException {
FileInputStream inputStream = new FileInputStream(keyStoreFileName);
KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);
keyStore.load(inputStream, keyStorePassword.toCharArray());
printKeystoreInfo(keyStore);//for debug
KeyManager[] managers;
if (alias != null) {
managers =
new KeyManager[]{
new SSLConnection().new AliasKeyManager(keyStore, alias, keyStorePassword)};
} else {
KeyManagerFactory keyManagerFactory =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//PKIX "X509")
keyManagerFactory.init(keyStore, keyStorePassword == null ? null : keyStorePassword.toCharArray());
managers = keyManagerFactory.getKeyManagers();
}
return managers;
}
private static TrustManager[] createTrustManagers(String trustStoreFileName, String trustStorePassword)
throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
FileInputStream inputStream = new FileInputStream(trustStoreFileName);
KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS);
trustStore.load(inputStream, trustStorePassword.toCharArray());
printKeystoreInfo(trustStore);//for debug
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
return trustManagerFactory.getTrustManagers();
}
private static void printKeystoreInfo(KeyStore keystore) throws KeyStoreException {
System.out.println("Provider : " + keystore.getProvider().getName());
System.out.println("Type : " + keystore.getType());
System.out.println("Size : " + keystore.size());
Enumeration en = keystore.aliases();
while (en.hasMoreElements()) {
System.out.println("Alias: " + en.nextElement());
}
}
private class AliasKeyManager implements X509KeyManager {
private KeyStore _ks;
private String _alias;
private String _password;
public AliasKeyManager(KeyStore ks, String alias, String password) {
_ks = ks;
_alias = alias;
_password = password;
}
public String chooseClientAlias(String[] str, Principal[] principal, Socket socket) {
return _alias;
}
public String chooseServerAlias(String str, Principal[] principal, Socket socket) {
return _alias;
}
public X509Certificate[] getCertificateChain(String alias) {
try {
Certificate[] certificates = this._ks.getCertificateChain(alias);
if (certificates == null) {
throw new FileNotFoundException("no certificate found for alias:" + alias);
}
X509Certificate[] x509Certificates = new X509Certificate[certificates.length];
System.arraycopy(certificates, 0, x509Certificates, 0, certificates.length);
return x509Certificates;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String[] getClientAliases(String str, Principal[] principal) {
return new String[]{_alias};
}
public PrivateKey getPrivateKey(String alias) {
try {
return (PrivateKey) _ks.getKey(alias, _password == null ? null : _password.toCharArray());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String[] getServerAliases(String str, Principal[] principal) {
return new String[]{_alias};
}
}
}
相关推荐
这是https与tomcat服务器,android通信的全部流程配置,以及需要的包源代码,我弄了3天才搞定的,网上资料很多,可是都是一个人弄一端,不好调试,所以一直搞不定,如果是一个人弄的话,就可以很快的搞定。...
本示例将关注如何在Android客户端与Tomcat服务器之间利用HTTP协议进行通信,这对于初学者来说是非常实用的实践教程。下面我们将详细讨论相关知识点。 一、Android中的HTTP通信 1. HttpURLConnection:Android SDK...
本教程以"TomCat服务端部署与Android与服务端通信.rar"为主题,旨在详细讲解如何将Tomcat服务器部署并配置,以及如何使Android应用程序与之进行有效的通信。下面,我们将深入探讨这些关键知识点。 首先,让我们来...
这些配置确保了Android应用可以与使用SSL的Tomcat服务器进行通信。 5. **测试环境配置**:为了验证配置的有效性,需要编写批处理命令进行测试,确保SSL加密通道可以正常工作。 ##### 二、Tomcat的PC版SSL双向配置...
在Android开发中,有时我们需要与后端服务器进行交互,实现数据的发送和接收。本案例主要探讨了如何使用Android客户端访问Tomcat服务器,实现用户注册、登录功能,并将MySQL数据库中的数据通过ListView组件展示。...
首先,我们要理解Android应用与服务器通信的基本原理。通常,Android客户端通过HTTP或HTTPS协议向服务器发送请求,获取或提交数据。在这个例子中,我们使用的是HTTP协议,通过WebView或自定义网络请求来实现。在此...
本篇将详细介绍如何在Android端利用KSOAP2与运行在Tomcat上的Axis Web服务进行通信。 首先,我们需要理解SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web上交换结构化和类型化的信息。KSOAP2...
在IT行业中,Android和Tomcat之间的文件上传与数据交互是一个常见的需求,特别是在移动应用和服务器端数据处理的场景。在这个过程中,Android作为客户端,通过HTTP协议向运行在服务器上的Tomcat发送请求,实现文件的...
首先,我们要了解Android端如何与服务器进行通信。最常用的方式是通过HTTP或HTTPS协议,利用网络请求库(如OkHttp、Retrofit等)发送GET、POST等HTTP请求到Tomcat服务器上的Servlet。在AndroidManifest.xml中,必须...
安全方面,如果是HTTPS请求,应用需要处理证书验证,以确保与正确的服务器通信。对于从Tomcat服务器下载的MP3,还需确保服务器配置正确,支持HTTP基本认证或者其他安全机制,防止未授权访问。 总的来说,这个...
在这个场景中,Android客户端将与Tomcat服务器进行交互,Tomcat是一款广泛使用的Java Servlet容器,常用于部署Web应用程序。下面我们将深入探讨这个过程中的关键知识点。 一、Android客户端上传数据 1. HTTP请求库...
在这个项目中,Tomcat接收来自Android客户端的请求,处理登录注册操作,与MySQL数据库进行交互,验证用户信息,返回结果给客户端。开发者可能使用了Servlet和JSP技术来编写服务器端代码。 4. **MySQL**:MySQL是一...
10. **测试与调试**:在开发过程中,使用模拟器或真实设备进行集成测试,确保Android客户端与Tomcat服务器的交互无误。利用工具如Postman进行接口测试,可以帮助快速定位问题。 总之,Android与Tomcat服务器的交互...
Tomcat与MySql之间的通信通常通过JDBC(Java Database Connectivity)实现,确保数据安全地存储和检索。 MySql是广泛使用的开源关系型数据库管理系统,用于存储和管理用户账户信息。在这个项目中,开发者需要创建一...
在Android开发中,HTTP通信是应用与服务器交互的重要方式,特别是在获取远程数据或者进行网络请求时。本资源提供了Android HTTP通信的示例代码,帮助开发者理解如何在Android应用中实现HTTP请求。同时,还附带了...
为了保护服务器和设备安全,确保使用HTTPS进行通信,以加密传输的数据。可以使用Let's Encrypt获取免费的SSL证书。同时,限制访问权限,只允许已知的设备IP或设备ID访问更新接口。 6. **日志与监控** 设置日志...
在Android客户端访问Tomcat服务器的简单登录模型中,我们探讨的是如何通过移动设备与Web服务器进行交互,实现用户的身份验证。这个模型不涉及数据库连接,但通常在实际应用中,登录验证会涉及到后端数据库来存储和...
首先,我们来看后端部分,它使用了Apache Tomcat作为Web服务器,SpringMVC作为控制层框架,MyBatis作为数据访问层框架。 Tomcat是Java Servlet和JavaServer Pages(JSP)的开源容器,它是Java Web应用的标准部署...
这篇项目是基于Android客户端、Tomcat服务器和MySQL数据库构建的一款模仿QQ聊天软件的实现,旨在为学生提供一个一万行代码的编程实践作业。这个综合性的项目涵盖了多个IT领域的核心技术,让我们逐一深入探讨。 首先...