java ssl编程_Java-JSSE-SSL/TLS编程代码实例-单向认证

也可以选择使用单向认证,这种情况下client侧不需要提供证书。所以,

server侧只需要自己的keystore文件,不需要truststore文件

client侧不需要自己的keystore文件,只需要truststore文件(其中包含server的公钥)。

此外server侧需要在创建SSLServerSocket之后设定不需要客户端证书:setNeedClientAuth(false)

server代码

package learning.net.ssl;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.security.KeyStore;

import java.security.cert.X509Certificate;

import javax.net.ssl.HandshakeCompletedEvent;

import javax.net.ssl.HandshakeCompletedListener;

import javax.net.ssl.KeyManagerFactory;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLPeerUnverifiedException;

import javax.net.ssl.SSLServerSocket;

import javax.net.ssl.SSLServerSocketFactory;

import javax.net.ssl.SSLSocket;

public class CatServerNoClientAuth implements Runnable, HandshakeCompletedListener {

public static final int SERVER_PORT = 11123;

private final Socket _s;

public CatServerNoClientAuth(Socket s) {

_s = s;

}

public static void main(String[] args) throws Exception {

String serverKeyStoreFile = "c:\\_tmp\\catserver.keystore";

String serverKeyStorePwd = "catserverks";

String catServerKeyPwd = "catserver";

KeyStore serverKeyStore = KeyStore.getInstance("JKS");

serverKeyStore.load(new FileInputStream(serverKeyStoreFile), serverKeyStorePwd.toCharArray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

kmf.init(serverKeyStore, catServerKeyPwd.toCharArray());

SSLContext sslContext = SSLContext.getInstance("TLSv1");

sslContext.init(kmf.getKeyManagers(), null, null);

SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();

SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(SERVER_PORT);

sslServerSocket.setNeedClientAuth(false);

while (true) {

SSLSocket s = (SSLSocket)sslServerSocket.accept();

CatServerNoClientAuth cs = new CatServerNoClientAuth(s);

s.addHandshakeCompletedListener(cs);

new Thread(cs).start();

}

}

@Override

public void run() {

try {

BufferedReader reader = new BufferedReader(new InputStreamReader(_s.getInputStream()));

PrintWriter writer = new PrintWriter(_s.getOutputStream(), true);

writer.println("Welcome~, enter exit to leave.");

String s;

while ((s = reader.readLine()) != null && !s.trim().equalsIgnoreCase("exit")) {

writer.println("Echo: " + s);

}

writer.println("Bye~");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

_s.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

@Override

public void handshakeCompleted(HandshakeCompletedEvent event) {

try {

X509Certificate cert = (X509Certificate) event.getPeerCertificates()[0];

} catch (SSLPeerUnverifiedException ex) {

System.out.println("handshakeCompleted, SSLPeerUnverified.");

}

}

}

client代码

package learning.net.ssl;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.security.KeyStore;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSocketFactory;

import javax.net.ssl.TrustManagerFactory;

public class FoxClientNoClientAuth {

public static void main(String[] args) throws Exception {

String clientTrustKeyStoreFile = "c:\\_tmp\\foxclienttrust.keystore";

String clientTrustKeyStorePwd = "foxclienttrustks";

KeyStore clientTrustKeyStore = KeyStore.getInstance("JKS");

clientTrustKeyStore.load(new FileInputStream(clientTrustKeyStoreFile), clientTrustKeyStorePwd.toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(clientTrustKeyStore);

SSLContext sslContext = SSLContext.getInstance("TLSv1");

sslContext.init(null, tmf.getTrustManagers(), null);

SSLSocketFactory socketFactory = sslContext.getSocketFactory();

Socket socket = socketFactory.createSocket("localhost", CatServer.SERVER_PORT);

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

send("hello", out);

send("exit", out);

receive(in);

socket.close();

}

public static void send(String s, PrintWriter out) throws IOException {

System.out.println("Sending: " + s);

out.println(s);

}

public static void receive(BufferedReader in) throws IOException {

String s;

while ((s = in.readLine()) != null) {

System.out.println("Reveived: " + s);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值