Tongsuo-Java-SDK, TLS 1.3 + 商密套件示例代码
客户端,TLS 1.3 + 商密套件
TongsuoClient.java
src/main/java/demo/TongsuoClient.java如下:
测试证书chain.crt。
package demo;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import net.tongsuo.TongsuoProvider;
import net.tongsuo.TongsuoX509Certificate;
public class TongsuoClient {
public static void main(String[] args)throws Exception{
//设置服务端ip和端口
String ip = "127.0.0.1";
int port = 443;
//加密套件,多个以:分隔
String ciperSuites = "TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3";
//ca证书,不传则不校验ca证书
String caCert = "chain.crt";
//构建ssl连接上下文
SSLContext sslContext = SSLContext.getInstance("TLSv1.3", new TongsuoProvider());
X509Certificate ca = null;
if(caCert != null && "".equals(caCert.trim())){
ca = TongsuoX509Certificate.fromX509PemInputStream(new FileInputStream(new File(caCert)));
}
final X509Certificate caCertificate = ca;
TrustManager[] tms = new TrustManager[] { new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType)throws CertificateException{
//ca证书校验
if(caCertificate != null){
for (X509Certificate cert : certs) {
try {
cert.checkValidity();
cert.verify(caCertificate.getPublicKey());
} catch (Exception e) {
e.printStackTrace();
throw new CertificateException(e);
}
}
}
}
} };
sslContext.init(null,tms, new SecureRandom());
System.out.println("Client SSL context init success...");
//构建socket工厂
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket sslSocket = (SSLSocket)socketFactory.createSocket(ip, port);
//设置加密套件
if(ciperSuites != null && !"".equals(ciperSuites.trim())){
String[] ciperSuiteArray = ciperSuites.split(":");
sslSocket.setEnabledCipherSuites(ciperSuiteArray);
}
//向服务端发送消息
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream()));
out.write("GET / HTTP/1.0\r\n\r\n");
out.flush();
System.out.println("client ssl send msessage success...");
//读取服务端响应
BufferedInputStream streamReader = new BufferedInputStream(sslSocket.getInputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(streamReader, "utf-8"));
String line = null;
while((line = bufferedReader.readLine())!= null){
System.out.println("client receive server data:" + line);
}
//等待服务端响应
while (true) {
try {
sslSocket.sendUrgentData(0xFF);
Thread.sleep(1000L);
System.out.println("client waiting server close");
} catch (Exception e) {
bufferedReader.close();
out.close();
sslSocket.close();
}
}
}
}