OpenSSL从内存中加载密钥、证书、证书链、根证书

这篇具有很好参考价值的文章主要介绍了OpenSSL从内存中加载密钥、证书、证书链、根证书。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

众所周知,使用OpenSSL建立连接,需要加载密钥、证书、证书链、根证书等,这些接口从文件中加载很方便,但有些使用场景使我们必须从内存加载,以下是保姆级介绍OpenSSL从内存中加载密钥、证书、证书链、根证书的具体实现方法。

加载密钥

加载私钥主要通过SSL_CTX_use_PrivateKey函数实现。

 	/* 获取并加载私钥 */
    pKey = (unsigned char *)malloc(KEY_MAXSIZE);
    if (NULL == pKey)
	{
		return -1;
	}
	memset(pKey,0,KEY_MAXSIZE);
	
	// 获取私钥内容方式省略。。。
	// pKey为私钥内容,pKeylen为私钥长度
	
    BIO * pkeybio = BIO_new_mem_buf(pKey, pKeylen);
    if (NULL == pkeybio)
	{
	    free(pKey);
		return -1;
	}
	
 	EVP_PKEY* evpkey = PEM_read_bio_PrivateKey(pkeybio, NULL, NULL, NULL);
    if (NULL == evpkey)
	{
        free(pKey);
        BIO_free(pkeybio);
		return -1;
	}
 	
	if (!SSL_CTX_use_PrivateKey(ctx,evpkey))
 	{
        free(pKey);
        BIO_free(pkeybio);
        EVP_PKEY_free(evpkey);
		return -1;
 	}
 	    
    /* 输入私钥密码 */
    if (pin != NULL)
    {
        SSL_CTX_set_default_passwd_cb_userdata(ctx, pin);
    }

加载端证书

加载端证书主要通过SSL_CTX_use_certificate函数实现。

    pKey = (unsigned char *)malloc(CERT_MAXSIZE);
    if (NULL == Cert)
	{
		return -1;
	}
	memset(Cert,0,CERT_MAXSIZE);
	
	// 获取证书内容方式省略。。。
	// Cert为证书内容,Certlen为私钥长度
    
	BIO * certbio = BIO_new_mem_buf(Cert, Certlen);
    if (NULL == certbio)
	{
		return -1;
	}
	
	X509 * cert_x509 = PEM_read_bio_X509(certbio, NULL, 0, NULL);
    if (NULL == cert_x509)
	{
	    BIO_free(certbio);
		return -1;
	}
	
	if (!SSL_CTX_use_certificate(ctx, cert_x509))
 	{
        BIO_free(certbio);
        X509_free(cert_x509);
		return -1;
 	}

加载证书链

有些时候使用的通讯证书为证书链,这时我们必须依次按顺序加载其中证书,我在这里封成了一个函数。

int SSL_CTX_use_certificate_chain_mem(SSL_CTX *ctx, void *data, int data_len)
{
    int alRet = 0;

    ERR_clear_error(); // 清空错误队列

    /* 从内存中读取证书链 */
    BIO * certbio = BIO_new_mem_buf(data, data_len);
    if (NULL == certbio)
	{
		return -1;
	}

    /* 读取并加载端证书 */
    X509 * cert_x509 = PEM_read_bio_X509_AUX(certbio, NULL, NULL, NULL);
    if (NULL == cert_x509)
	{
    	BIO_free(certbio);
		return -1;
	}

    if (!SSL_CTX_use_certificate(ctx, cert_x509))
    {
        BIO_free(certbio);
        X509_free(cert_x509);
        return -1;
    }

    /* 读取并加载额外sub证书 */
    alRet = SSL_CTX_clear_extra_chain_certs(ctx); // 清空额外证书
    
    while (alRet)
    {
        cert_x509 = PEM_read_bio_X509(certbio, NULL, NULL, NULL);
        if (!cert_x509)
        {
            /* 加载到文件结束,成功退出 */
            BIO_free(certbio);
            X509_free(cert_x509);
            ERR_clear_error();
            return OK;
        }
        
        /* 加载额外证书 */
        alRet = SSL_CTX_add_extra_chain_cert(ctx, cert_x509);
        if (!alRet)
        {
            BIO_free(certbio);
            X509_free(cert_x509);
            return -1;
        }
    }
}

加载根证书

加载根证书比加载私钥和端证书复杂些,需要修改cert_store来实现。文章来源地址https://www.toymoban.com/news/detail-738684.html

 	/* 获取并加载根证书 */
    SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);

    caCert = (unsigned char *)malloc(CACERT_MAXSIZE);
    if (NULL == caCert)
	{
		return NTS_ERR_MALLOC;
	}
	memset(caCert,0,CACERT_MAXSIZE);
 	
	// 获取根证书内容方式省略。。。
	// caCert为证书内容,caCertlen为私钥长度
    
 	X509_STORE  *ca_store = X509_STORE_new();
 	ca_store = SSL_CTX_get_cert_store(ctx);
    if (NULL == ca_store)
	{
        free(caCert);
		return -1;
	}
	
	BIO * cabio = BIO_new_mem_buf(caCert, caCertlen);
    if (NULL == cabio)
	{
        free(caCert);
        X509_STORE_free(ca_store);
		return -1;
	}
 	
	X509 * cacert_x509 = PEM_read_bio_X509(cabio, NULL, 0, NULL);
    if (NULL == cacert_x509)
	{
        free(caCert);
        X509_STORE_free(ca_store);
    	BIO_free(cabio);
		return -1;
	}
	
 	if ( !X509_STORE_add_cert(ca_store, cacert_x509) )
 	{
        free(caCert);
        X509_STORE_free(ca_store);
    	BIO_free(cabio);
    	X509_free(cacert_x509);
		return -1;
 	}

    free(caCert);
	BIO_free(cabio);
	X509_free(cacert_x509);

