这里使用Java作为服务端,使用Qt作为客户端。

程序运行截图如下:

这里的证书Qt使用的p12,Java使用的jks,看以前的博文生成。

源码打包下载地址:

https://github.com/fengfanchen/Java/tree/master/Ssl_QtClient_JavaServer

Qt客户端源码:

源码如下:

QSSLClient.h

#ifndef QSSLCLIENT_H
#define QSSLCLIENT_H#include <QObject>
#include <QSslError>QT_BEGIN_NAMESPACE
class QSslCertificate;
class QSslKey;
class QSslSocket;
QT_END_NAMESPACEclass QSSLClient : public QObject
{Q_OBJECT
public:QSSLClient(QObject *parent = nullptr);~QSSLClient();void connectServer();void sendMsg(const QString &msg);void closeSocket();Q_SIGNALS:void disconnected(void);protected:void loadCertificate();private slots:void sslErrors(const QList<QSslError> &errors);void rx(void);void serverDisconnect(void);private:QList<QSslCertificate> m_publicCertificateList;QSslCertificate *m_privateCertificate;QSslKey *m_key;QSslSocket *m_client;
};#endif // QSSLCLIENT_H

main.cpp

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
#include "QSSLClient.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSSLClient sslClient;sslClient.connectServer();sslClient.sendMsg("Hello Server");QTimer::singleShot(2 * 1000, &sslClient, &QSSLClient::closeSocket);return a.exec();
}

QSSLClient.cpp

#include "QSSLClient.h"
#include <QSslSocket>
#include <QSslCertificate>
#include <QFile>
#include <QSslKey>
#include <QJsonDocument>
#include <QList>
#include <QDebug>QSSLClient::QSSLClient(QObject *parent) : QObject(parent)
{m_key = new QSslKey;m_privateCertificate = new QSslCertificate;m_client = new QSslSocket;loadCertificate();connect(m_client, &QSslSocket::readyRead, this, &QSSLClient::rx);connect(m_client, &QSslSocket::disconnected, this, &QSSLClient::serverDisconnect);connect(m_client, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));m_client->addCaCertificates(m_publicCertificateList);m_client->setPrivateKey(*m_key);m_client->setLocalCertificate(*m_privateCertificate);m_client->setPeerVerifyMode(QSslSocket::VerifyPeer);qDebug() << "QSSLClient load over";
}QSSLClient::~QSSLClient()
{delete m_privateCertificate;delete m_client;delete m_key;
}void QSSLClient::connectServer()
{m_client->connectToHostEncrypted("localhost", 19999);if(m_client->waitForEncrypted(5000)){qDebug() << "Authentication Suceeded";}else{qDebug("Unable to connect to server");exit(0);}
}void QSSLClient::sendMsg(const QString &msg)
{m_client->write(msg.toUtf8());
}void QSSLClient::closeSocket()
{if(m_client->disconnect()){m_client->close();qDebug() << "close success";}
}void QSSLClient::loadCertificate()
{QFile p12File(":/res/p_client.p12");if(!p12File.open(QIODevice::ReadOnly)){qDebug() << "The certificate file open failed!";exit(0);}bool ok = QSslCertificate::importPkcs12(&p12File, m_key, m_privateCertificate, &m_publicCertificateList, "cccccc");if(!ok){qDebug() << "The certificate import error!";exit(0);}p12File.close();
}void QSSLClient::sslErrors(const QList<QSslError> &errors)
{foreach (const QSslError &error, errors)qDebug() << error.errorString();
}void QSSLClient::rx()
{QString getMsg = m_client->readAll();qDebug() << getMsg;
}void QSSLClient::serverDisconnect()
{
//    m_client->close();
//    exit(0);
}

Java服务端源码:

SslContextProvider.java

package cn.it1995;import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;public interface SslContextProvider {TrustManager[] getTrustManagers() throws Exception;KeyManager[] getKeyManagers() throws Exception;String getProtocol();
}

SslUtil.java

