文档章节

openssl C函数总结,

首席执行官机器人
 首席执行官机器人
发布于 2016/12/17 15:13
字数 2420
阅读 155
收藏 1

上篇说了,命令行下操作证书的流程,再来个,c下的常用操作函数,这样就能方便的在自己的程序中加入证书认证了,采用这种方式的认证基本没法破解,哈哈,当然,做好加壳。

命令行操作参考:

https://my.oschina.net/u/2265334/blog/807586

char *ERR_get_error()
    openssl的环境初始化,同时检查错误。
RSA *RSA_generate_key(int num,
                 unsigned long e,
  void (*callback)(int,int,void *),
                    void *cb_arg);
    产生一个RSA密钥,并返回,num是密钥长度,e是指数,剩下两个是回调,简单的应用是用不到的,e一般取2^16+1要是一个质数,
BIO *BIO_new(BIO_METHOD *type)
    这个函数是ssl内部用于传输转换数据的,同时对用户隐藏了内部操作。
int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,
                                        unsigned char *kstr, int klen,
                                        pem_password_cb *cb, void *u);
    这个函数是将RSAkey写入BIO的,后几个参数为NULL时作用是将RSA写入BIO buff。
int BIO_get_mem_data(BIO*,char**)
    提取bio中的数据,写入char*,到这里,就的到了,长度是num,指数是e的,RSA加密对,存在char中。写入文件即得到key文件。
BIO_free();
    用完bio就可以用这个函数释放了。

BIO *BIO_new_mem_buf(void *buf,int len)
    建立一个内存BIO buf,同时,指明这个BIO内容的buf是什么,第二个参数为buf的长度,如果是字符串,可以用strlen获取。
RSA *PEM_read_bio_RSAPrivateKey(BIO* bp,RSA **x,pem_password_cb *cb,void *u)
    这个函数是读取bio中的rsa数据,有可能rsa是被加密的,可以通过参数传入。没有就null,
X509_REQ *X509_REQ_new()
    产生一个证书请求的buf。
EVP_PKEY *EVP_PKEY_new();
    产生与一个EVP结构的buf,EVP结构用以存放RSA文件。
int EVP_PKEY_set1_RSA(EVP_PKEY*,RSA*)
    将一个RSA放入EVP结构中。
X509_REQ_set_pubkey(RSA*,EVP_P *)
    从一个放进RSA的evp中提取公钥部分放入,req中。即其去n,e,这些都在证书请求中,用别的d对自己的公钥进行签名。
X509_NAME *X509_REQ_get_subject_name(X509_REQ *req)
    得到req这个buf中的subject_name 的地址。通过这个地址,向证书中添加个人信息。用下面的函数:
    int X509_NAME_add_entry_by_txt(X509_NAME *name, "C", MBSTRING_UTF8,
                                     (unsigned char *) (country),
                                     int len, -1, 0))

    int X509_NAME_add_entry_by_txt(X509_NAME *name,"ST",MBSTRING_UTF8,
                                     (unsigned char *)(state),
                                     int len, -1, 0))

    int X509_NAME_add_entry_by_txt(X509_NAME *name,"L",MBSTRING_UTF8,
                                     (unsigned char *)(city),
                                     int len, -1, 0))

    int X509_NAME_add_entry_by_txt(X509_NAME *name,"O",MBSTRING_UTF8,
                                     (unsigned char *)(organization),
                                    int len(organization), -1, 0))
    int X509_NAME_add_entry_by_txt(X509_NAME *name,"OU",MBSTRING_UTF8,
                                     (unsigned char *)(organization_unit),
                                     int len, -1,0)
    int X509_NAME_add_entry_by_txt(X509_NAME *name,"CN", MBSTRING_UTF8,
                                     (unsigned char *)(cn),
                                     ine len, -1, 0))

    int X509_NAME_add_entry_by_txt(X509_NAME *name,"emailAddress", MBSTRING_UTF8,
                                     (unsigned char *) (email),
                                     int len, -1, 0))
    
int PEM_write_bio_X509_REQ(BIO *bio, X509_REQ *req)
    将填入信息的req写入bio中,进入bio就可以用bio的操作进行导出,不再重复。


