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();
}
}
分享到:
相关推荐
Qt实现的SSL通信客户端和服务器
这个是我通过学习总结的资料,介绍了如何SSLSocket的一些简单的知识,以及介绍了如何利用JDK自带的keytool工具生成密钥库、证书等,还有Demo作为例子,很好的学习资料。
由于在SSL握手协议中最耗费计算资源和造成客户端与服务器端计算不平衡的步骤是服务器端解密运算,提出了客户端平衡的密钥交换算法,用来加速SSL会话的初始化和承担服务器端的解密的预运算。对算法中的同时对多个客户...
主要给大家介绍了关于如何利用C#实现SSLSocket加密通讯的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
SSL交互和握手过程 SSL消息按如下顺序发送: 1.Client Hello 客户发送服务器信息,包括它所支持的密码组。密码组中有密码算法和钥匙大小; 2.Server Hello 服务器选择客户和服务器都支持的密码组到客户。 3....
客户端与服务器SSL双向认证(客户端:java-服务端:java):详细的过程,注意事项,运行成功!
含有SSL握手的服务器和客户端,绝对超值
ssl服务器证书(包含ca证书和服务器证书客户端证书)
android ssl证书验证
SSL代理客户端.rar
基于Python,以CA认证为基础,通过SSL握手协议交换密钥,实现AES加密通信的聊天室
SSL(安全套接层)握手协议利用公开密钥体制(RSA)保护通信实体之间传输信息的机密性和完整性,其存在信息处理速度过慢的缺点,基于batch RSA的SSL握手协议能较好地解决这一问题,但当服务器收到大量客户端请求或遭受...
飞塔最新SSL独立客户端软件,精简程序无病毒防护功能,飞塔最新SSL独立客户端软件,精简程序无病毒防护功能
weblogic客户端ssl证书,服务器证书安装配置指南
macos使用,seco client macosx-7.0.2.26
基于国密算法的Android智能终端SSL协议设计与实现.pdf
基于openssl的socket代码的ssl服务器客户端通讯例子。典型例子。VC工程,ssl通讯socket,服务端和客户端,简单易懂。
SSL代理客户端,证书设置,连接,SSL_Sock_Connect,内部_网络事件处理,内部_断开连接,内部_收到代理数据,辅_取socks协商包1,辅_取目标地址连接包,辅_取密码连接包,发送数据,取回数据,断开代理服务器,网络事件_处理子...
SSLkeylog 一个Ruby库,它以记录来自客户端连接的SSL会话密钥。 分析网络流量时,诸如的工具可以使用此日志来解密数据。 注意:此版本的库是功能原型。 将来可能会更改实现。安装该gem使用C扩展名从Ruby OpenSSL::...