在Android上实现SSL握手

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 android ssl socket通讯 java android 的ssl socket通讯,X509运行 立即下载

相关推荐

避坑指南:ZYNQ MPSOC QSPI固化时MT25QU256闪存的特殊配置

本文针对Xilinx ZYNQ UltraScale+ MPSoC平台,详细解析了使用Vitis工具将BOOT.bin固化至Micron MT25QU256ABA QSPI NOR Flash时的特殊配置与避坑指南。重点阐述了Init文件的真实作用、电压与频率的精确匹配策略,以及针对该闪存型号的初始化序列,帮助工程师解决烧录失败、启动异常等常见问题,确保系统可靠启动。

weixin_29175469的博客 271

android中SSLServerSocket通讯

记录SSLServerSocket在android端通讯 1.证书生成及SSL双向认证加密参照文章:Android 上SSL Socket双向认证加密通信 2.关于证书转换jks转bks(android端证书) 使用工具根据本机jdk版本下载对应工具(本例jdk1.8):bcprov-jdk15on-1.49.jar, 命令:keytool -importkeystore -srckeys...

wjcommen的博客 576

学习Python,小白如何搭建Python环境?

学习Python,首先需要搭建好Python环境,主要分为【运行环境搭建】、【开发环境搭建】以及【Python环境配置】三个环节,接下来我将对Python环境搭建这三个部分进行介绍。

weixin_72923265的博客 9005

Android APP 通过socket和server通信,缺少SSL证书导致通信失败 问题解决

重命名“cert.pem”为“6187b673.0”(查看命令执行后第一行字符串+.0),并将文件“6187b673.0”通过 Root 文件管理器、adb 等保存至 Android 设备目录“/system/etc/security/cacerts/”下;设置->安全->加密与凭据->信任的凭据,请check一下有没有这些SSL证书。手机上安装方法:选择菜单:从存储设备安装。下载pem和txt,组合成Android cert文件。

weixin_45494251的博客 620

局域网ip冲突检测工具_python 小工具实现 windows笔记本与 ipad数据互传

宅在家没事的时候就开始琢磨ipad的进阶使用,由于没有mac无法隔空投送,ipad与windows的数据交互表现极差,所以设计了这个ftp小工具。当然,这个工具不仅仅能用于windows与ipad,还可以用于局域网任意两台设备之间程序源码与下载见文章末尾使用说明windows端:biubiubiu.exeipad端: appsotre下载 FE文件管理器windows端操作在c盘下创建ftp目录...

weixin_39866265的博客 4436

用Arduino和FS-i6X遥控器,从零开始打造你的第一只仿生扑翼蝴蝶(附完整代码解析)

本文详细介绍了如何利用Arduino和FS-i6X遥控器从零开始制作仿生扑翼蝴蝶,包括硬件准备、电路连接、代码解析和调试技巧。通过完整的代码示例和参数说明,帮助读者快速掌握仿生机器人的制作要点,实现蝴蝶的自然飞行效果。

weixin_28727975的博客 310

android socket session,Android的SSLServerSocket会导致App,OOM中的原生内存增加

背景我正在开发一个提供一个简单的HTTP / HTTPS服务器的Android应用程序。如果配置了HTTPS服务,那么在每个连接上都会观察到越来越多的本地内存使用量,最终导致应用程序崩溃(oom),而使用HTTP配置会使本机内存使用率保持不变。应用程序的Java VM在两个配置中保持相对不变。该应用程序提供HTML页面,其中包含定期轮询(每秒一次json轮询)的JavaScript,因此使用HTT...

weixin_33608494的博客 337

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 335

Android okhttp3 SSL握手底层实现追踪

对于https,在tcp三次握手后就会进行ssl的握手,ssl握手的详细过程网上介绍的很多。下面跟踪下okhttp3对于ssl握手的实现过程。需求决定android版本4.4.4,所以还是openssl,okhttp3.2.0。 openssl代码:https://android.googlesource.com/platform/external/openssl.git okhttp3代码:h

@毛宏斌 5626

手把手教你为智能手表DIY一个离线导航:LVGL + SD卡地图实战

