- 浏览: 258929 次
- 性别:
- 来自: 深圳
最新评论
-
whizkid:
[img] private void enableNdefEx ...
android通过NFC读写数据 -
zhangminglife:
您好!不错,最近正在弄这个东西,能否把demo发给我一份谢谢了 ...
SSL双向认证java实现(转) -
water卡:
android如何调用显示和隐藏系统默认的输入法 -
water卡:
android如何调用显示和隐藏系统默认的输入法 -
sjp524617477:
good
生成android使用的BKS证书
Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库
服务端:
Java代码
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);
}
}
}
客户端:
Java代码
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();
}
}
服务端:
Java代码
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);
}
}
}
客户端:
Java代码
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();
}
}
发表评论
-
Android APK 签名比对
2014-04-10 14:11 668发布过Android应用的朋友 ... -
Android小知识点
2014-04-10 09:45 7131、 最近翻看以前的项目时候,想更改下布局文件,谁知道就改了 ... -
Android 获取基站信息
2013-10-18 10:39 1060Android 基站分CdmaCellLocation和Gsm ... -
Android 打开PDF,PPT,WORD,EXCEL,CHM,HTML,TEXT,AUDIO,VIDEO 格式文件代码
2013-03-15 16:42 1805import android.app.Activity; im ... -
Android平板上开发App的准则
2013-03-14 11:38 11111、保证符合App的通用开发准则 在谈Android平板A ... -
android程序发布时的常用工具
2012-07-12 14:38 10591.为应用程序设定版本,在应用程序清单文件中设置。 ... -
java CA证书相关操作,Android,java
2012-06-11 16:16 3474一:需要包含的包 import java.securi ... -
Android PhoneGap简析
2012-05-22 10:52 3759前言 上周研究了一下Pho ... -
android播放多媒体的两种方式
2012-05-19 21:42 1038转载,原文地址:http://blog.csdn.net/xi ... -
android通过NFC读写数据
2012-05-17 15:56 4142/* * Writes an NdefMessage to a ... -
NFC相关研究
2012-05-15 14:07 1167NFC概述 NFC是短距离的无线通信,通常距 ... -
Android 面试题
2012-05-15 14:05 993Android 面试题 经典 1、 Android dvm的进 ... -
生成android使用的BKS证书
2012-05-10 12:21 2899生成android使用的BKS证书 android 系统中 ... -
windows+eclipse+cygwin+cdt+ndk
2012-03-07 10:34 1012一:什么是NDK? NDK 提 ... -
在android2.1如何实现对ssl的无证书访问?(转)
2012-03-01 17:25 2631在网上看了,httpchlent的 ... -
Android系统目录结构详解(转)
2012-03-01 10:34 1139Android系统基于linux内核、JAVA应用,算是一 ... -
Android开发规范(转)
2012-03-01 10:20 828Android开发规范 一、Andr ... -
如何让Android程序支持安装到SD卡(APP2SD)
2012-02-29 15:19 1006Android系统在2.1版本之前,应用程序是只能安装到机身内 ... -
生成android的bks证书
2011-07-14 15:40 3330生成android的bks证书 pushd %CD% cd / ... -
系统文件夹功能详谈
2011-07-13 17:46 958【文件夹功能简介】 \system\app 这个里面主要存放 ...
相关推荐
在Android平台上,SSL(Secure Sockets Layer)与TLS(Transport Layer Security)协议是用于实现安全网络通信的关键技术。本文将深入探讨"android+java ssldemo"中的核心知识点,包括SSL/TLS协议的工作原理、双向...
8. **异常处理**:在实现过程中,需要处理各种可能出现的SSL异常,如证书未找到、证书过期、握手失败等,以确保应用的健壮性。 通过以上步骤,你可以理解并实现这个"Android双向SSL例子"。在实际项目中,确保遵循...
本篇文章将深入探讨Android平台上的SSL证书验证原理,包括SSL证书交换流程、SSL握手与验证过程以及数字证书、公钥和密钥的管理。 #### 二、SSL证书交换流程 当Android应用尝试访问一个HTTPS站点时,会发起一个SSL...
在Android平台上,SSL/TLS被广泛应用于移动应用程序中,以确保用户数据的隐私和完整性。本篇文章将深入探讨Android应用程序如何利用SSL/TLS进行安全通信。 一、SSL/TLS协议基础 SSL/TLS协议的主要目的是为网络通信...
注意,SSLSocket在建立连接时会进行SSL握手,验证对方的身份。 5. **数据传输**:连接建立后,就可以通过SSLSocket的输入输出流进行加密的数据传输了。数据在传输过程中会被自动加密和解密。 6. **Eclipse DEMO**...
在Android平台上,SSL(Secure Sockets Layer)是用于加密网络通信和确保数据安全的重要组成部分。在Android 7.0及更高版本中,系统对SSL的支持发生了一些变化,导致某些应用程序可能遇到兼容性问题。本篇将详细介绍...
- **代码实现细节**:在编程实现SSL通信时,需要注意加载证书、握手及访问等细节,确保每一步都正确执行。 通过这些步骤和概念的介绍,我们能够更深入地理解Tomcat与Android平台之间双向SSL通信的配置过程,以及在...
SSL握手过程中,客户端会验证服务器的身份,确保与之通信的是预期的目标服务器,而不仅仅是冒充者。 在Android中,SSL安全访问主要涉及以下关键步骤: 1. **配置信任的证书**:默认情况下,Android系统信任由受...
通过提供这三种架构的编译版本,该库可以在大部分现代 Android 设备上运行。 在 Android Studio 中测试并使用 NDK 编译,意味着这个 OpenSSL 实现是专门为 Android 开发环境设计的。Android NDK(Native ...
本资源主要探讨了如何在Android应用中实现基于SSL的安全传输,并信任自定义的X.509证书。 首先,理解SSL/TLS的核心概念。这两个协议的主要目的是在客户端(如Android设备)和服务器之间建立一个加密的通道,以防止...
7. **SSL握手**:在SSL连接建立时,客户端和服务器会进行一系列的握手步骤,包括证书交换、密钥协商等,以确保双方的身份都被正确验证。 8. **错误处理**:在实施过程中,可能会遇到如证书未找到、证书不受信任、...
通过这种方式可以更好地理解SSL握手过程和双向认证的实现细节。 - 更多关于Java实现SSL双向认证的信息可参考:“java实现SSL双向认证”。 3. **OpenSSL命令行测试**: - 使用`OpenSSL`命令行工具直接连接到`...
处理HTTPS时,需要注意证书验证和SSL握手过程,以确保与服务器的通信是安全的。 4. **HTTP与Socket的区别**:HTTP是一种更高级别的协议,提供了丰富的报文结构和错误处理,适合于Web服务的交互。而Socket则更底层,...
本主题聚焦于OpenSSL库在实现SSL(Secure Socket Layer)加密通信中的应用,以及如何在Android上进行网络编程。OpenSSL是一个强大的安全套接层(SSLv2/v3)和传输层安全(TLSv1/x)协议实现库,它包含了各种加密算法...
在Android平台上,OpenSSL库被广泛用于实现安全套接层(SSL)和传输层安全(TLS)协议,这些协议是互联网通信中确保数据安全的重要工具。本文将详细讲解如何在Android应用中集成并使用OpenSSL,同时提供一个调试通过的...
SSL(Secure Sockets Layer)连接工具是用于在互联网上实现安全通信的重要软件工具。SSL,全称为安全套接层,是一种网络安全协议,旨在确保网络数据传输的安全性,防止信息被窃取或篡改。它通过加密技术,为互联网...
- 配置ServerSocket:在ServerSocket上启用SSL,通过SSLContext的getServerSocketFactory()方法创建SSLServerSocket,并监听指定端口。 3. **配置客户端**: - 信任服务器证书:将服务器的证书导入到客户端的...
2. 安全通信:在实现HTTPS连接时,OpenSSL库是核心组件,它负责证书验证、握手过程和数据加密。通过SSL_CTX对象,开发者可以设置各种安全策略,并创建SSL连接。 3. 证书管理:OpenSSL库还包含了处理X.509证书的工具...
在Android平台上,有时候我们需要在原生层(Native)进行TCP通信,这通常涉及到C或C++编程。本篇文章将深入探讨如何使用C语言在Android Native层实现TCP服务器(Server)的创建以及客户端(Client)的连接。我们将...
综上所述,WebSocket在Android上的应用极大地推动了实时交互类应用的发展,通过合理的实现和优化,开发者可以构建出高效、低延迟的移动应用。同时,理解WebSocket的工作原理和使用方式,以及在Android平台上的最佳...