【C++】使用libhv实现一个双向证书认证的Https客户端(附带Go实现的服务端)

本文介绍了如何使用libhv库在C++中实现一个双向证书认证的Https客户端,同时给出了Go语言实现的服务器端。在讲解实现过程的同时,详细阐述了双向认证的基本原理和libhv客户端的实现细节。
摘要由CSDN通过智能技术生成


libhv是一个国产的网络库,在v1.2.5版本提供了SSL客户端支持,可以便携地实现双向认证。

实现

客户端

废话不多说,先show the code:

#include "hv/http_client.h"
using namespace hv;

int main() {
   
    // 创建Client
    int ret;
    http_client_t *cli = http_client_new(NULL, 8080, 1); // 这里参数填什么无所谓
    if(cli == NULL) {
   
        printf("Error: cli is null\n");
        return 0;
    }

    // 设置客户端证书
    hssl_ctx_opt_t *ssl_opt = new hssl_ctx_opt_t;
    ssl_opt->verify_peer = 1; // 认证对方身份
    ssl_opt->endpoint = HSSL_CLIENT;
    ssl_opt->ca_path = NULL; // 可以为一个证书目录,参见https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_load_verify_locations.html
    ssl_opt->ca_file = "cert/ca.crt"; // CA证书
    ssl_opt->crt_file = "cert/client.crt"; // 客户端证书
    ssl_opt->key_file = "cert/client_rsa_private.pem"; // 客户端私钥
    hssl_ctx_t ctx = hssl_ctx_new(ssl_opt); // 生成一个hssl_ctx
    if
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个使用 C++ 实现 DEALER-ROUTER 模式的 ZeroMQ 客户端服务端收发消息的示例代码: 服务端代码: ```c++ #include <zmq.hpp> #include <string> #include <iostream> int main () { // 创建上下文和 ROUTER socket zmq::context_t context(1); zmq::socket_t router(context, ZMQ_ROUTER); router.bind("tcp://*:5555"); // 循环处理消息 while (true) { zmq::message_t identity; zmq::message_t message; router.recv(&identity); router.recv(&message); std::cout << "Received message from client: " << std::string(static_cast<char*>(identity.data()), identity.size()) << " " << std::string(static_cast<char*>(message.data()), message.size()) << std::endl; router.send(identity, ZMQ_SNDMORE); router.send(message, 0); } return 0; } ``` 客户端代码: ```c++ #include <zmq.hpp> #include <string> #include <iostream> int main () { // 创建上下文和 DEALER socket zmq::context_t context(1); zmq::socket_t dealer(context, ZMQ_DEALER); dealer.setsockopt(ZMQ_IDENTITY, "client", 6); dealer.connect("tcp://localhost:5555"); // 发送消息 std::string message = "Hello, world!"; dealer.send(message.data(), message.size(), 0); // 接收回复 zmq::message_t identity; zmq::message_t reply; dealer.recv(&identity); dealer.recv(&reply); std::cout << "Received reply from server: " << std::string(static_cast<char*>(reply.data()), reply.size()) << std::endl; return 0; } ``` 在这个示例中,服务端创建了一个 ROUTER socket 并绑定到本地地址,然后循环监听该 socket 上的消息。当有消息到达时,服务端将该消息的发送者标识和内容打印出来,并回复一个相同的消息给发送者。 客户端创建了一个 DEALER socket 并连接到服务端的地址,然后发送一个字符串消息到服务端。然后客户端接收回复,并打印出来。 注意,在 DEALER-ROUTER 模式下,客户端发送的消息不会直接发送给服务端,而是先发送到 DEALER socket,由 DEALER socket 转发给 ROUTER socket,然后 ROUTER socket 再将消息发送给服务端服务端回复的消息也是先发送到 ROUTER socket,由 ROUTER socket 再转发给 DEALER socket,最终发送给客户端

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值