package cn.it1995;import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
import javax.net.ssl.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
import java.security.*;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;public class SslUtil {private static final String JKS = "JKS";public static KeyManager[] createKeyManagers(String keyStorePath, String password) throws Exception {return createKeyManagers(keyStorePath, password, password);}public static KeyManager[] createKeyManagers(String keyStorePath, String storePassword, String keyPassword) throws Exception {String defaultAlgorithm = KeyManagerFactory.getDefaultAlgorithm();KeyManagerFactory kmInstance = KeyManagerFactory.getInstance(defaultAlgorithm);KeyStore ksInstance = KeyStore.getInstance(JKS);FileInputStream fileInputStream = new FileInputStream(keyStorePath);try{ksInstance.load(fileInputStream, storePassword.toCharArray());}catch (IOException e){e.printStackTrace();}catch (CertificateException e){e.printStackTrace();}finally {if(fileInputStream != null){fileInputStream.close();}}try{kmInstance.init(ksInstance, keyPassword.toCharArray());}catch (UnrecoverableKeyException e){e.printStackTrace();}return kmInstance.getKeyManagers();}public static SSLContext createSSLContext(SslContextProvider provider) throws Exception{SSLContext context = SSLContext.getInstance(provider.getProtocol());context.init(provider.getKeyManagers(), provider.getTrustManagers(), new SecureRandom());return context;}public static SSLServerSocket createSSLServerSocket(int port, SslContextProvider provider) throws Exception {SSLContext sslContext = createSSLContext(provider);SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();SSLServerSocket sslServerSocket = (SSLServerSocket)sslServerSocketFactory.createServerSocket(port);sslServerSocket.setEnabledProtocols(new String[]{provider.getProtocol()});sslServerSocket.setNeedClientAuth(true);return sslServerSocket;}public static SSLSocket createSSLSocket(String host, int port, SslContextProvider provider) throws Exception{SSLContext sslContext = createSSLContext(provider);SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();SSLSocket sslSocket = (SSLSocket)sslSocketFactory.createSocket(host, port);sslSocket.setEnabledProtocols(new String[]{provider.getProtocol()});return sslSocket;}public static TrustManager[] createTrustManagers(String keyStorePath, String password) throws Exception{String defaultAlgorithm = TrustManagerFactory.getDefaultAlgorithm();TrustManagerFactory tmInstance = TrustManagerFactory.getInstance(defaultAlgorithm);KeyStore ksInstance = KeyStore.getInstance(JKS);FileInputStream fileInputStream = new FileInputStream(keyStorePath);try{ksInstance.load(fileInputStream, password.toCharArray());}catch (IOException e){e.printStackTrace();}catch (CertificateException e){e.printStackTrace();}finally {if(fileInputStream != null){fileInputStream.close();}}tmInstance.init(ksInstance);return tmInstance.getTrustManagers();}public static String getPeerIdentity(Socket socket){if(!(socket instanceof SSLSocket)){return null;}SSLSession sslSession = ((SSLSocket)socket).getSession();try{Principal peerPrincipal = sslSession.getPeerPrincipal();return getCommonName(peerPrincipal);}catch (SSLPeerUnverifiedException e){e.printStackTrace();}return "unknown client";}private static String getCommonName(Principal subject){try{LdapName ldapName = new LdapName(subject.getName());for(Rdn rdn : ldapName.getRdns()){if("cn".equalsIgnoreCase(rdn.getType())){return (String)rdn.getValue();}}}catch (Exception e){e.printStackTrace();}return null;}
}

SslServer.java

package cn.it1995;import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;public class SslServer implements SslContextProvider{@Overridepublic TrustManager[] getTrustManagers() throws Exception {return SslUtil.createTrustManagers("D:\\IDEAProject\\SSLDemo\\src\\main\\resources\\server.jks", "cccccc");}@Overridepublic KeyManager[] getKeyManagers() throws Exception {return SslUtil.createKeyManagers("D:\\IDEAProject\\SSLDemo\\src\\main\\resources\\server.jks", "cccccc");}@Overridepublic String getProtocol() {return "TLSv1.2";}private ServerSocket createSSLSocket(int port) throws Exception {SSLServerSocket sslServerSocket = SslUtil.createSSLServerSocket(port, this);return sslServerSocket;}public void run(int port) throws Exception {ServerSocket serverSocket = createSSLSocket(port);System.out.println("服务端启动成功,等待客户端连接 ...... ...... ...... ......");while(true){try(SSLSocket client = (SSLSocket) serverSocket.accept(); OutputStream os = client.getOutputStream(); InputStream is = client.getInputStream()){System.out.println("客户端: " + SslUtil.getPeerIdentity(client) + " 成功连接!");byte[] b = new byte[1024];is.read(b);System.out.println("接收到客户端消息:" + new String(b));System.out.println("发送消息给客户端!");os.write("Hello Client".getBytes());os.flush();System.out.println("发送完成!");}catch (Exception e){e.printStackTrace();}}}public static void main(String[] args) throws Exception {new SslServer().run(19999);}
}