X509 *PEM_read_X509(FILE *fp, X509 **x, pem_password_cb *cb, void *u);
    这个函数从一个fp中读取x509的部分即,用于签名的部分,后面的密码和回调没有就写NULL,fp 应是一个用于签名的证书。虽说签名的原理要有私钥即可,可是信任证书中保存了,公钥和给这个证书签名的签名链。用x509进行签名,可以追溯到上一级签名者,直到一个觉得可以信任的证书。

RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    从文件中读取key文件,记得到了私钥部分,即数值d,后面三个参数没有可以放入NULL。
BIO_new_mem_buf
    这个前面说过了,这里吧csr文件放入BIO
X509_REQ *PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x, pem_password_cb *cb, void *u);
    这个函数从保存CSR的BIO中读取req信息,后面三个没有写NULL,
EVP_PKEY_new
EVP_PKEY_set1_RSA
    这两个前面也用过了,EVP是高加密解密的函数,
X509 *X509_new()
    生产一个存放x509签名的证书的buf。这个buf不是空的,填入了必要的消息,如生产buf的日期等,前面的时候要用到这个,用于指明签名的有效日期。
X509_CINF * X509->cert_info;
    这个结构体示意语句,在X509结构中,包还了cert_info的信息,X509的cert_info保存这个信息的指针,
X509_REQ_get_subject_name
    前面说过了,返回req的subname指针。
int X509_set_subject_name(X509 *cert,X509_NAME *name)
    设置证书的主体名称,其中name要从,证书请求中得到,提交申请的那个请求了,可以用下面的函数得到:
        X509_NAME *X509_NAME_dup(X509_REQ_get_subject_name(req));当然用X509_REQ_get_subject_name(req)不一定返回正确的信息,要进行检查,函数参数里引用另一个函数的返回值是危险的。
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s,long adj)

    设置证书的有限日期,其中,s是证书的 ->cert_info->validity->notBefor则从证书生成开始计算,adj为以后的时长,以秒计算。这是个很垃圾的设计,这个函数修改s结构体的data字段。!!失败返回NULL
int X509_set_pubkey(X509 *x, EVP_PKEY *pkey)
    设置证书的公钥部分,pkey也可以从EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req)这个函数的返回值得到,pkey应该是证书申请中包含的公钥而不是用于签名的证书中的公钥。
int X509_set_issuer_name(X509 *x, X509_NAME *name)
    设置证书的签名者,name应为用于签名证书中的名字,那个名字是有签名链的,可用509_NAME *X509_get_subject_name(X509 *a)得到,自签名的话就用如下方式得到:xn = X509_REQ_get_subject_name(req);X509_NAME_dup(xn);
int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial)
    设置证书的编号,这个编号最好是随机的,当然也可以为了管理设置一个有意义的可以这样得到一个ASN1_INTERGER类型的数字ASN1_INTERGER serial_no = ASN1_INTEGER_new();bn = BN_new();BN_pseudo_rand(bn, SERIAL_RAND_BITS, 0, 0);serial_no = BN_to_ASN1_INTEGER(bn, serial_no);

void X509V3_set_ctx(X509V3_CTX *ctx,
                    X509 *issuer,
                    X509 *subj,
                    X509_REQ *req,X509_CRL *crl, int flags)
    这个函数是用于管理CA的当我们用自己证书给下级证书进行签名是,进行的数据库管理,issuer是用于签名的证书,subj是下级证书,剩下的三个可以为NULL,这个函数把用于签名的证书和下级子证书的信息填入ctx这个结构体用于管理证书。ctx,用于和X509V3_EXT_conf_nid之间相互传递数据,最后的整个信息链会在证书中体现。
