Windows自制SSL证书,通过libcurl验证

说明

Windows自制SSL证书,通过libcurl发送https请求,并验证CA证书

生成证书

  1. 生成 CA 私钥
openssl.exe genpkey -algorithm RSA -out ca.key
  1. 生成 CA 证书
openssl.exe req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt

这一步要填写相关信息,
特别注意 Common Name 填域名或IP
ca为客户端使用的CA证书

  1. 生成服务器私钥
openssl.exe genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
  1. 创建CSR:
openssl.exe req -new -key server.key -out server.csr
  1. 使用 CA 证书签发服务器证书
openssl.exe x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256

NG开启SSL

server {
        listen 443 ssl;
        # http2 on;
 
        ssl_certificate server.crt; # 证书文件路径
        ssl_certificate_key server.key; # 私钥文件路径
        
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        
        access_log logs/access.log main;
 
        location / {
            mpc_processor;
        }
    }

编写程序验证

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if(curl) {
    	// curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); // 开启调试信息 生产需注释
        curl_easy_setopt(curl, CURLOPT_URL, "https://127.0.0.1:443");
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);

        // 设置 CA 证书路径 
        // 实际生产应该将各CA机构的根证书放在ca.crt文件中
        curl_easy_setopt(curl, CURLOPT_CAINFO, "z:/ca.crt");

        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();

    return 0;
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libcurl是一个非常流行的网络传输库,可以在Linux和其他操作系统中使用。libcurl支持使用SSL/TLS协议进行加密通信,同时支持加载和使用X.509证书来进行身份验证。 如果想在libcurl中使用内存中的证书,需要使用SSL_CTX_set_cert_store()函数来设置证书存储。具体步骤如下: 1. 创建SSL_CTX对象 ``` SSL_CTX *ctx = SSL_CTX_new(TLS_method()); ``` 2. 创建一个X.509证书存储 ``` X509_STORE *store = X509_STORE_new(); ``` 3. 加载证书到内存中,创建X.509证书对象,并将证书添加到证书存储中 ``` X509 *cert = d2i_X509(NULL, pem_data, pem_data_len); X509_STORE_add_cert(store, cert); ``` 其中,pem_data和pem_data_len是证书数据的指针和长度,可以从文件或网络中读取证书数据。 4. 将证书存储设置到SSL_CTX对象中 ``` SSL_CTX_set_cert_store(ctx, store); ``` 5. 使用libcurl进行加密通信 ``` CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com"); curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctx_callback); curl_easy_setopt(curl, CURLOPT_SSL_CTX_DATA, ctx); CURLcode res = curl_easy_perform(curl); ``` 其中,sslctx_callback是一个回调函数,用于设置SSL_CTX对象的一些参数,如证书验证方式等。 通过以上步骤,就可以在libcurl中使用内存中的证书进行加密通信了。需要注意的是,证书需要以正确的格式加载到内存中,并且需要保证证书的有效性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值