QtJava笔记-Qt与Java进行SSL双向认证(Qt客户端,Java服务端)相关推荐

  1. java自动化测试成长日记-之CVS客户端和服务端安装和部署1:CVS服务端的配置和基本使用...

    CVS服务端的配置和基本使用 在做java自动化测试集成环境搭建的时候,无论怎样,你都会选择一个源代码管理工具,如:SVN,CVS,VSS等:但如果你使用Eclipse工具,建议你使用CVS源代码管理 ...

  2. java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android

    客户端与服务器SSL双向认证(客户端Android-服务端vc)-含源码(一)服务端已经生成了client.p12.server.p12.ca.p12:主要实现客户端过程(二)目录结构(三)客户端注 ...

  3. QtJava笔记-Qt与Java进行SSL双向认证(Qt服务端,Java客户端)

    程序运行截图如下: Qt作为服务端,Java作为客户端. 这里的服务端是用的p12证书,客户端使用的是jks. 具体的生成方式看以前的博文. QSSLServer.h #ifndef QSSLSERV ...

  4. java实现 SSL双向认证

    http://avery-leo.iteye.com/blog/276096 实现技术: JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上 ...

  5. java使用bks双向认证_android客户端SSL单向双向认证

    最近一直在做SSL的研究,前几天写了一篇SSL握手过程的文章,今天写下android客户端SSL单双向认证的示例 操作系统是win7,服务器用的tomcat6,客户端跑在1.6的模拟器上,证书都是自签 ...

  6. Java程序中Socket(关于客户端和服务端实例)

    例如:客户端将d:\1.jpg图片文件上传给服务端,服务端收到后保存到d:\java\a.jpg,服务器端接收完成后,发送"上传成功"回应客户端. 一:客户端实现 package ...

  7. Java网络编程实例---------------------------------基本HTTP客户端及服务端多线程

    HTTP 1.0客户端 package com.bq;import java.io.BufferedReader; import java.io.InputStreamReader; import j ...

  8. SSL双向认证和SSL单向认证的区别

    双向认证 SSL 协议要求服务器和用户双方都有证书.单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥 ...

  9. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别 https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证! https://cloud.te ...

最新文章

  1. WHAT IS ERP
  2. Python Bokeh 库进行数据可视化实用指南
  3. mysql字段说明_mysql 字段类型说明
  4. html / css学习笔记-1
  5. html5 动态 menuitem,利用HTML 5中的Menu和Menuitem元素快速创建菜单
  6. redis.conf
  7. ADFS3.0 Customizing the AD FS Sign-in Pages
  8. DNS***泛滥 网络安全迫在眉睫
  9. 学计算机的学后感,计算机学习心得体会(通用10篇)
  10. plc编程和python的联系_Python与三菱PLC通信
  11. 作为一个开发者,我创业了
  12. 计算bed区间gc含量,碱基深度等
  13. Giant MIDI Piano 安装教程
  14. 中国支付清算协会发布《2022中国支付清算行业社会责任报告》
  15. 电脑如何在线制作文件二维码?二维码怎么下载文件?
  16. 同样是后端程序员,你掌握如何用Grafana做出漂亮的可视化界面了吗?
  17. 《安卓逆向》查壳工具,权限查询,提取工具
  18. Selenium+Firefox/Chrome及驱动的安装和使用
  19. 补码一位乘--布斯公式
  20. unity3d中animator和animation k动画注意点和问题 无法播放等等

热门文章

  1. @程序员,当你准备选择“这条路”,那么恭喜你,你的钱包可能要鼓了!
  2. 最全的BI工具选型指南!给你五大箴言要记住
  3. 有没有一个永久储存数据的地方?
  4. 一进庙会freeeim
  5. 浅谈:飞秋 程序设计之网络通信
  6. 我也想对广大程序员说一些话
  7. MFC使用GDI+编程设置
  8. 用VC写Assembly代码(7)--在Visual C++中使用内联汇编
  9. 7年专科生程序员同时去腾讯和微软面试,问HR结果以为听错了,结局反转!!
  10. C语言核心技术-C语言概述与开发环境搭建