到了这里,关于OpenSSL从内存中加载密钥、证书、证书链、根证书的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • openssl生成证书和nginx配置ssl证书

    一般情况下,使用ssl证书需要三个操作步骤:1.生成密钥对;2.生成证书请求文件;3.生成证书文件。从单纯的开发者角度来说,可以使用开源的openssl生成密钥和证书,且通过openssl的req命令,可以一个命令完成上述3个操作。 req命令主要的功能:生成证书请求文件、验证证书请

    2024年02月07日
    浏览(43)
  • 利用OpenSSL 自签CA证书制作链式SSL证书

    本文描述的是利用自签CA制作链式证书的步骤,主要是制作中间证书的关键步骤。 目前CA证书基本均为链式证书,其主要目的是利用中间证书的特性,既可以保护根证书的密钥安全性,又可以方便进行吊销操作。 0x00 制作根证书密钥(root.key): 参数含义: genrsa:  生成RSA密钥

    2024年02月11日
    浏览(40)
  • 【ssl认证、证书】SSL 证书基本概念、证书格式、openssl和keytool的区别

    相关文章: //-----------Java SSL begin---------------------- 【ssl认证、证书】SSL双向认证和SSL单向认证的区别(示意图) 【ssl认证、证书】java中的ssl语法API说明(SSLContext)、与keytool 工具的联系 【ssl认证、证书】SSL双向认证java实战、keytool创建证书 【ssl认证、证书】Wireshark抓包分析 【s

    2024年02月02日
    浏览(35)
  • Openssl生成证书-nginx使用ssl

    方式一: 1、生成服务器私钥。 2、根据服务器私钥文件生成证书请求文件,这个文件中会包含申请人的一些信息,所以执行下面这行命令过程中需要用户在命令行输入一些用户信息,随便填写,一路回车即可。 3、生成CA机构的私钥,命令和生成服务器私钥一样,只不过这是

    2024年02月05日
    浏览(52)
  • openssl给内网IP生成ca证书(ssl证书)

     注意:大家自己按照自己的目录创建就行,我的直接放在/opt目录下了。  注意:申请的时候会让大家填一些参数,下面是参数说明及示例:  注意:这一步也会输入参数,要和上一次输入的保持一致       注意:这一步也会输入参数,要和前两次输入的保持一致  注意:

    2024年02月07日
    浏览(43)
  • 通过openSSL生成自签名的SSL证书

    自签名证书:就是 指的根证书,就是颁发者:和颁发给: 是相同的。证书的签名是用证书里的公钥对应的私钥进行的签名。这样的证书除非是受信任的颁布机构颁发f,一般是不被第三方信任。一般用于内部使用及测试使用。 下面介绍生成证书的方法: 1. 生成私 钥 要创建

    2023年04月17日
    浏览(43)
  • openssl生成nginx ssl证书的简单方法

    [root@172-17-218-79 ~]# mkdir cert [root@172-17-218-79 ~]# cd cert/ [root@172-17-218-79 cert]# openssl genrsa -out server.key 1024 Generating RSA private key, 1024 bit long modulus (2 primes) ......+++++ .........................................+++++ e is 65537 (0x010001) [root@172-17-218-79 cert]# openssl req -new -key server.key -out server.csr You are abo

    2024年02月04日
    浏览(49)
  • Windows.OpenSSL生成ssl证书配置到nginx

    生成一个随机数 根证书是用于证书签发的,证书的签发机构都有自己的根证书。他们的根证书一般已经打包到浏览器的受信任的根证书目录里了,我们自己签发的需要手工安装到这个目录。 OpenSSL使用PEM(Privacy Enbanced Mail)格式来保存私钥,生成私钥的命令如下: 这一步会提

    2024年01月24日
    浏览(43)
  • SSL/TLS 介绍以及如何利用openssl生成证书

    SSL:Secure Socket Layer 安全套接字层。 TLS:Transport layer Security 传输层安全性,是一种加密协议。 到2020年,SSL以及TLS1.0,TLS1.1已被弃用 Authentication:通信双方可以确认双方的身份,不被黑客拦截信息伪造身份。 Confidentiality:通信的内容经过加密,更加安全,不被授权的用户无法识别

    2024年02月04日
    浏览(47)
  • MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书)

    现在https大行其道, ssl又是必不可少的环节. 今天就教大家用开源工具openssl自己生成ssl证书的文件和私钥 MAC电脑 openssl工具自行搜索安装 1、终端执行命令 2、输入密码,这里会输入两次. 填写一样即可. 随意填写一个. 下一步就会删除这个密码 3、输入密码,这里会输入两次. 填写

    2024年04月14日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包