`
momoch1314
  • 浏览: 32312 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

在Android上实现SSL握手

阅读更多
Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库

服务端:
public class SSLServer {

    private static final int SERVER_PORT = 50030;
    private static final String SERVER_KEY_PASSWORD = "123456";
    private static final String SERVER_AGREEMENT = "TLS";//使用协议
    private static final String SERVER_KEY_MANAGER = "SunX509";//密钥管理器
    private static final String SERVER_KEY_KEYSTORE = "JKS";//密库,这里用的是Java自带密库
    private static final String SERVER_KEYSTORE_PATH = "src/data/kserver.keystore";//密库路径
    private SSLServerSocket serverSocket;

    public static void main(String[] args) {
        SSLServer server = new SSLServer();
        server.init();
        server.start();
    }

    //由于该程序不是演示Socket监听,所以简单采用单线程形式,并且仅仅接受客户端的消息,并且返回客户端指定消息
    public void start() {
        if (serverSocket == null) {
            System.out.println("ERROR");
            return;
        }
        while (true) {
            try {
            	System.out.println("Server Side......");
                Socket s = serverSocket.accept();
                InputStream input = s.getInputStream();
                OutputStream output = s.getOutputStream();

                BufferedInputStream bis = new BufferedInputStream(input);
                BufferedOutputStream bos = new BufferedOutputStream(output);

                byte[] buffer = new byte[20];
                bis.read(buffer);
                System.out.println(new String(buffer));

                bos.write("This is Server".getBytes());
                bos.flush();

                s.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    
    public void init() {
        try {
        	//取得SSLContext
            SSLContext ctx = SSLContext.getInstance(SERVER_AGREEMENT);
            //取得SunX509私钥管理器
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(SERVER_KEY_MANAGER);
            //取得JKS密库实例
            KeyStore ks = KeyStore.getInstance(SERVER_KEY_KEYSTORE);
            //加载服务端私钥
            ks.load(new FileInputStream(SERVER_KEYSTORE_PATH), SERVER_KEY_PASSWORD.toCharArray());
            //初始化
            kmf.init(ks, SERVER_KEY_PASSWORD.toCharArray());
            //初始化SSLContext
            ctx.init(kmf.getKeyManagers(),null, null);
            //通过SSLContext取得ServerSocketFactory,创建ServerSocket
            serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(SERVER_PORT);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

客户端:
public class MySSLSocket extends Activity {
	private static final int SERVER_PORT = 50030;//端口号
	private static final String SERVER_IP = "218.206.176.146";//连接IP
	private static final String CLIENT_KET_PASSWORD = "123456";//私钥密码
	private static final String CLIENT_TRUST_PASSWORD = "123456";//信任证书密码
	private static final String CLIENT_AGREEMENT = "TLS";//使用协议
	private static final String CLIENT_KEY_MANAGER = "X509";//密钥管理器
	private static final String CLIENT_TRUST_MANAGER = "X509";//
	private static final String CLIENT_KEY_KEYSTORE = "BKS";//密库,这里用的是BouncyCastle密库
	private static final String CLIENT_TRUST_KEYSTORE = "BKS";//
	private static final String ENCONDING = "utf-8";//字符集
	private SSLSocket Client_sslSocket;
	private Log tag;
	private TextView tv;
	private Button btn;
	private Button btn2;
	private Button btn3;
	private EditText et;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.TextView01);
        et = (EditText) findViewById(R.id.EditText01);
        btn = (Button) findViewById(R.id.Button01);
        btn2 = (Button) findViewById(R.id.Button02);
        btn3 = (Button) findViewById(R.id.Button03);
        
        btn.setOnClickListener(new Button.OnClickListener(){
			@Override
			public void onClick(View arg0) {
				if(null != Client_sslSocket){
					getOut(Client_sslSocket, et.getText().toString());
					getIn(Client_sslSocket);
					et.setText("");
				}
			}
		});
        btn2.setOnClickListener(new Button.OnClickListener(){
			@Override
			public void onClick(View arg0) {
				try {
					Client_sslSocket.close();
					Client_sslSocket = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
        btn3.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View arg0) {
				init();
				getIn(Client_sslSocket);
			}
		});
    }
    
    public void init() {
    	try {
    		//取得SSL的SSLContext实例
			SSLContext sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);
			//取得KeyManagerFactory和TrustManagerFactory的X509密钥管理器实例
			KeyManagerFactory keyManager = KeyManagerFactory.getInstance(CLIENT_KEY_MANAGER);
			TrustManagerFactory trustManager = TrustManagerFactory.getInstance(CLIENT_TRUST_MANAGER);
			//取得BKS密库实例
			KeyStore kks= KeyStore.getInstance(CLIENT_KEY_KEYSTORE);
			KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE);
			//加客户端载证书和私钥,通过读取资源文件的方式读取密钥和信任证书
			kks.load(getBaseContext()
					.getResources()
					.openRawResource(R.drawable.kclient),CLIENT_KET_PASSWORD.toCharArray());
			tks.load(getBaseContext()
					.getResources()
					.openRawResource(R.drawable.lt_client),CLIENT_TRUST_PASSWORD.toCharArray());
			//初始化密钥管理器
			keyManager.init(kks,CLIENT_KET_PASSWORD.toCharArray());
			trustManager.init(tks);
			//初始化SSLContext
			sslContext.init(keyManager.getKeyManagers(),trustManager.getTrustManagers(),null);
			//生成SSLSocket
			Client_sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(SERVER_IP,SERVER_PORT);
		} catch (Exception e) {
			tag.e("MySSLSocket",e.getMessage());
		}
    }
        
    public void getOut(SSLSocket socket,String message){
    	PrintWriter out;
		try {
			out = new PrintWriter(
					new BufferedWriter(
							new OutputStreamWriter(
									socket.getOutputStream()
									)
							),true);
			out.println(message);
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    
    public void getIn(SSLSocket socket){
    	BufferedReader in = null;
		String str = null;
		try {
			in = new BufferedReader(
					new InputStreamReader(
							socket.getInputStream()));
			str = new String(in.readLine().getBytes(),ENCONDING);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		new AlertDialog
		.Builder(MySSLSocket.this)
		.setTitle("服务器消息")
		.setNegativeButton("确定", null)
		.setIcon(android.R.drawable.ic_menu_agenda)
		.setMessage(str)
		.show();
    }
}

分享到:
评论
11 楼 q59200182 2016-03-18  
楼主求个完整的demo   QQ59200182
10 楼 langdechuanshuo 2013-10-17  
楼主,这个东西太需要了。请问 加载 客户端的私钥怎么生成的!有完整的代码项目能给我到么 那太感谢了。我需要你的帮助 450370187@qq.com 。谢谢!
9 楼 w123456h19 2012-05-22  
你好, 我最近也在做这个,运行你代码的时候出现点小问题:
SSLServer我创建的是一个java project
kserver.keystore我用jdk 的keytool生成勒。
运行的时候 一直停留在 Server Side......
这里,百思不得其解, 希望能指点迷津。
我的QQ: 493000806
8 楼 xiaotanyu13 2012-05-22  
我在运行楼主的代码的时候,在android端的kks.load(getBaseContext().getResources().openRawResource(R.drawable.abc),
CLIENT_KET_PASSWORD.toCharArray());
的时候报了一个错误,一时解决不了,有人遇到过同样的问题吗?
7 楼 alloxa 2010-12-27  
把自己库调整一下就可以跑通了,谢谢提供代码
6 楼 benson09 2010-09-08  
根本就跑不了, SSLContext TSL implementation not found
5 楼 momoch1314 2010-04-26  
tengji900 写道
有谁跑通过该程序请多指教啊
我只能跑通纯java版本的啊


我开头已经说明:java本身没有BouncyCastle密库,而android使用的正好是BouncyCastle密库,所以你要提前配置好BouncyCastle密库,生成的密钥格式也要是BKS格式的,你在网上搜搜,有教BouncyCastle密库的配置。
如何生成密钥和对证书的加载网上也有
4 楼 momoch1314 2010-04-26  
tengji900 写道
谁知道这个在Android的客户端证书是个什么格式的
我的就是跑不通(java版的没有问题)


这个需要把证书加载进密钥库中,程序是通过密钥库确认证书的

3 楼 tengji900 2010-04-18  
有谁跑通过该程序请多指教啊
我只能跑通纯java版本的啊
2 楼 tengji900 2010-04-18  
谁知道这个在Android的客户端证书是个什么格式的
我的就是跑不通(java版的没有问题)
1 楼 tengji900 2010-04-16  
楼主可否把程序打包让我们下载啊……只有这些我还是不能跑通

相关推荐

    android+java ssldemo

    在Android平台上,SSL(Secure Sockets Layer)与TLS(Transport Layer Security)协议是用于实现安全网络通信的关键技术。本文将深入探讨"android+java ssldemo"中的核心知识点,包括SSL/TLS协议的工作原理、双向...

    Android双向SSL例子

    8. **异常处理**:在实现过程中,需要处理各种可能出现的SSL异常,如证书未找到、证书过期、握手失败等,以确保应用的健壮性。 通过以上步骤,你可以理解并实现这个"Android双向SSL例子"。在实际项目中,确保遵循...

    ssl_android.zip_TLS_android_android ssl_application_ssl/tls

    在Android平台上,SSL/TLS被广泛应用于移动应用程序中,以确保用户数据的隐私和完整性。本篇文章将深入探讨Android应用程序如何利用SSL/TLS进行安全通信。 一、SSL/TLS协议基础 SSL/TLS协议的主要目的是为网络通信...

    Android SSL证书验证原理

    本篇文章将深入探讨Android平台上的SSL证书验证原理,包括SSL证书交换流程、SSL握手与验证过程以及数字证书、公钥和密钥的管理。 #### 二、SSL证书交换流程 当Android应用尝试访问一个HTTPS站点时,会发起一个SSL...

    SSLSocket通信Demo android版

    注意,SSLSocket在建立连接时会进行SSL握手,验证对方的身份。 5. **数据传输**:连接建立后,就可以通过SSLSocket的输入输出流进行加密的数据传输了。数据在传输过程中会被自动加密和解密。 6. **Eclipse DEMO**...

    android ssl

    在Android平台上,SSL(Secure Sockets Layer)是用于加密网络通信和确保数据安全的重要组成部分。在Android 7.0及更高版本中,系统对SSL的支持发生了一些变化,导致某些应用程序可能遇到兼容性问题。本篇将详细介绍...

    tomcat android 双向ssl通信

    - **代码实现细节**:在编程实现SSL通信时,需要注意加载证书、握手及访问等细节,确保每一步都正确执行。 通过这些步骤和概念的介绍,我们能够更深入地理解Tomcat与Android平台之间双向SSL通信的配置过程,以及在...

    Android SSL 安全访问HTTPS服务器案例

    SSL握手过程中,客户端会验证服务器的身份,确保与之通信的是预期的目标服务器,而不仅仅是冒充者。 在Android中,SSL安全访问主要涉及以下关键步骤: 1. **配置信任的证书**:默认情况下,Android系统信任由受...

    OpenSSL 1.1.1a for Android(已编译)

    通过提供这三种架构的编译版本,该库可以在大部分现代 Android 设备上运行。 在 Android Studio 中测试并使用 NDK 编译,意味着这个 OpenSSL 实现是专门为 Android 开发环境设计的。Android NDK(Native ...

    Android代码-基于ssl(安全套接层)的安全传输信任X。509证书。.zip

    本资源主要探讨了如何在Android应用中实现基于SSL的安全传输,并信任自定义的X.509证书。 首先,理解SSL/TLS的核心概念。这两个协议的主要目的是在客户端(如Android设备)和服务器之间建立一个加密的通道,以防止...

    客户端与服务器SSL双向认证(客户端:Android-服务端:vc)

    7. **SSL握手**:在SSL连接建立时,客户端和服务器会进行一系列的握手步骤,包括证书交换、密钥协商等,以确保双方的身份都被正确验证。 8. **错误处理**:在实施过程中,可能会遇到如证书未找到、证书不受信任、...

    AndroidHttpClient访问Tomcat双向SSL验证服务器.pdf

    通过这种方式可以更好地理解SSL握手过程和双向认证的实现细节。 - 更多关于Java实现SSL双向认证的信息可参考:“java实现SSL双向认证”。 3. **OpenSSL命令行测试**: - 使用`OpenSSL`命令行工具直接连接到`...

    android通信机制所有demo打包(socket,http,ssl)

    处理HTTPS时,需要注意证书验证和SSL握手过程,以确保与服务器的通信是安全的。 4. **HTTP与Socket的区别**:HTTP是一种更高级别的协议,提供了丰富的报文结构和错误处理,适合于Web服务的交互。而Socket则更底层,...

    OpenSSL加密通信文档.7z

    本主题聚焦于OpenSSL库在实现SSL(Secure Socket Layer)加密通信中的应用,以及如何在Android上进行网络编程。OpenSSL是一个强大的安全套接层(SSLv2/v3)和传输层安全(TLSv1/x)协议实现库,它包含了各种加密算法...

    Android OpenSSL实例(调试通过)

    在Android平台上,OpenSSL库被广泛用于实现安全套接层(SSL)和传输层安全(TLS)协议,这些协议是互联网通信中确保数据安全的重要工具。本文将详细讲解如何在Android应用中集成并使用OpenSSL,同时提供一个调试通过的...

    SSL 连接工具

    SSL(Secure Sockets Layer)连接工具是用于在互联网上实现安全通信的重要软件工具。SSL,全称为安全套接层,是一种网络安全协议,旨在确保网络数据传输的安全性,防止信息被窃取或篡改。它通过加密技术,为互联网...

    客户端与服务器SSL双向认证(客户端:java-服务端:java)

    - 配置ServerSocket:在ServerSocket上启用SSL,通过SSLContext的getServerSocketFactory()方法创建SSLServerSocket,并监听指定端口。 3. **配置客户端**: - 信任服务器证书:将服务器的证书导入到客户端的...

    openssl_lib_android

    2. 安全通信:在实现HTTPS连接时,OpenSSL库是核心组件,它负责证书验证、握手过程和数据加密。通过SSL_CTX对象,开发者可以设置各种安全策略,并创建SSL连接。 3. 证书管理:OpenSSL库还包含了处理X.509证书的工具...

    Android Native TCP C语言实现Server创建和Client连接

    在Android平台上,有时候我们需要在原生层(Native)进行TCP通信,这通常涉及到C或C++编程。本篇文章将深入探讨如何使用C语言在Android Native层实现TCP服务器(Server)的创建以及客户端(Client)的连接。我们将...

    Oepnssl库 Android端 armeabi-v7a系统

    OpenSSL库是加密和安全通信领域的一个重要工具,尤其在Android平台上,它为开发者提供了实现SSL/TLS协议以及各种加密算法的功能。armeabi-v7a是Android架构的一种,主要针对带有ARMv7指令集的处理器,这是Android...

Global site tag (gtag.js) - Google Analytics