X509_EXTENSION *X509V3_EXT_conf_nid(NULL, &ctx,
    `               NID_subject_key_identifier, (char *)"hash");
    这个函数是CA管理里的一个,做用是,对ctx里的证书做一定的限制,这里的NID_subject_key_identifier限制就是key值的唯一性限制,左右一个参数是extension,这个参数说明证书是否可以继续给下级签名,可信度等等。地一个是配置文件的地方那个,NULL就是用默认的。
int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc)
    吧刚才得到的一个extention这知道到证书请求中,这个是合理的,不应该这知道用于签名的证书中,最后一个参数写-1,这是个汇编写的函数。设置了extention后需要在X509V3_set_ctx一下,应为如果设置了各种性,可能就不能加入证书库了,
int X509_sign(X509 *,EVP_PKEY * ca_key,*mb)
    这个就是签名了,在之前的证书请求设置,证书extension设置和CA维护都通过了,就可以给他钱上了,这里,地一个是证书包还证书请求的设置好证书模板,这个函数之能签名,且之改动签名算法用到是数据,第二个就是cakey,也就是d,第三个是签名算法,有如下:*mb=EVP_has1() 别的用vim + ctags找吧。
BIO_new(BIO_s_mem());
PEM_write_bio_X509(bio,X509)
    这两个函数吧crt写入BIO中。
$$有了签过名的证书就可以用BIO那套函数输出了。

X509_CRL *X509_CRL_new()
    生成一个空的crl buf,以后往这面填数据就好了。
int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
    填入crl签名者名字,当然是用于签名的证书的信息,也只有能用于签名的证书的信息才是有用的,name可以这样得到:X509_get_subject_name(x509);
int X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm);
int X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm);
    这两个函数用于这是crl的有效时间。tm可以这样得到:ASN1_TIME *tm=ASN1_new();/*这时tm里是当前时间*/X509_gmtime_adj(tmptm,0);/*用这个tm可以设置lsatupdate_time了*/X509_gmtime_adj(tmptm, (long)60 * 60 * 24 * VALIDITY_DAYS);/*用这个tm设置nextupdate_time*/
int X509_CRL_sort(X509_CRL *c)
    排序crl内的时间,这样时间可以作为序列号被使用。
int X509_CRL_sign(CRL *crl,EVP_PKEY *pkey,*mb)
    给crl进行签名,当然要用d的值了,pkey为用于签名的证书的私钥,mb为签名算法用EVP_sha1()别的用vim + ctags 找。
BIO_new(BIO_s_mem());
PEM_write_bio_X509_CRL(BIO,CRL)
    这连个函数吧crl写入bio中就能导出了。

向外引出的一共四个函数:
openssl_rsa_generate_key  这个函数生成密钥文件
    参数:一个32为int,这个是用于取莫的数字的长度。
    返回:text类型证书,这里是证书。
openssl_rsa_key_to_csr    这个函数用输入的key和信息生产csr
    参数:text类型的key,text类型的名字,text的国家,
          text类型的省份,text类型的城市
          text类型的部门,text类型的邮箱
    返回:text类型的这个证书请求
openssl_csr_to_crt        这个函数用ca的证书签名csr
    参数:text类型的csr,text类型的cacert正式路径,text类型的cakey证书路径
    返回:签过名的证书

penssl_rsa_generate_crl   这个用收入的证书和密钥生产crl
    参数:text的cacert证书路径,text的cakey路径
    返回:text的吊销单

© 著作权归作者所有

首席执行官机器人

首席执行官机器人

粉丝 12
博文 25
码字总数 23798
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

曾建凯
曾建凯
建议调整一下文档代码部分的结构,有点乱,但内容不错。
理解 Keystone 的四种 Token

Token 是什么 通俗的讲,token 是用户的一种凭证,需拿正确的用户名/密码向 Keystone 申请才能得到。如果用户每次都采用用户名/密码访问 OpenStack API,容易泄露用户信息,带来安全隐患。所...

koala bear
2015/12/26
0
0
OpenSSL--Window生成证书实战

Windows下使用OpenSSL生成自签证书(亲测) 一,前言 经常写博客的小伙伴儿都知道,大家一般在前言里面会提到为什么写这篇博客,而我这篇博客 主要是探讨OpenSSL自签名证书,用于对安全性要求...

ifanjiaxin
2015/06/05
2.2K
3
eBay CEO作序推荐《web商务安全设计与开发宝典》:对称加密系统

eBay CEO作序推荐《web商务安全设计与开发宝典》:对称加密系统 使 用密码的目的是防止信息在传输和存储过程中被除目标接受者以外的任何人读取和理解。理想情况下,未经授权的个人永远都不能...

louise
2012/09/17
282
0
Linux openssh openssl

Linux openssh openssl 笔记日期20180524 目录 openssh 配置ssh基于密钥的方式认证 服务器端配置文件 ssh服务的最佳实践 OpenSSL 三个组件 PKI: Public Key Infrastructure 建立私有CA 证书申...

Winthcloud
2018/06/29
0
0
keytool 工具应用分析与整理

文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。 本文仅供学习交流使用,侵权必删。 不用...

羽杰
2017/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
5
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
17
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部