OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现

OpenSSL库验证PKCS7签名 使用Crypto库签名和验证签名请参考Crypto库实现PKCS7签名与签名验证,可以使用OpenSSL库验证Crypto签名,OpenSSL验证签名可使用简单的代码描述如下: //signature_msg为PKCS7签名串int Openssl_Verify(unsigned char* signature_msg,unsigned int length) { unsigned cha 阅读详情

OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现

摘要

本文深入剖析 OpenSSL 中 PKCS7* p7 数据结构和 cafile 的作用及相互关系,详细讲解基于 OpenSSL 的 RSA 验签字符串的 C 语言实现,涵盖签名解析、证书加载、验证流程及关键要点,助力开发者掌握数字签名验证技术,确保数据完整性和来源可靠性。

一、PKCS7* p7 与 cafile 的关键作用

(一)PKCS7* p7:签名数据的核心载体

  1. 结构与内容

    • PKCS#7(Public Key Cryptography Standards #7)标准涵盖数字签名、证书、数据加密及消息认证。PKCS7* p7 是处理 PKCS#7 格式数字签名的关键数据结构,通过 d2i_PKCS7_bio() 函数将 DER 编码的 PKCS#7 数据解析为该结构体。
    • p7 包含丰富的签名信息,如签名者信息、签名算法、签名数据及证书链等。在验证签名时,PKCS7_verify() 函数利用这些信息验证签名有效性、检查证书链完整性,确保数据未被篡改。
  2. 缺失影响

    PKCS7* p7 = d2i_PKCS7_bio(signp7_mem, 0);
    if (p7 == NULL) {
        // 无法获取签名信息,验证过程无法进行
    }
    
    • 若缺失 p7,将无法读取签名数据,整个验证过程直接失败,相当于没有验证对象。
  3. 释放内存

    • 使用完毕后,需调用 PKCS7_free(p7); 释放结构体,避免内存泄漏。

(二)cafile:信任链的根基

  1. 作用与使用

    • cafile 是包含根证书或中间证书的 CA(Certificate Authority,证书颁发机构)证书文件,用于建立信任链,验证签名者证书合法性,是数字签名验证的信任锚点。
    • 在代码中,通过 X509_STORE_load_locations(store, cafile, NULL) 将 CA 证书加载到证书库。PKCS7_verify() 函数利用加载的 CA 证书验证签名者证书,检查证书链完整性,确认签名者证书由可信 CA 签发。
  2. 缺失影响

    if (!X509_STORE_load_locations(store, cafile, NULL)) {
        LOG_ERR("Load CA file %s fail\n", cafile);
        // 无法建立信任链,验证过程无法完成
        return CRYPTO_FAIL;
    }
    
    • 若 cafile 缺失或无效,无法验证签名者证书真实性,无法确认签名者身份,相当于有签名但无法确认其真实性,验证过程无法完成。
  3. 两者关系

    • p7 是验证对象(要验证什么),cafile 是验证依据(如何验证),二者缺一不可,只有结合才能完成完整的签名验证过程。

二、OpenSSL RSA 验签字符串的 C 语言实现

(一)完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>

// 错误处理函数
void handle_openssl_error() {
    ERR_print_errors_fp(stderr);
    exit(EXIT_FAILURE);
}

// Base64解码函数
int base64_decode(const char *base64_data, unsigned char **decoded_data, size_t *decoded_len) {
    BIO *bio, *b64;
    int len = strlen(base64_data);
    
    b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bio = BIO_new_mem_buf((void*)base64_data, len);
    bio = BIO_push(b64, bio);
    
    *decoded_data = (unsigned char*)malloc(len);
    if (!*decoded_data) {
        BIO_free_all(bio);
        return -1;
    }
    
    *decoded_len = BIO_read(bio, *decoded_data, len);
    BIO_free_all(bio);
    
    return (*decoded_len > 0) ? 0 : -1;
}