本文详细介绍了如何为智能手表DIY一个离线导航系统,结合LVGL图形库和SD卡地图数据。从硬件选型、地图数据处理到LVGL地图引擎实现,提供了完整的实战指南,特别适合户外运动爱好者和嵌入式开发者。文章还分享了功耗优化、性能提升等实用技巧,帮助读者打造高效的离线导航解决方案。

weixin_42570484的博客 206

华为OD机试真题 新系统-字符串格式调整(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【字符串格式调整】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串格式调整】多语言题解

qq_45776114的博客 1142

android 实现SSL握手协商

Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库 ssl通道建立前必须进行协商(形成安全的通道--隧道技术)。 服务端: View Code 1 public class SSLServer { 2 3 private static fina...

weixin_33842304的博客 1275

【Unity】【2D】用连续图片生成动画Animation的简明步骤

本文介绍了Unity中使用2D连续图片制作2D动画Animation的简明步骤。

O青草O的博客 Unity和游戏制作知识分享 718

转载:在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互

本文从这里拷贝而来:http://www.cnblogs.com/macroxu-1982/archive/2011/09/16/2178763.html 感谢原创作者、感谢转载者。 转载:在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互 Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可

H_O_W_E的专栏 3360

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android okhttp3 底层,Android okhttp3 SSL握手底层实现追踪

对于https,在tcp三次握手后就会进行ssl的握手,ssl握手的详细过程网上介绍的很多。下面跟踪下okhttp3对于ssl握手的实现过程。在okhttp3.internal.io.RealConnection#connectSocket中private void connectSocket(int connectTimeout, int readTimeout, int writeTimeou...

weixin_34236334的博客 259

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【转】在Android上实现SSL握手

Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库 服务端:  Java代码   public class SSLServer {          private static final int SERVER_PORT = 50030;     ...

gdfdfg的专栏 151

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

在Android上实现SSL握手,实现服务器和客户端之间Socket交互

<!-- .pcb {margin-right:0} -->   服务端: Java代码 Java代码 public class SSLServer {          private static final int SERVER_PORT = 50030;       private static final S

专注Android开发 2620

android socket握手,在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互...

publicclassMySSLSocketextendsActivity{privatestaticfinalintSERVER_PORT=50030;//端口号privatestaticfinalStringSERVER_IP="218.206.176.146";//连接IPprivatestaticfinalStringCLIENT_KET_PASS...

weixin_36337403的博客 538

在Android上实现SSL握手(客户端需要密钥和证书),实现服务

from:  http://www.apkbus.com/forum.php?mod=viewthread&tid=14177 Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库  服务端:  Java代码  Java代码

Adrian 博客 2158

android ssl验证、https验证

一、关于SSL   1、什么是SSL?  SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。   SSL/TLS协议位于HTTP协议与传输层协议之间,采用公钥技术,为两个应用间的通讯提供加密、完整性校验以

logo616的专栏 1万+

Android 10 SSL双向认证握手失败

Android 10 SSL双向认证握手失败 公司项目前端时间遇到的一个问题(已经解决了),最近有时间准备分享一下。 项目工程中一直使用SSL双向认证的套接字通信方式,前段时间有Android 10的用户反馈他们的手机无法正常登录了。于是,我追踪这个问题,发现是双向认证时握手失败(瞬间懵逼了),以前对这块不熟。报错如下: 于是各种度娘、Google、QQ技术群咨询,都没有找到好的解决方案。最终在Android开发者平台上查看Android 10最新特性时发现了一个亮点(https://developer.a

qq_35478688的博客 1283

认证android retrofit,Android Retrofit和OkHttpClient错误在后端SSL握手让我们加密认证

我真的不知道如何解决这个问题,这个项目它是一个Android和iOs应用程序与Docker容器服务器上的RoR后端API ...Android Retrofit和OkHttpClient错误在后端SSL握手让我们加密认证在Android应用程序中,我使用了Retrofit Library来实现api客户端实现,并且一切工作都很完美......直到SSL证书在服务器上实现为止。我的合作伙伴使用Let...

weixin_29901515的博客 481
上一篇: Android开发网上的一些重要知识点 [2]
下一篇: ssl登录过程 CA证书原理
LuckLiu521
博客等级 码龄21年 6粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值