1、Keytool是java自带的证书制作工具(命令格式 keytool 功能 参数 参数)。也可以使用更强大openssl工具。
2、生成密钥对
keytool -genkey -alias winkey2 -keystore winKeyStore.jks
需要给出密钥的名称-alias winkey2,密钥仓库 winKeyStore.jks。没有这个文件就会自动新建一个,有的话就会将创建的密钥追加进去。
3、密钥仓库有密码,可以存储多个密钥,也可以删除其中的密钥。
keytool -list -keystore winKeyStore.jks
keytool -delete -keystore winKeyStore.jks --如果不写密钥名称,则提示输入密钥名称
4、制作证书
keytool -export -alias ssl1 -file d:/ssl1.cer -keystore d:/serverkey.jks
5、导入证书到另外一个keystore
keytool -import -file gfssl.cer -keystore trustKeyStore.jks
6、-genkey 和 -genkeypair 功能相同,早期是-genkey,后来改为-genkeypair,为了向前兼容,两个都保留了。
参见官方的帮助文档 http://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
百度搜索 keytool oracle
2、生成密钥对
keytool -genkey -alias winkey2 -keystore winKeyStore.jks
需要给出密钥的名称-alias winkey2,密钥仓库 winKeyStore.jks。没有这个文件就会自动新建一个,有的话就会将创建的密钥追加进去。
3、密钥仓库有密码,可以存储多个密钥,也可以删除其中的密钥。
keytool -list -keystore winKeyStore.jks
keytool -delete -keystore winKeyStore.jks --如果不写密钥名称,则提示输入密钥名称
4、制作证书
keytool -export -alias ssl1 -file d:/ssl1.cer -keystore d:/serverkey.jks
5、导入证书到另外一个keystore
keytool -import -file gfssl.cer -keystore trustKeyStore.jks
6、-genkey 和 -genkeypair 功能相同,早期是-genkey,后来改为-genkeypair,为了向前兼容,两个都保留了。
参见官方的帮助文档 http://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
百度搜索 keytool oracle
7、java sslsocket例子
import javax.net.ssl.SSLServerSocketFactory;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyStore;
public class ServerSocket {
public static void main(String[] args) throws Exception {
System.setProperty("javax.net.ssl.keyStore","/code/java/keystore/mykeystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword","gaofeng");
ServerSocket socket = SSLServerSocketFactory.getDefault().createServerSocket(40001);
while (true){
Socket s = socket.accept();
new MyThread(s).start();
}
}
}
class MyThread extends Thread{
private Socket s;
public MyThread(Socket s){
this.s = s;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
OutputStream writer = s.getOutputStream();
writer.write(("hello,"+s.getInetAddress()+"\n").getBytes());
while(true){
String info = reader.readLine();
if(info.equals("Bye")){
break;
}else{
System.out.println(info);
writer.write((info+":"+ System.currentTimeMillis() +"\n").getBytes());
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
8、client的例子
import java.net.Socket;
import javax.net.ssl.SSLSocketFactory;
public class SocketClient {
public static void main(String[] args) throws Exception {
System.setProperty("javax.net.ssl.trustStore","D:/test/trustKeyStore.jks");//设置可信任的密钥仓库
System.setProperty("javax.net.ssl.trustStorePassword","gaofeng"); //设置可信任的密钥仓库的密码
Socket csocket = SSLSocketFactory.getDefault().createSocket("192.168.100.1", 40001);// 创建并连接服务器
BufferedReader socketIn = new BufferedReader(new InputStreamReader(csocket.getInputStream()));// 接受到的信息
BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));// 用户输入信息
while (true) {
String s = socketIn.readLine();
System.out.println("Server Message: " + s);
String s2 = userIn.readLine();
csocket.getOutputStream().write((s2 + "\n").getBytes());
}
}
}