// RSA验签函数
int rsa_verify_string(const char *pubkey_path, 
                     const char *message,
                     const char *base64_signature,
                     const char *hash_alg) {
    EVP_MD_CTX *mdctx = NULL;
    EVP_PKEY *pubkey = NULL;
    FILE *pubkey_fp = NULL;
    unsigned char *signature = NULL;
    size_t sig_len = 0;
    int ret = -1;
    const EVP_MD *md = NULL;

    // 1. 根据算法名称获取哈希算法
    if (strcmp(hash_alg, "sha1") == 0) {
        md = EVP_sha1();
    } else if (strcmp(hash_alg, "sha256") == 0) {
        md = EVP_sha256();
    } else {
        fprintf(stderr, "Unsupported hash algorithm: %s\n", hash_alg);
        goto cleanup;
    }

    // 2. 加载公钥
    pubkey_fp = fopen(pubkey_path, "r");
    if (!pubkey_fp) {
        fprintf(stderr, "Error opening public key file\n");
        goto cleanup;
    }
    
    pubkey = PEM_read_PUBKEY(pubkey_fp, NULL, NULL, NULL);
    if (!pubkey) {
        fprintf(stderr, "Error reading public key\n");
        goto cleanup;
    }

    // 3. Base64解码签名
    if (base64_decode(base64_signature, &signature, &sig_len) != 0) {
        fprintf(stderr, "Error decoding base64 signature\n");
        goto cleanup;
    }

    // 4. 初始化验签上下文
    mdctx = EVP_MD_CTX_new();
    if (!mdctx) {
        fprintf(stderr, "Error creating EVP_MD_CTX\n");
        goto cleanup;
    }
    
    if (EVP_DigestVerifyInit(mdctx, NULL, md, NULL, pubkey) != 1) {
        fprintf(stderr, "Error initializing verification\n");
        goto cleanup;
    }

    // 5. 更新验签数据
    if (EVP_DigestVerifyUpdate(mdctx, message, strlen(message)) != 1) {
        fprintf(stderr, "Error updating verification data\n");
        goto cleanup;
    }

    // 6. 完成验签
    ret = EVP_DigestVerifyFinal(mdctx, signature, sig_len);
    if (ret == 1) {
        printf("Signature verification successful (%s)\n", hash_alg);
    } else if (ret == 0) {
        printf("Signature verification failed (%s)\n", hash_alg);
    } else {
        fprintf(stderr, "Error during verification\n");
        ret = -1;
    }

cleanup:
    // 7. 清理资源
    if (mdctx) EVP_MD_CTX_free(mdctx);
    if (pubkey) EVP_PKEY_free(pubkey);
    if (pubkey_fp) fclose(pubkey_fp);
    if (signature) free(signature);
    
    return ret;
}

int main(int argc, char *argv[]) {
    if (argc != 5) {
        printf("Usage: %s <public_key.pem> <message> <base64_signature> <sha1|sha256>\n", argv[0]);
        return 1;
    }

    // 初始化OpenSSL
    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();

    int result = rsa_verify_string(argv[1], argv[2], argv[3], argv[4]);
    
    // 清理OpenSSL
    EVP_cleanup();
    ERR_free_strings();
    
    return (result != 1);
}

(二)代码详解

  1. 哈希算法选择

    if (strcmp(hash_alg, "sha1") == 0) {
        md = EVP_sha1();
    } else if (strcmp(hash_alg, "sha256") == 0) {
        md = EVP_sha256();
    }
    
    • 根据传入的哈希算法名称(“sha1” 或 “sha256”),获取对应的哈希算法结构体指针。也可使用 EVP_get_digestbyname("sha256") 动态获取算法。
  2. 公钥加载

    pubkey = PEM_read_PUBKEY(pubkey_fp, NULL, NULL, NULL);
    
    • 从 PEM 格式的公钥文件中读取公钥,支持 RSA、DSA、ECDSA 等多种公钥类型。
  3. Base64 解码

    BIO *b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    
    • 利用 OpenSSL 的 BIO 接口进行 Base64 解码,BIO_FLAGS_BASE64_NO_NL 标志表示不处理换行符。
  4. 验签流程

    EVP_DigestVerifyInit(mdctx, NULL, md, NULL, pubkey);
    EVP_DigestVerifyUpdate(mdctx, message, strlen(message));
    EVP_DigestVerifyFinal(mdctx, signature, sig_len);
    
    • EVP_DigestVerifyInit:初始化验签上下文,指定哈希算法和公钥。
    • EVP_DigestVerifyUpdate:输入待验证的数据,可多次调用以处理大消息。
    • EVP_DigestVerifyFinal:完成验签并返回结果。
  5. 错误处理

    ERR_print_errors_fp(stderr);
    
    • OpenSSL 错误处理机制可输出详细错误信息,每个 OpenSSL 函数调用后都应检查返回值。

