Qt 与java服务器的双向认证https通信

第一次做qt和java服务端的https双向认证通信,感觉啥都一头雾水最终还是在强大的搜索引擎和好友的帮助下完成,现在做个一个简单的总结:(有可能有些概念描述不正确)


qt 环境 centos6.5 +  qt5.5.1 


1.java服务端给我丢过来两个证书相关的文件 client1.p12(包含证书和私钥),client1.truststore (包含信任库),首先必须要说明一下这个两个文件 

  client1.p12 就是传说中的pkcs12格式 

 client1.truststore 就是java自己存贮的keystore格式jsk


2.qt如何使用这两个文件 

  首先由于client1.truststore 是java存贮格式肯定在qt上是不能直接使用(qt内部使用openssl)需要将它转换成标准格式pkcs12

这里需要安装jdk,安装完jdk后切换到证书所在目录:

运行以下命令:

JKS → P12

keytool -importkeystore -srckeystore client1.truststore -srcstoretype JKS -deststoretype Der -destkeystore truststore .p12

这样将会在当前目录生成truststore .p12 信任库

接下来由于qt只能加载pem和Der格式的证书 (貌似也可以加载pkcs12的但是我没有弄成功 在加载 信任库的时候程序崩掉了)

安装openssl

提取用户证书:
openssl pkcs12 -in client1.p12 -clcerts -nokeys -out cert.pem    //pem格式


提取私钥:
openssl pkcs12 -in client1.p12  -nocerts -out key.pem 


转换信任库为pem格式

openssl pkcs12 -in truststore.p12 -out  truststore.pem  


到此准备工作结束


现在可使用了 将转换后的文件放到应用程序所在文件夹

 加载客户端证书

    QFile file.setFileName("./cert.pem");
    file.open(QIODevice::ReadOnly);\
    QSslCertificate local( &file , QSsl::Pem );

   m_sslConfig.setLocalCertificate( local );

   file.close();

 加载私钥

  file.setFileName( "./certificate/key.pem");
    file.open(QIODevice::ReadOnly);
    QSslKey key( &file, QSsl::Rsa, QSsl::Pem,QSsl::PrivateKey,QByteArray("123456"));
    m_sslConfig.setPrivateKey( key );
    file.close();

加载信任库

file.setFileName("./truststore.pem");
    file.open(QIODevice::ReadOnly);
    QList<QSslCertificate>  list = QSslCertificate::fromDevice( &file,  QSsl::Pem);
    file.close();
    m_sslConfig.setCaCertificates( list );


到此设置结束 以后在发送  QNetworkRequest request;时候只需要将ssl配置设置进去就可以了





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT TCP客户端与服务器通信的步骤如下: 1. 创建QT TCP客户端对象 使用QT提供的QTcpSocket类创建TCP客户端对象。可以使用new运算符在堆上动态分配内存,也可以在栈上创建对象。 ``` QTcpSocket *client = new QTcpSocket(this); // 动态分配内存 ``` 2. 连接服务器 使用client对象的connectToHost()函数连接服务器。该函数需要传递服务器的IP地址和端口号。 ``` client->connectToHost("127.0.0.1", 8888); // 连接服务器 ``` 3. 发送数据 使用client对象的write()函数发送数据。该函数需要传递待发送的数据和数据长度。 ``` QByteArray data = "Hello World!"; client->write(data, data.length()); // 发送数据 ``` 4. 接收数据 使用client对象的readyRead()信号接收服务器发送的数据。可以使用client对象的read()函数读取接收到的数据。 ``` connect(client, SIGNAL(readyRead()), this, SLOT(readData())); ``` ``` void readData() { QByteArray data = client->readAll(); // 读取数据 qDebug() << data; } ``` 5. 断开连接 使用client对象的disconnectFromHost()函数断开与服务器的连接。 ``` client->disconnectFromHost(); // 断开连接 ``` 完整的QT TCP客户端代码如下: ``` #include <QTcpSocket> class Client : public QObject { Q_OBJECT public: Client(QObject *parent = nullptr); ~Client(); private slots: void readData(); private: QTcpSocket *client; }; Client::Client(QObject *parent) : QObject(parent) { client = new QTcpSocket(this); client->connectToHost("127.0.0.1", 8888); connect(client, SIGNAL(readyRead()), this, SLOT(readData())); } Client::~Client() { client->disconnectFromHost(); } void Client::readData() { QByteArray data = client->readAll(); qDebug() << data; } ``` 注意:QTcpSocket是异步的,因此需要使用信号和槽机制来处理数据接收。同时,需要在客户端对象的析构函数中调用disconnectFromHost()函数断开与服务器的连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值