09.openssl高级编程

10.1通用形式的堆栈操作函数
STACK_OF(TYPE) *sk_TYPE_new_null(void);
void sk_TYPE_free(STACK_OF(TYPE) *st)
void sk_TYPE_pop_free(STACK_OF(TYPE) *st, void (*free_func)(TYPE))
void sk_TYPE_zero(STACK_OF(TYPE) *st);
STACK_OF(TYPE) *sk_TYPE_dup(STACK_OF(TYPE)*st) ;

int sk_TYPE_push(STACK_OF(TYPE) *st, TYPE *val);
TYPE *sk_TYPE_pop(STATCK_OF(TYPE) *st)
int sk_TYPE_unshift(STACK_OF(TYPE) *st, TYPE *val)
TYPE *sk_TYPE_num(STACK_OF(TYPE) *st);
TYPE *sk_TYPE_value(STACK_OF(TYPE) *st, int i)
TYPE *sk_TYPE_set(STACK_OF(TYPE) *st, int i, TYPE *val);
TYPE *sk_TYPE_delete(STATCK_OF(TYPE) *st, int i)
TYPE *sk_TYPE_delete_ptr(STACK_OF(TYPE) *st,TYPE *ptr);
int sk_TYPE_insert(STACK_OF(TYPE) *st, TYPE *val, int i);


10.2 Configuration Files

10.3 X.509
在前面的章节中,我们详细讨论了证书。
我们将介绍以编程方式处理X.509系列操作的几个方面。要做到这一点最为合理,我们首先看看生成证书请求的正确方法。 我们也会看看请求本身的几个常见操作。 一旦我们知道如何提出请求,我们将看看用于从证书申请中创建一个完整的证书的函数。 最后,我们将讨论如何验证证书链。 我们已经讨论了SSL连接的这个过程,但是在处理X509时,我们将重点介绍验证对象。

10.3.1 Generating Requests
X.509证书是一个与证书所有者和发行者有关的信息打包的公钥.

int OBJ_txt2nid(const char *field);
X509_NAME_ENTRY *509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY *ne,int nid,
int type, unsigned char *value, int len);
int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int set)

10.3.2 Making Certificates
步骤
a.验证证书申请并检查其内容(subjectName和这个例子中的subjectAltName)来决定我们是否希望使用我们的CA来验证数据证书。
b.创建一个新的证书,并设置所有必要的字段,如公钥,主题和发行者名称,截止日期等。
c.将适用的扩展添加到证书,
d.使用CA的私钥签署证书。


10.4.1 Signing and Verifying
PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509)*certs,BIO *data, int flag)
int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags);
PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont);
int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,BIO *indata, BIO *out, int flags);

10.4.2 Encrypting and Decrypting
PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER
*cipher,int flags);
int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data,int flags);

10.4.4 PKCS#7 Flags
PKCS7_NOINTERN
验证过程不会使用嵌入在对象中的证书进行签名验证,即事先必须知道对等证书的成功
验证。

PKCS7_NOVERIFY
在验证PKCS#7对象时,不要尝试验证签名者的证书。 签名仍然会被检查。

PKCS7_NOCERTS
签名过程不会向生成的对象添加任何额外的证书。

PKCS7_DETACHED
签署数据时不要在生成的对象中包含签名者的证书。

PKCS7_NOSIGS
不要验证PKCS#7对象上的签名。

10.5 PKCS#12
PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509
*cert,STACK_OF(X509) *ca, int nid_key, int nid_cert,int iter, int mac_iter, int keytype);

PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12);

int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509
**cert, STACK_OF(X509) **ca);

posted @ 2018-01-07 23:10  艾小小雨  阅读(418)  评论(0编辑  收藏  举报