(三)使用示例

  1. 编译命令

    gcc rsa_verify.c -o rsa_verify -lssl -lcrypto
    
  2. 运行示例

    • 使用 SHA256 验证:
      ./rsa_verify public_key.pem "message to verify" "base64_signature" sha256
      
    • 使用 SHA1 验证:
      ./rsa_verify public_key.pem "message to verify" "base64_signature" sha1
      

(四)关键点说明

  1. 哈希算法选择

    • SHA1 产生 160 位(20 字节)摘要,SHA256 产生 256 位(32 字节)摘要。现代应用推荐使用 SHA256,SHA1 已逐渐被淘汰。
  2. 签名格式

    • RSA 签名通常是 PKCS#1 v1.5 格式,签名长度等于 RSA 密钥长度(如 2048 位 = 256 字节)。
  3. 性能考虑

    • 对于大消息,可分块调用 EVP_DigestVerifyUpdate。SHA256 计算比 SHA1 稍慢但更安全。
  4. 资源管理

    • 必须正确释放所有 OpenSSL 对象,使用 goto cleanup 模式集中处理资源释放。
  5. Base64 处理

    • 签名通常以 Base64 编码传输,验签前需要解码为二进制格式。

通过上述内容,开发者可以全面了解 OpenSSL 中 PKCS7* p7 和 cafile 的作用、关系以及 RSA 验签的 C 语言实现细节,从而在实际项目中灵活应用数字签名验证技术,保障数据的安全性和完整性。

OpenSSL实战:从生成RSA私钥到配置HTTPS证书的完整指南 非对称加密是现代网络安全的基石,它通过公钥和私钥的配对实现数据加密与身份验证。其核心原理基于单向数学函数,确保公钥可公开分发而私钥必须严格保密。这项技术的核心价值在于为互联网通信建立信任机制,广泛应用于HTTPS加密、SSH免密登录、代码签名等场景。在工程实践中,开发者常需处理PEM格式的密钥与证书文件,并解决诸如'pem_read_bio:no start line'和'rsa签名遭遇异常'等常见错误。通过OpenSSL命令行工具,可以系统性地完成从生成RSA私钥、创建证书签名请求(CSR)到最终部署证书 阅读详情

相关推荐

CentOS 7下永久解决curl自签名证书报错:update-ca-trust详解与实战

HTTPS通过SSL/TLS协议实现通信加密与身份验证,其核心机制依赖于数字证书和证书颁发机构(CA)构建的信任链。在Linux系统中,OpenSSL等库依据系统预设的可信根证书列表来验证服务器证书的合法性。当访问使用自签名证书或私有CA签发证书的内网服务时,系统因缺失对应根证书而报错,此时正确的做法是将证书纳入系统信任库,而非使用`-k`参数绕过验证。CentOS 7通过`ca-trust`体系管理证书,用户只需将证书文件放入指定目录并执行`update-ca-trust`命令,即可让curl、wget等

chuozhi7142的博客 399

OPENSSL-PKCS7入门知识介绍

数据(data):明文打包type为NID_pkcs7_data,ASN1_OCTET_STRING类型,即为简单的ASN1_STRING数据类型。签名数据(sign):把数据以及签名值打包,其中包括签名者的证书,CRL等,目的为确定发送者的身份。type为NID_pkcs7_signed。PKCS7_SIGNED类型的数据,PKCS7_SIGNED定义如下:/* version 1 */ //版本/* md used */ //摘要算法/* [ 0 ] */ //签名证书。

记录成长的博客 3990

告别HTTPS自签名证书告警:使用OpenSSL生成SHA-256证书全指南

数字证书是HTTPS加密通信的基石,其核心原理基于公钥基础设施(PKI)和哈希算法。哈希算法为证书生成唯一的数字指纹,而签名算法则确保其完整性和真实性。随着计算能力的提升,早期广泛使用的SHA-1算法因存在碰撞风险已被现代浏览器和安全标准淘汰,转而采用更安全的SHA-256算法。这一升级对于保障内部系统、API测试和开发环境的安全连接至关重要。在实践层面,OpenSSL作为生成和管理证书的标准工具,通过指定`-sha256`参数,可以确保自签名证书符合当前安全规范,从而避免浏览器出现“不安全”警告,并满足如

cnmik42448的专栏 457

记录一下本地WIN10,PHP配置OPENSSL的过程

今天在使用一个银行SDK的时候,本地开发遇到一个生成私钥失败的错误,以及一个证书的问题,主要原因是本地的环境配置问题,解决过程如下: 1.将PHP安装目录下的libeay32.dll添加到系统环境变量的PATH中 2.添加系统环境变量OPENSSL_CONF=本地openssl.cnf文件的路径 3.下载(https://curl.haxx.se/docs/caextract.html)或者...

fswy2017的博客 1782

Windows下OpenSSL自签名证书生成与Qt程序适配全攻略

SSL/TLS证书是保障网络通信安全的核心机制,它基于非对称加密和公钥基础设施(PKI)原理,通过数字签名建立身份认证与数据加密通道。在软件开发与测试中,自签名证书因其无需付费、快速部署的技术价值,被广泛应用于HTTPS本地开发、物联网设备通信及桌面应用加密传输等场景。然而,在Windows环境下,由于缺乏原生OpenSSL支持及系统证书存储与Qt运行时环境的割裂,开发者常面临证书生成、信任链建立及Qt程序适配等一系列挑战。本文聚焦OpenSSL环境配置、合规证书链生成(特别是包含SAN扩展)以及让Qt运行

深未来技术 425

数字签名与CA证书:从原理到实战的完整指南

数字签名和CA证书是现代网络安全的核心技术,它们基于非对称加密算法构建信任体系。非对称加密通过公钥和私钥配对,实现身份认证和数据完整性验证。数字签名利用私钥对数据摘要加密,接收方用公钥解密验证,确保信息未被篡改且来源可信。CA证书则解决了公钥信任问题,由受信任的证书颁发机构对实体身份进行核实并签发证书,形成从根证书到终端证书的信任链。这套体系在HTTPS网站、软件分发、企业内网通信等场景中广泛应用,保障了数据传输的安全性和可靠性。本文结合OpenSSL工具,深入解析证书结构、签名算法和信任链构建,并针对自建

java2000.net 505

OpenSSL PKCS7验签实战:从cafile加载到RSA签名验证全流程解析

本文详细解析了使用OpenSSL进行PKCS7签名验证的完整流程,重点阐述了从cafile加载CA证书库到执行RSA签名验证的核心步骤。文章通过实战代码示例,深入探讨了分离签名与附着式签名的区别、X509_STORE的配置、PKCS7_verify函数的关键参数,并提供了常见的错误排查与调试技巧,帮助开发者构建安全可靠的数据验签机制。

vv45678的博客 627

Ubuntu 22.04下Apache自签名证书实战:OpenSSL 3.0适配与SAN配置

HTTPS证书是Web服务安全通信的基础概念,其核心原理在于公钥基础设施(PKI)构建的信任链验证机制。技术价值体现在本地开发调试、混合内容测试、CI/CD离线集成等关键工程场景中。现代浏览器(Chrome 99+、Firefox 100+)已强制要求证书必须包含Subject Alternative Name(SAN)字段,并弃用仅依赖CN的旧式匹配逻辑;同时,Ubuntu 22.04默认搭载的OpenSSL 3.0.2进一步收紧了算法策略——SHA-1签名被禁用、PKCS#8私钥成标准、SAN需显式注入

cneo2012的博客 365

PKCS7与RSA验签原理图解:OpenSSL如何用cafile构建信任链?

本文深入解析PKCS7数据结构与RSA验签原理,详细图解OpenSSL如何通过cafile参数构建完整的证书信任链。内容涵盖PKCS7的ASN.1编码结构、CA证书验证层级划分,以及OpenSSL验签API的实战应用,帮助开发者掌握数字签名验证的核心技术要点。

mango的博客 174

OpenSSL ca证书命令操作详解

OpenSSL 的ca命令用于操作证书颁发机构(CA,Certificate Authority)的操作,包括签发、撤销和管理证书。以下是 OpenSSL 版本 3.0 中openssl ca命令的详细使用手册。请注意,由于文本长度限制,以下内容可能不包含所有参数的详细说明。你可以使用命令在终端中获取帮助信息。

N阶二进制的博客 2500

PHP实践:用openssl打造安全可靠的API签名验证系统

在Web开发中,API(Application Programming Interface)是不可或缺的一部分。为了确保API请求的安全性,常常需要对API请求进行签名验证。本文将介绍如何使用PHP设计一套API签名验证的程序,并提供具体的设计步骤和代码。

黑夜开发者的博客 4212

php openssl_verify,PHP中使用OpenSSL下openssl_verify验证签名案例

//demo$json = '{"sign":"myYCvJqsDJUNX67qJnklrVY025oSQmm4D4bIVdHZQzihV+G8G848MmAAatAxCDuCmJbenI0jRZk7p22HjFT0nRykEeSmTExiT+Jx7\/2GQn5grEA3qd7i9gCPz\/E7+n9mleukLuJoXeceVp626c4gLZTKiPPcmbsJIfwfNexCBZXb2B...

weixin_29053577的博客 911

脑机接口(BCI)从原理到开发实战 01|意念控制真的来了?一文看懂脑机接口的技术革命

类型定义典型应用主动式用户主动产生特定思维模式来控制设备运动想象(想象左手/右手移动)反应式用户被动接受外部刺激,系统检测大脑反应P300拼写器、SSVEP(稳态视觉诱发电位)被动式系统监测用户自发脑状态,不要求主动控制疲劳监测、情绪识别、注意力评估本系列后续文章将重点围绕主动式(运动想象)和反应式(P300/SSVEP)展开实战。脑机接口,这个曾经只存在于科幻中的概念,正在政策、资本、技术的三重驱动下,加速从实验室走向产业落地。2026年,注定是脑机接口发展史上浓墨重彩的一年。

小明的博客 1431

OpenSSL自签名HTTPS证书生成与Nginx配置指南

HTTPS作为现代Web服务的标准加密协议,其核心依赖于SSL/TLS证书实现身份验证与数据加密。自签名证书(Self-Signed Certificate)通过OpenSSL工具链本地生成,无需CA机构验证,特别适合开发测试、内网服务等非生产环境。本文以金融项目测试环境为例,详解从私钥生成、CSR创建到证书签发的完整流程,重点解析SAN扩展支持多域名/IP的进阶配置。结合Nginx服务器部署实践,涵盖安全强化配置、HTTP强制跳转等工程细节,并给出浏览器信任证书的跨平台解决方案。对于需要快速搭建HTTPS

weixin_30736301的博客 418

LT码与Raptor码的性能仿真

从数据分析看来,在数据块大小较小时(100 - 200 左右 ),LT 码和 Raptor 码的平均冗余符号数量差距相对较小,但 LT 码的冗余符号数量始终高于 Raptor 码。现在采用MATLAB进行仿真,直观展示不同数据块大小下,两种解码方式的解码时间差异.如图4.1所示,LT解码(绿色圆点折线)LT 解码方式的解码时间随数据块大小的变化情况。从实际应用的角度来看,LT码由于其简单的编码机制,适用于资源受限或对编码效率要求较高的场景,但其较高的解码复杂度限制了其在一些实时性要求较高的应用中的使用。

道亦无名 1136

Keystone变换(4)MATLAB仿真

关于Keystone变换三种方法(DFT-IFFT法、Sinc插值法和Chirp-Z法)的仿真

qq_45846079的博客 1570

swupdate签名验证失败根因:x-timestamp时间戳机制深度解析

固件安全启动与OTA升级中,签名验证是保障固件完整性和来源可信的核心环节。其底层依赖PKI体系,不仅校验RSA/ECDSA数学签名,更关键的是验证证书链有效性、内容哈希一致性及时间上下文合法性。其中,x-timestamp作为CMS签名结构中的UTCTime字段,承担着设备本地时间与签名时刻的偏差容错判断,直接决定验签成败。该机制不依赖NTP,却对时钟同步精度、OpenSSL时区处理、ASN.1编码规范和swupdate版本兼容性高度敏感。在工业嵌入式场景下,RTC漂移、容器环境时间失准、跨时区证书生成等常

weixin_33875564的博客 308

基于步科(Kinco HMI 2.5)的组态软件使用

本篇介绍Kinco HMI 2.5的组态软件使用,图标如下 目录   一、新建工程并配置连接 1.1 根据工程选择PLC与HMI型号 1.2 配置PLC连接与选项 二、组态画面编辑 2.1 打开画面窗口 2.2 编辑画面 2.3 组态变量与PLC程序变量连接 三、组态程序下载到HMI 3.1 连接 3.2 编译 3.3 下载 一、新建工程并配置连接 1.1 根据工...

ACanswer的专栏 1万+

OpenSSL 1.1.1i 命令行实战:5个常用证书与密钥生成命令详解

本文详细介绍了OpenSSL 1.1.1i命令行工具中5个最常用的证书与密钥生成命令,包括RSA密钥对生成、自签名证书创建、证书签名请求(CSR)生成、证书格式转换以及证书验证与查看。通过具体示例和参数解析,帮助开发者快速掌握HTTPS服务和API签名系统的核心加密操作。

385

详细推导波特图增益和相位曲线

最近因为项目需求,在回看波特图方面的内容。大三那会,《自动控制原理》这本书里面就讲过这些东西,但是那时候总感觉学这些没啥用,反正以后也用不到,对这种课程的重视度不是很高。 工作后发现,只要你从事的是和本专业相关的工作,大学学过的很多理论课程在后面大概率都会用到。曾经那些我们在学校以为用不上的东西,熟不知在后面用处还多着呢。所以啊,仅仅只是我们的以为而已! 现在还在学校的同学,对待《自动控制理论》、《信号与系统》、《通信原理》这样的核心专业课,建议还是好好学习一下,认真听听课。哪怕是考试完以后就会忘掉,但当我

D_Katter的博客 3936

2026华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Python实现。

MISAYAONE的博客 29万+

CentOS 8私有CA实战:OpenSSL+easy-rsa构建生产级PKI

私有证书颁发机构(CA)是现代零信任架构与内部HTTPS通信的信任基石,其核心在于遵循X.509标准的证书生命周期管理——涵盖密钥生成、CSR处理、扩展字段控制(如basicConstraints、SAN)、CRL/OCSP分发等关键环节。OpenSSL作为Linux系统级密码学基础工具,提供对RFC 5280流程的直接、可审计实现;easy-rsa则通过语义化封装,大幅降低OpenSSL原生命令(如openssl ca、openssl x509)的配置复杂度与出错风险。该组合在CentOS 8 Strea

weixin_34232744的博客 829

译码器Multisim电路仿真汇总——硬件工程师笔记

本文详细介绍了74LS139D和74LS138D两种TTL译码器的功能特点及应用。74LS139D是2线-4线译码器,具有低电平有效输出和使能控制功能,常用于地址译码和数据分配。74LS138D是3线-8线译码器,通过3位输入实现8路输出控制,广泛应用于微处理器系统。文中提供了两种芯片的引脚说明、真值表和典型应用电路,并附有硬件工程师笔试面试相关资源链接。这些基础知识对数字电路设计和硬件工程师面试准备具有重要参考价值。

XU157303764的博客 1261

CentOS 7 Apache 手动配置 SSL/TLS 详解

SSL/TLS 是现代 Web 通信的加密基石,其核心在于证书信任链与私钥安全机制。理解 OpenSSL 生成密钥、签发证书、验证链路的原理,是构建可信 HTTPS 通道的前提。在 CentOS 7 等传统 Linux 发行版中,Apache 作为主流 Web 服务器,需手动集成 mod_ssl 模块并精确配置虚拟主机,才能实现端到端加密。该技术方案具备强离线性、高可控性与良好兼容性,广泛适用于内网开发测试、安全靶场搭建(如 Apache Shiro 漏洞复现)、以及无公网域名的运维场景。本文围绕 SSL

aibi9196的博客 420

【Unity】网络游戏实战(序章)MMORPG大型多人在线角色扮演 + 中国象棋联网对战

本系列会基于两种常见的网络游戏类型(MMORPG大型多人在线角色扮演和多人棋牌),从零开始实现网络游戏开发中的大多数环节。【杜绝代码炫技】本系列杜绝代码炫技,摈弃那些高深的设计模式,一切业务逻辑的实现代码追求浅显易懂,即便是网络编程菜鸟,也能循序渐进掌握本系列的核心要点。【授之鱼也授之渔】与一些开源库那样只授予源码不同,本系列还会基于各个技术要点展开详解,并结合切实的可直接运行的Demo,授之鱼更授之渔。

神码编程 1963

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Ubuntu 20.04 私有CA搭建实战:OpenSSL与easy-rsa协同构建可信PKI

私有证书颁发机构(Private CA)是现代内网安全通信的基石,其核心原理是通过自签名根证书建立本地信任锚点,再由该根证书签发终端实体证书,实现TLS双向认证、服务身份验证与证书生命周期管控。技术价值在于填补Let’s Encrypt等公有CA无法覆盖的内网域名、离线环境及mTLS场景,显著提升Kubernetes、API网关、IoT设备等系统的零信任能力。典型应用场景包括Nginx/HAProxy HTTPS部署、Kubelet客户端认证、Vault准入控制及内部deb包代码签名。本文基于Ubuntu

weixin_34288121的博客 381

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: OpenSSL 签名格式全攻略:深入解析与应用要点
下一篇: Playwright 常用命令、参数详解及使用示例
未来创世纪
博客等级 码龄18年 960粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值