文档库 最新最全的文档下载
当前位置:文档库 › PEM证书格式

PEM证书格式

PEM证书格式
PEM证书格式

Openssl之PEM系列

作者: LaoKa

20080426

1.PEM编码文件结构介绍

PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发送邮件的标准,主要用来将各种对象保存成PEM格式,并将PEM格式的各种对象读取到相应的结构中。它的基本流程是这样的:

1.信息转换为ASCII码或其它编码方式;

2.使用对称算法加密转换了的邮件信息;

3.使用BASE64对加密后的邮件信息进行编码;

4.使用一些头定义对信息进行封装,这些头信息格式如下(不一定都需要,可选的):

Proc-Type,4:ENCRYPTED

DEK-Info: cipher-name, ivec其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRYPTED(信息已经加密和签名)、MIC-ONL Y(信息经过数字签名但没有加密)、MIC-CLEAR(信息经过数字签名但是没有加密、也没有进行编码,可使用非PEM格式阅读)以及CLEAR(信息没有签名和加密并且没有进行编码,该项好象是openssl自身的扩展,但是并没有真正实现);;第二个头信息标注了加密的算法以及使用的ivec参量,ivec其实在这儿提供的应该是一个随机产生的数据序列,与块加密算法中要使用到的初始化变量(IV)不一样。

5.在这些信息的前面加上如下形式头标注信息:

-----BEGIN PRIV ACY-ENHANCED MESSAGE-----

在这些信息的后面加上如下形式尾标注信息:

-----END PRIVACY-ENHANCED MESSAGE-----

上面是openssl的PEM文件的基本结构,需要注意的是,Openssl并没有实现PEM的全部标准,它只是对openssl中需要使用的一些选项做了实现,详细的PEM格式,请参考RFC1421-1424。

下面是一个PEM编码的经过加密的DSA私钥的例子:

-----BEGIN DSA PRIV A TE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: DES-EDE3-CBC,F80EEEBEEA7386C4

GZ9zgFcHOlnhPoiSbVi/yXc9mGoj44A6IveD4UlpSEUt6Xbse3Fr0KHIUyQ3oGnSmClKoAp/eOTb5Frhto85Szd sxYtac+X1v5XwdzAMy2KowHVk1N8A5jmE2OlkNPNtof132MNlo2cyIRYaa35PPYBGNCmUm7YcYS8O90Y tkrQZZTf4+2C4kllhMcdkQwkrFWSWC8YOQ7w0LHb4cX1FejHHom9Nd/0PN3vn3UyySvfOqoR7nbXkrpHX mPIr0hxXRcF0aXcV/CzZ1/nfXWQf4o3+oD0T22SDoVcZY60IzI0oIc3pNCbDV3uKNmgekrFdqOUJ+QW8oW p7oefRx62iBfIeC8DZunohMXaW AQCU0sLQOR4yEdeUCnzCSywe0bG1diD0KYaEe+Yub1BQH4aLsBgDjardg pJRTQLq0DUvw0/QGO1irKTJzegEDNVBKrVnV4AHOKT1CUKqvGNRP1UnccUDTF6miOAtaj/qpzra7sSk7d kGBvIEeFoAg84kfh9hhVvF1YyzC9bwZepruoqoUwke/WdNIR5ymOVZ/4Liw0JdIOcq+atbdRX08niqIRkfdsZrU j4leo3zdefYUQ7w4N2Ns37yDFq7

-----END DSA PRIV ATE KEY-----

有时候PEM编码的东西并没有经过加密,只是简单进行了BASE64编码,下面是一个没有加密的证书请求的例子:

-----BEGIN CERTIFICATE REQUEST-----

MIICVTCCAhMCAQAwUzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVB AoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UEAxMDUENBMIIBtTCCASkGBSsOAwIM MIIBHgKBgQCnP26Fv0FqKX3wn0cZMJCaCR3aajMexT2GlrMV4FMuj+BZgnOQPnUxmUd6UvuF5Nmmezi baIqEm4fGHrV+hktTW1nPcWUZiG7OZq5riDb77Cjcwtelu+UsOSZL2ppwGJU3lRBWI/YV7boEXt45T/23Qx+ 1pGVvzY AR5HCVW1DNSQIV APcHMe36bAYD1YWKHKycZedQZmVvAoGA Td9MA6aRivUZb1BGJZnlaG 8w42nh5bNdmLsohkj83pkEP1+IDJxzJA0gXbkqmj8YlifkYofBe3RiU/xhJ6h6kQmdtvFNnFQPW AbuSXQHzlV+ I84W9srcWmEBfslxtU323DQph2j2XiCTs9v15AlsQReVkusBtXOlan7YMu0OArgDgYUAAoGBAKbtuR5AdW +ICjCFe2ixjUiJJzM2IKwe6NZEMXg39+HQ1UTPTmfLZLps+rZfolHDXuRKMXbGFdSF0nXYzotPCzi7Gauw EJTZyr27ZZjA1C6apGSQ9GzuwNvZ4rCXystVEagAS8OQ4H3D4dWS17Zg31ICb5o4E5r0z09o/Uz46u0VoAA wCQYFKw4DAhsFAAMxADAuAhUArRubTxsbIXy3AhtjQ943AbNBnSICFQCu+g1iW3jwF+gOcbroD4S/Zcv B3w==

-----END CERTIFICATE REQUEST-----

可以看到,该文件没有了前面两个头信息。大家如果经常使用openssl的应用程序,就对这些文件格式很熟悉了。

2.PEM类型和实现结构介绍

openssl中定义的PEM相关结构体如下(openssl\pem.h),这些结构体是所有PEM系列函数的基础。

下面定义的是PEM一个高层应用结构,该结构通过PEM_SealInit进行初始化,最后使用PEM_SealFinal 进行释放,该结构定义了PEM中要使用的编码算法、信息摘要算法以及加密算法。

typedef struct PEM_Encode_Seal_st

{

EVP_ENCODE_CTX encode;

EVP_MD_CTX md;

EVP_CIPHER_CTX cipher;

} PEM_ENCODE_SEAL_CTX;

下面定义了PEM_CTX中的一个子结构,用来保存用户的信息

typedef struct pem_recip_st

{

char *name;

X509_NAME *dn;

int cipher;

int key_enc;

} PEM_USER;

下面是PEM主结构体PEM_CTX结构的定义,我们将在注释里面对必要的参数进行说明。

typedef struct pem_ctx_st

{

int type;//结构类型

struct

{

int version;//版本号

int mode;//编码方式

} proc_type;//Proc_Type字段信息,包括版本号和编码方式

char *domain;

struct

{

int cipher;

} DEK_info;//定义了PEM中DEK_info字段的信息

PEM_USER *originator;

int num_recipient;

PEM_USER **recipient;

#ifndef OPENSSL_NO_STACK

STACK *x509_chain;//保存证书链

#else

char *x509_chain; //保存证书链

#endif

EVP_MD *md; //签名算法类型,指定了信息摘要算法和签名算法

int md_enc; //信息摘要算法是否进行了加密(签名)

int md_len; //摘要信息的长度

char *md_data; //摘要信息,可以是经过了加密(签名)的信息

EVP_CIPHER *dec;//数据加密算法

int key_len; //密钥长度

unsigned char *key; //加密密钥

int data_enc; //数据是否加密标志

int data_len; //数据长度

unsigned char *data; //数据

} PEM_CTX;

下面我们对PEM_CTX结构体中一些重要的参数做详细的说明

2.1 int type参数

该参数指明了PEM_CTX结构的类型,目前包括了以下定义的类型:#define PEM_OBJ_UNDEF 0

#define PEM_OBJ_X509 1

#define PEM_OBJ_X509_REQ 2

#define PEM_OBJ_CRL 3

#define PEM_OBJ_SSL_SESSION 4

#define PEM_OBJ_PRIV_KEY 10

#define PEM_OBJ_PRIV_RSA 11

#define PEM_OBJ_PRIV_DSA 12

#define PEM_OBJ_PRIV_DH 13

#define PEM_OBJ_PUB_RSA 14

#define PEM_OBJ_PUB_DSA 15

#define PEM_OBJ_PUB_DH 16

#define PEM_OBJ_DHPARAMS 17

#define PEM_OBJ_DSAPARAMS 18

#define PEM_OBJ_PRIV_RSA_PUBLIC 19

可以看到,这些类型基本上包括了所有openssl中要使用的基本结构

2.2 struct proc_type参数

该参数是保存了PEM标准中Proc_Type字段的信息(参考《openssl之PEM系列之1》),可以看到,该结构包括两个字段,第一个字段version是版本号,第二个字段mode是信息的编码方式,目前定义了四种,如下:

#define PEM_TYPE_ENCRYPTED 10

#define PEM_TYPE_MIC_ONL Y 20

#define PEM_TYPE_MIC_CLEAR 30

#define PEM_TYPE_CLEAR 40

这四个值的意义可以参考《openssl之PEM系列之1》。值得注意是,在openssl实现的PEM文件中,最后一个PEM_TYPE_CLEAR其实并没有用到。

2.3 struct DEK_info参数

该参数定义了PEM中DEK_info字段的信息,本来该参数应该含有两个字段,包括加密算法和IV。但是由于历史原因,openssl中原有的非标准的IV字段在新版的openssl中取消了,所以就剩下一个算法定义了,目前支持的算法如下述的定义:

#define PEM_DEK_DES_CBC 40

#define PEM_DEK_IDEA_CBC 45

#define PEM_DEK_DES_EDE 50

#define PEM_DEK_DES_ECB 60

#define PEM_DEK_RSA 70

#define PEM_DEK_RSA_MD2 80

#define PEM_DEK_RSA_MD5 90

3.PEM系列函数通用参数介绍

PEM系列函数中很多参数是相同意义的,也就是说通用的。本节将对这些通用参数的意义进行介绍,以便于后述章节能够更方便流畅地进行PEM系列函数的介绍。

3.1 bp参数

如果函数有该参数,则定义了进行数据读写BIO接口。

3.2 fp参数

如果函数包含了该参数,则定义了进行数据读写的FILE指针。

3.3 TYPE类型参数

PEM读操作的系列函数都有TYPE **x 和返回TYEP *指针的参数。这里的TYPE可以为任何函数要使用的结构体,如DSA或X509之类的。如果参数x是NULL,那么该参数将被忽略。如果x不是NULL,但是*x是NULL,那么返回的结构体就会写入到*x里面。如果x和*x都不是NULL,那么函数就试图重

用*x中的结构体。这中函数总是返回一个执行结构体的指针(x的值),如果出错,就返回NULL。

3.4 enc参数

enc参数定义了PEM函数写私钥的时候采用的加密算法。加密是在PEM层进行的。如果该参数为NULL,那么私钥就会以不加密的形式写入相应的接口。

3.5 cb参数

cb参数定义了回调函数,该回调函数在加密PEM结构体(一般来说是私钥)需要口令的时候使用。

3.6 kstr参数

主要在PEM写系列函数里面使用,如果该参数不为NULL,那么kstr中klen字节数据就用来作为口令,此时,cb参数就被忽略了。

3.7 u参数

如果cb参数为NULL,而u参数不为NULL,那么u参数就是一个以NULL结束的字符串用作口令。如果cb和u参数都是NULL,那么缺省的回调函数就会并使用,该函数一般在当前的终端提示输入口令,并且关掉了回显功能。

3.8回调函数callback函数介绍

因为缺省的回调函数基于终端的,有时候不适合使用(如GUI程序),所以可以使用替换的回调函数。回到函数的形式如下:

int cb(char *buf, int size, int rwflag, void *u);

在该函数中,buf是保存口令的参数。size是考虑最大的长度(如buf的长度)。rwflag是一个读写标志,0的时候为读操作,1的时候为写操作。当rwflag为1的时候,典型的函数一般会要求用户验证口令(如输入两次)。u参数跟上述PEM函数的u参数意义是一样的,它允许应用程序使用固定的数据作为参数传给回调函数。回调函数必须返回口令字符的数目,如果出错返回0。

4.PEM结构信息处理函数

本次介绍的函数是处理PEM结构里面一些字段信息的函数,这些函数在一般应用中可能不会用到,但是深入一点的应用,恐怕就避免不了。此外,了解这些应用,对于加深对PEM结构的理解也是很有好处的。下面是其中相关一些函数的定义(openssl\pem.h):

int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher);

int PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data,long *len,pem_password_cb *callback,void *u);

void PEM_proc_type(char *buf, int type);

void PEM_dek_info(char *buf, const char *type, int len, char *str);

4.1 PEM_proc_type

该函数是通过给定参数type返回一个标准的PEM文件的Proc-Type字段信息。返回的信息写入到buf 参数里面去,所以要求buf分配的内存空间必须足够大。事实上,该函数返回的字符串不外乎下面四种结果:

当type为PEM_TYPE_ENCRYPTED,返回字符串为"Proc-Type: 4,ENCRYPTED\n"

当type为PEM_TYPE_MIC_CLEAR,返回字符串为"Proc-Type: 4,MIC-CLEAR\n"

当type为PEM_TYPE_MIC_ONL Y,返回字符串为"Proc-Type: 4,MIC-ONL Y\n"

当type为其它值时,返回字符串为"Proc-Type: 4,BAD-TYPE\n"

事实上,虽然上字段信息中有MIC(信息摘要)选项,但openssl的PEM库并没有实现MIC计算的功能。当然,可以通过使用RSA-MD系列函数将PEM的数据信息进行摘要并将该结果作为PEM的MIC。你可以通过PEM_dek_info函数产生MIC-info头信息,然后写入到PEM结构中,不过据openssl的说明,这需要的时间可能会比较长,大概5分钟左右。

4.2 PEM_dek_info

该函数跟上述函数相似,是根据type参数生成DEK-info字段的信息,返回并写入到buf里面。参数str里应该是提供了ivec变量的值,参数len是str的长度(单位是字节)。在这里,参数type应该为加密算法的名字,原则上这个字符串可以是任意的,但是为了其它程序能够正确解释该字段,你可以先得到算法相应的NID,然后通过调用nid2sn得到该算法的简称作为type参数。例如我们需要在PEM_ASN1_write_bio 中使用算法结构enc,那么可以调用下面函数:

objstr=OBJ_nid2sn(EVP_CIPHER_nid(enc));

此时objstr就是一个包含了算法enc的简称的字符串。然后我们就可以通过下面的语句在PEM_dek_info函数中使用这个字符串了:

PEM_dek_info(buf,objstr,8,(char *)iv);

4.3 PEM_do_header

该函数并非顾名思义,事实上它完成了对一个PEM编码对象的的解密工作(如果该PEM对象需要进行解密),该函数通常是被PEM_read_bio所调用的。在调用该函数之前,应该已经将PEM文件的一些头信息得到,以便于正确进行解密操作。其中,DEK-info字段的信息应该在调用本函数之前进行正确的处理,从而通过该字段的名字和ivec得到相应的EVP_CIPHER结构信息和IV变量,作为本函数的cipher参数。

如果PEM文件没有DEK-info字段,那么该函数简单返回1,操作成功,因为不需要进行解密操作。如果不是的话,那么该函数就需要一个口令来进行解密。首先,它会试图从callback参数(一个回调函数)中得到该口令。回调函数的格式如下:

callback(buffer, blen, verify)

其中,参数buffer是保存返回口令的地方,blen是buffer的最大长度,verify参数是指明是否需要口令验证(就是要求用户输入两次相同的口令),默认的是0。

如果callback参数为NULL,而u参数不为NULL,那么u参数就会以NULL为结束符的字符串作为口令写入到buffer中;如果callback和u参数都为NULL,那么就会调用缺省的callback函数(关于u的具体意义,请参考《openssl之PEM系列之3》)。PEM_do_header函数得到口令后,就使用该口令(包括长度信息)跟cipher参数种的ivec变量一起对数据进行解密。解密后的数据保存在data中,长度信息保存在plen中。该函数操作成功返回1,否则返回0。

4.4 PEM_get_EVP_CIPHER_INFO

该函数一般也被PEM_read_bio函数调用。在调用该函数之前,PEM的Proc-Type头信息应该已经作为明文被读入到header参数中。如果header为NULL,那么函数成功返回1,因为没有什么头信息要处理。如果不为NULL,那么该函数首先确定header信息是否以“Proc-Type:4,ENCRYPTED”开头,如果是其它形式的,该函数将返回0,不进行处理。之后,函数开始读取DEK-info字段的信息,然后函数通过该字段的加密算法名字使用EVP_get_cihperbyname得到一个EVP_CIPHER结构,并保存在参数cipher->cipher中;然后函数再通过调用内部的函数得到ivec的值,并保存在cipher->iv中。成功操作返回1,否则返回0。

需要注意的是,因为该函数调用了EVP_get_cipherbyname,所以在调用本函数前,应该先调用EVP_add_cipher和EVP_add_alias,或者调用SSLeay_add_all_algorithms,从而将所有加密算法的信息载入到程序中。具体的情况请参考《openssl之EVP系列》相关章节。

5.PEM信息封装加密系列函数

该系列函数完成了对PEM对象以及相关密钥和IV向量的加密编码工作,以便于数据的保存和传送,主要包括以下函数(openssl\pem.h):

int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type,EVP_MD *md_type, unsigned char **ek, int *ekl,unsigned char *iv, EVP_PKEY **pubk, int npubk);

void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl,unsigned char *in, int inl);

int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig,int *sigl,unsigned char *out, int *outl, EVP_PKEY *priv);

void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type);

void PEM_SignUpdate(EVP_MD_CTX *ctx,unsigned char *d,unsigned int cnt);

int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,unsigned int *siglen, EVP_PKEY *pkey);

void ERR_load_PEM_strings();

其中,PEM_Seal*系列函数完成了对PEM对象、密钥和IV变量的加密编码工作,PEM_Sign系列函数完成了对PEM进行数字签名的工作。

5.1 PEM_SealInit函数

该函数为后续的PEM_SealUpdate和PEM_SealFinal函数做初始化工作。首先,该函数使用参数md_type 调用函数EVP_SignInit对信息摘要结构ctx->md进行初始化。然后,该函数通过参数type找到相应的EVP_CIPHER结构,产生适用于该算法的密钥和ivec变量并保存在该算法结构中,然后使用参数pubk的公钥调用函数EVP_SealInit对该密钥进行加密。加密后的秘钥保存在参数ek里面,其长度保存在ekl里面,这些数据都是调用了EVP_EncodeUpdate函数经过了BASE64编码的。因为密钥和IV已经保存在ctx->cipher 中,所以,可以被后续的函数用来对PEM对象进行加密处理。该函数成功操作返回正值,否则返回0或-1。

需要注意的是,因为本函数也使用了加密算法名字查找算法结构,所以在调用本函数之前必须加载该静态算法结构栈。

5.2 PEM_SealUpdate函数

该函数用来完成对PEM对象信息体的加密和编码,使用的加密密钥是PEM_SealInit函数产生的。该

函数对参数in中的inl个字节的数据采用ctx->cipher提供的对称加密算法结构(已经包含了密钥和IV)进行加密操作,然后调用EVP_EncodeUpdate进行BASE64编码后保存在参数out里面,outl是out里有效数据的长度信息。在此同时,该函数也调用函数EVP_SignUpdate函数使用ctx->md的摘要算法结构对参数in里的数据进行了信息摘要操作,不过暂时没有输出,等调用了PEM_SealFinal函数的时候进行输出。

需要注意的是,该函对输入的信息in的长度做了限制,不能大于1200字节,否则将超过1200字节的信息简单丢弃。

5.3 PEM_SealFinal函数

该函数完成整个PEM_Seal系列的操作。首先,它完成了之前使用PEM_SealUpdate函数进行处理的数据的对称加密工作,将数据进行BASE64编码并输出到参数out,outl保存了out数据的有效长度。同时,该函数还完成了信息摘要工作,并使用参数priv的私钥对该信息进行签名(加密),将结果经过BASE64编码后输出到参数sig,sigl是sig有效数据的长度信息。该函数成功操作返回1,否则返回0。

需要注意的是,该函数运行完后,就将ctx->md和ctx->cipher结构释放清除掉了,所以如果你想保存对称加密算法使用的密钥和IV的话,你需要在调用本函数之前就保存一个备份。当然,一般情况下是不会这么做的,因为这些密钥应该是临时密钥,只用来加密一个信息。

5.4 PEM_Seal操作总结

完成上述三个函数的操作之后,你就得到了加密后的密钥、IV(从PEM_SealInit函数)以及PEM对象信息体,并且这些都是经过BASE64编码的。然后,你就可以将这些信息发送给接受方了。对方接受到这些信息后,使用他自己的私钥以及你的公钥,就能进行正确的数据解密和验证。

5.5 PEM_SignInit,PEM_SignUpdate和PEM_SignFinal函数

这三个函数完成的功能跟EVP_Sign系列函数是一样的,其实,前面两个函数就简单调用了EVP_SignInit和EVP_SignUpdate函数。PEM_SignFinal则调用EVP_SignFinal函数完成信息摘要和签名(使用参数pkey的私钥)之后,调用了EVP_EncodeBlock对签名信息进行了BASE64编码,然后将编码后的签名信息保存在参数sigret,siglen保存了sigret有效数据的长度。PEM_SignFinal函数成功返回1,否则返回0。

5.6 ERR_load_PEM_strings函数

该函数使用了PEM库的错误代码信息对错误处理库进行初始化,必须在使用任何PEM系列函数之前调用该函数。

6.PEM底层IO函数

PEM提供了一系列底层的进行数据读写操作的IO函数,在后面章节叙述到的PEM对象的IO函数都是这些函数的宏定义,所以虽然一般不要直接调用这些函数,做一个清楚的了解还是必要的。这些函数定义如下(openssl\pem.h):

int PEM_read_bio(BIO *bp, char **name, char **header,unsigned char **data,long *len);

int PEM_write_bio(BIO *bp,const char *name,char *hdr,unsigned char *data,long len);

int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char *name, BIO

*bp,pem_password_cb *cb, void *u);

char *PEM_ASN1_read_bio(char *(*d2i)(),const char *name,BIO *bp,char **x,pem_password_cb *cb, void *u);

int PEM_ASN1_write_bio(int (*i2d)(),const char *name,BIO *bp,char *x,const EVP_CIPHER *enc,unsigned char *kstr,int klen,pem_password_cb *cb, void *u);

STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u);

int PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc,unsigned char *kstr, int klen, pem_password_cb *cd, void *u);

int PEM_read(FILE *fp, char **name, char **header,unsigned char **data,long *len);

int PEM_write(FILE *fp,char *name,char *hdr,unsigned char *data,long len);

char *PEM_ASN1_read(char *(*d2i)(),const char *name,FILE *fp,char **x,pem_password_cb *cb, void *u);

int PEM_ASN1_write(int (*i2d)(),const char *name,FILE *fp,char *x,const EVP_CIPHER *enc,unsigned char *kstr,int klen,pem_password_cb *callback, void *u);

STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk,pem_password_cb *cb, void *u);

可以看到,这些函数中有很多参数在第3部分介绍过,在此将不再详细介绍。

6.1 PEM_read函数

该函数从文件fp里面读取一个PEM编码的信息。该函数将文件里BEIGIN后面的字符作为对象名保存在参数name里面;将BEGIN所在行和下一个空白行之间的所有信息都读入到参数header里面,如果之间没有信息,就将header设置为NULL;然后将信息体进行BASE64解码放置到data参数里面,len是data 参数的有效数据长度。该函数成功返回1,失败返回0。

6.2 PEM_read_bio函数

该函数完成了跟PEM_read相同的功能,只不过读取对象是BIO。事实上,PEM_read是通过调用本函数完成其功能的。该函数成功返回1,失败返回0。

6.3 PEM_write函数

该函数将name参数的数据放在BEGIN头的后面,写入到fp文件;之后将参数hdr信息写入到文件,并在后面写入一个空白行;最后将data参数len字节的数据进行BASE64编码,写入到文件中,并最后加上END头信息,返回PEM信息体的长度,失败返回0。

6.4 PEM_write_bio函数

该函数跟PEM_write函数功能一样,只是操作对象是BIO。事实上,PEM_write函数就是调用本函数完成其功能的。成功返回PEM信息体的长度,失败返回0。

6.5 PEM_ASN1_read函数

该函数先调用PEM_read函数读取PEM编码的对象信息,然后调用PEM_get_EVP_CIPHER_INFO函

数处理PEM格式中的DEK-info字段信息,以决定信息采用的加密算法和ivec值;加入PEM信息是加密了的,接下来就调用PEM_do_header函数解密信息体(参考第4部分),然后调用d2i函数将它进行DER 解码转换成内部定义个类型,保存在x参数中。成功返回指向x的指针,否则返回NULL。

注意,参数name必须是BEIGIN头后面的PEM文件数据。因为函数调用了PEM_get_EVP_CIPHER_INFO函数,所以为了函数能成功执行,必须在调用本函数前加载算法。虽然事实上任何类型数据都可以进行加密,但一般来说只有RSA私钥需要加密。本函数可以从一个文件中读取一些列对象。

6.6 PEM_ASN1_read_bio函数

该函数功能跟PEM_ASN1_read函数一样,不过操作对象是BIO。事实上,PEM_ASN1_read函数是调用本函数完成其功能的。成功返回指向x的指针,否则返回NULL。

6.7 PEM_ASN1_write函数

该函数将对象x使用i2d参数提供的函数转换城DER编码的数据,接下来,如果enc参数不为NULL,就使用enc的加密算法加密这些数据。参数kstr是用来产生加密密钥的,klen是kstr的有效长度。如果enc 不是NULL,但是kstr是NULL,那么就会使用callback函数提示用户输入口令并获取加密数据;如果此时callback为NULL,但是u不为NULL,那么就是使用u作为产生加密密钥的字符串,假定u应该是NULL 结束的字符串;如果callback和u都为NULL,那就会使用缺省的callback函数获取口令。然后数据就被进行BASE64编码写入到fp文件中,加上BEIGIN开始头信息、END结束头信息、Type-Proc字段和DEK-info 字段(如果数据被加密了)。加密密钥在函数调用完之后就被清除了。成功操作返回1,否则返回0。

6.8 PEM_ASN1_wirte_bio函数

该函数实现的功能跟PEM_ASN1_write一样,不过操作对象是BIO。事实上PEM_ASN1_write函数是调用本函数完成其功能的。成功操作返回1,否则返回0。

6.9 PEM_X509_INFO_read函数

该函数完成的功能跟PEM_ASN1_read是一样的,除了它自动根据BEGIN头信息调用了相应的d2i系列函数,目前支持的类型d2i_X509、d2i_X509_AUX、d2i_X509_CRL、d2i_RSAPrivateKey和d2i_DSAPrivateKey。该函数会对文件中的所有对象进行处理直到出错或处理完毕。所有被处理好的对象都保存在堆栈sk中。因为有可能有些对象是加密的,所以提供了参数cb和u。参数cb和u的意义参照第3部分。成功返回处理好的堆栈指针,否则返回NULL。

6.10 PEM_X509_INFO_read_bio函数

该函数完成的功能跟PEM_X509_INFO_read函数一样,除了操作对象是BIO之外。事实上,PEM_X509_INFO_read函数是调用本函数完成其功能的。成功返回处理好的堆栈指针,否则返回NULL。

6.11 PEM_X509_INFO_write_bio函数

该函数完成的功能也跟PEM_ASN1_write_bio一样。除了它从参数xi中读取每一部分对象,分别使用

参数xi->x_pkey和xi->x509并使用相应的i2d函数进行PEM编码成独立的信息,并写入到bio中。同样,可能要求用户输入口令生成加密密钥,相关的参数cb、enc、kstr、klen以及u的意义参考前面的函数以及第3部分。该函数成功返回1,否则返回0。

7.PEM对象读写IO函数(一)

openssl基本上为其定义的每种对象都提供了用PEM格式进行读写的IO函数。在这种意义上说,PEM 格式只是包含了头信息的BASE64编码的数据而已。这些函数基本上是基于第6部分所介绍的函数实现的,也就是说,他们多大部分只是这些函数的宏定义而已。因为我们在第3部分已经详细介绍了PEM系列函数的通用参数,所以本文对这些通用参数不再作详细的说明。

对于每个对象,openssl一般提供了四个函数,比如名为Name的对象,提供的四个函数名就如下形式:PEM_read_bio_Name()

PEM_read_Name()

PEM_write_bio_Name()

PEM_write_Name()

可以看到,有两个是读操作函数,两个是写操作函数。其中,两个读操作函数或两个写操作函数都是功能相同的,不过就是对象一个为文件句柄,一个为BIO罢了。此外,所有对象的读函数如果操作成功,返回相应对象的指针,否则返回NULL;而写函数则成功操作返回非0值,失败返回0。下面我们对这些函数简单分类介绍。

7.1 私钥对象PrivateKey的IO

EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x,pem_password_cb *cb, void *u);

EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x,pem_password_cb *cb, void *u);

int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);

int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);

这些函数用PEM格式对一个EVP_PKEY结构的私钥进行读写操作。写操作函数可以处理RSA或DSA 类型的私钥。读操作函数还能透明的处理用PKCS#8格式加密和解密的私钥。

1.往文件中写入不加密的私钥的例子

if (!PEM_write_PrivateKey(fp, key, NULL, NULL, 0, 0, NULL))

{

/* 错误处理代码*/

}

2.往BIO中写入一个私钥,采用3DES加密,加密口令提示输入的例子

if (!PEM_write_bio_PrivateKey(bp, key, EVP_des_ede3_cbc(), NULL, 0, 0, NULL))

{

/* 错误处理代码*/

}

3.从BIO重读取一个私钥,使用"hello"作为解密口令的例子

key = PEM_read_bio_PrivateKey(bp, NULL, 0, "hello");

if (key == NULL)

{

/* 错误处理代码*/

}

4.从BIO中读取一个私钥,并使用回调函数获得解密口令的例子

key = PEM_read_bio_PrivateKey(bp, NULL, pass_cb, "My Private Key");

if (key == NULL)

{

/* 错误处理代码*/

}

8.PEM对象读写IO函数(二)

本文继续介绍PEM对象的读写IO函数,请参看第7部分以便更好理解本文。

8.1符合PKCS#8和PKCS#5 v2.0标准的私钥对象PKCS8PrivateKey的IO

int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,char *kstr, int klen,pem_password_cb *cb, void *u);

int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,char *kstr, int klen,pem_password_cb *cb, void *u);

这两个函数使用PKCS#8标准保存EVP_PKEY里面的私钥到文件或者BIO中,并采用PKCS#5 v2.0的标准加密私钥。enc参数定义了使用的加密算法。跟其他PEM的IO函数不一样的是,本函数的加密是基于PKCS#8层次上的,而不是基于PEM信息字段的,所以这两个函数也是单独实现的函数,而不是宏定义函数。如果enc参数为NULL,那么就不会执行加密操作,只是使用PKCS#8私钥信息结构。成功执行返回大于0 的数,否则返回0。

使用这两个函数保存的PEM对象可以使用上篇文章介绍的PEM_read_bio_PrivateKey或PEM_read_PrivateKey读出来。

下面是一个将私钥保存为PKCS#8格式,并使用3DES算法进行加密,使用的口令是"hello"的例子if (!PEM_write_bio_PKCS8PrivateKey(bp, key, EVP_des_ede3_cbc(), NULL, 0, 0, "hello"))

{

/*出错处理代码*/

}

8.2符合PKCS#8和PKCS#5 v1.5或PKCS#12标准的私钥对象PKCS8PrivateKey的IO

int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,char *kstr, int klen,pem_password_cb *cb, void *u);

int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,char *kstr, int klen,pem_password_cb *cb, void *u);

这两个函数也是单独实现的函数,而不是宏定义函数。他们也是将私钥保存成PKCS#8格式,但是采用的方式是PKCS#5 v1.5或者PKCS#12进行私钥的加密。nid参数指定了相应的加密算法,其值应该为相应对象的NID。成功执行返回大于0 的数,否则返回0。

使用这两个函数保存的PEM对象可以使用上篇文章介绍的PEM_read_bio_PrivateKey或PEM_read_PrivateKey读出来。

8.3公钥对象PUBKEY的IO

EVP_PKEY *PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x,pem_password_cb *cb, void *u);

EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x,pem_password_cb *cb, void *u);

int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);

int PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x);

这四个函数对EVP_PKEY结构的公钥进行PEM格式的读写处理。公钥是作为SubjectPublicKeyInfo 存储结构进行编码的。

8.4 RSA私钥对象RSAPrivateKey的IO

RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);

RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);

int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);

int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);

这四个函数对RSA结构的RSA私钥进行PEM格式的读写处理。它使用跟PrivateKey相同的函数进行处理,但如果私钥类型不是RSA,就会返回错误信息。

8.5 RSA公钥对象RSAPublicKey的IO

RSA *PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);

RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);

int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);

int PEM_write_RSAPublicKey(FILE *fp, RSA *x);

这四个函数是对RSA结构的公钥进行PEM格式的读写处理。本函数使用PKCS#1 RSAPublicKey结构标准对RSA公钥进行编码操作。

8.6 RSA公钥对象RSA_PUBKEY的IO

RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x,pem_password_cb *cb, void *u);

RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x,pem_password_cb *cb, void *u);

int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);

int PEM_write_RSA_PUBKEY(FILE *fp, RSA *x);

这四个函数也是对RSA结构的公钥进行PEM格式的读写处理。但是本函数使用SubjectPublicKeyInfo 结构标准对RSA公钥进行编码操作,如果公钥类型不是RSA,就出错返回失败信息。

9.PEM对象读写IO函数(三)

本文继续介绍PEM对象的读写IO函数,请参看第7部分和第8部分以便更好理解本文。

9.1 DSA私钥对象DSAPrivateKey的IO函数

DSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **x,pem_password_cb *cb, void *u);

DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **x,pem_password_cb *cb, void *u);

int PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);

int PEM_write_DSAPrivateKey(FILE *fp, DSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);

这些函数对以DSA结构存储的DSA私钥进行PEM格式的IO读写。它们使用的处理格式跟PrivateKey 系列函数是相同的,但是如果私钥不是DSA类型的,则出错返回。

9.2 DSA公钥对象DSA_PUBKEY的IO函数

DSA *PEM_read_bio_DSA_PUBKEY(BIO *bp, DSA **x,pem_password_cb *cb, void *u);

DSA *PEM_read_DSA_PUBKEY(FILE *fp, DSA **x,pem_password_cb *cb, void *u);

int PEM_write_bio_DSA_PUBKEY(BIO *bp, DSA *x);

int PEM_write_DSA_PUBKEY(FILE *fp, DSA *x);

这些函数对以DSA结构存储的DSA公钥进行PEM格式的IO读写。该公钥是以SubjectPublicKeyInfo 结构进行编码的,如果公钥不是DSA类型,则将会出错返回。

9.3 DSA参数对象DSAParams的IO函数

DSA *PEM_read_bio_DSAparams(BIO *bp, DSA **x, pem_password_cb *cb, void *u);

DSA *PEM_read_DSAparams(FILE *fp, DSA **x, pem_password_cb *cb, void *u);

int PEM_write_bio_DSAparams(BIO *bp, DSA *x);

int PEM_write_DSAparams(FILE *fp, DSA *x);

这些函数对以DSA结构存储的DSA参数进行PEM格式的IO读写操作。

9.4 DH参数对象DHParams的IO函数

DH *PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u);

DH *PEM_read_DHparams(FILE *fp, DH **x, pem_password_cb *cb, void *u);

int PEM_write_bio_DHparams(BIO *bp, DH *x);

int PEM_write_DHparams(FILE *fp, DH *x);

这些函数对以DH结构保存的DH参数进行PEM格式的IO读写操作,这些参数采用了PKCS#3的DH参数结构进行编码。

9.5 X509证书对象X509的IO函数

X509 *PEM_read_bio_X509(BIO *bp, X509 **x, pem_password_cb *cb, void *u);

X509 *PEM_read_X509(FILE *fp, X509 **x, pem_password_cb *cb, void *u);

int PEM_write_bio_X509(BIO *bp, X509 *x);

int PEM_write_X509(FILE *fp, X509 *x);

这些函数对以X509结构保存的X509证书进行PEM格式的IO读写操作,这些函数也可以对信任X509

证书进行相同的操作,但是信任设置信息会丢失。

9.6 X509信任证书对象X509_AUX的IO函数

X509 *PEM_read_bio_X509_AUX(BIO *bp, X509 **x, pem_password_cb *cb, void *u);

X509 *PEM_read_X509_AUX(FILE *fp, X509 **x, pem_password_cb *cb, void *u);

int PEM_write_bio_X509_AUX(BIO *bp, X509 *x);

int PEM_write_X509_AUX(FILE *fp, X509 *x);

这些函数对以X509结构保存的信任X509证书进行PEM格式的IO读写操作。

9.7 X509证书请求对象X509_REQ的IO函数

X509_REQ *PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x,pem_password_cb *cb, void *u);

X509_REQ *PEM_read_X509_REQ(FILE *fp, X509_REQ **x,pem_password_cb *cb, void *u);

int PEM_write_bio_X509_REQ(BIO *bp, X509_REQ *x);

int PEM_write_X509_REQ(FILE *fp, X509_REQ *x);

int PEM_write_bio_X509_REQ_NEW(BIO *bp, X509_REQ *x);

int PEM_write_X509_REQ_NEW(FILE *fp, X509_REQ *x);

这些函数对以X509_REQ结构存储的符合PKCS#10标准的证书请求进行PEM格式的IO读写操作。不同的是,X509_REQ系列写函数使用CERTIFICATE REQUEST作为头,而X509_REQ_NEW系列写函数则采用NEW CERTIFICATE REQUEST作为头(一些CA要求这种格式)。而X509_REQ读函数对这两种情况都能处理,所以没有X509_REQ_NEW的读函数了。

9.8 X509吊销列表对象X509_CRL的IO函数

X509_CRL *PEM_read_bio_X509_CRL(BIO *bp, X509_CRL **x,pem_password_cb *cb, void *u);

X509_CRL *PEM_read_X509_CRL(FILE *fp, X509_CRL **x,pem_password_cb *cb, void *u);

int PEM_write_bio_X509_CRL(BIO *bp, X509_CRL *x);

int PEM_write_X509_CRL(FILE *fp, X509_CRL *x);

这些函数对以X509_CRL结构存储的X509 CRL进行PEM格式的IO读写操作。

9.9 PKCS#7编码内容对象的PKCS7的IO函数

PKCS7 *PEM_read_bio_PKCS7(BIO *bp, PKCS7 **x, pem_password_cb *cb, void *u);

PKCS7 *PEM_read_PKCS7(FILE *fp, PKCS7 **x, pem_password_cb *cb, void *u);

int PEM_write_bio_PKCS7(BIO *bp, PKCS7 *x);

int PEM_write_PKCS7(FILE *fp, PKCS7 *x);

这些汉森对以PKCS7结构存储的PKCS#7内容信息进行PEM格式的IO读写操作。

9.10 Netscape证书序列对象NETSCAPE_CERT_SEQUENCE的IO函数

NETSCAPE_CERT_SEQUENCE *PEM_read_bio_NETSCAPE_CERT_SEQUENCE(BIO *bp,NETSCAPE_CERT_SEQUENCE **x,pem_password_cb *cb, void *u);

NETSCAPE_CERT_SEQUENCE *PEM_read_NETSCAPE_CERT_SEQUENCE(FILE

*fp,NETSCAPE_CERT_SEQUENCE **x,pem_password_cb *cb, void *u);

int PEM_write_bio_NETSCAPE_CERT_SEQUENCE(BIO *bp, NETSCAPE_CERT_SEQUENCE *x);

int PEM_write_NETSCAPE_CERT_SEQUENCE(FILE *fp, NETSCAPE_CERT_SEQUENCE *x);

这些函数对以NETSCAPE_CERT_SEQUENCE结构存储的Netscape证书序列进行PEM格式的IO读写操作。

10.回调函数例子

10.1获取口令回调函数的例子

在PEM读写的过程中,特别对于私钥文件,可能经常要使用到获取口令的回调函数,在签名我们介绍的一些列函数也可以看出,基本上都是带有回调函数的参数的。openssl缺省的回调函数是基于命令行的,在许多情况下可能并不适应,这就要求用户自己定义回调函数。在前面的相关章节,我们已经介绍了该回调函数的格式,现在我们给出一个回调函数的实现例子。

int pass_cb(char *buf, int size, int rwflag, void *u);

{

int len;

char *tmp;

/* rwflag是一个标准,如果为1,可能还需要作些别的处理工作*/

printf("输入口令:\"%s\"\n", u);

/* 这里应该是得到口令的代码*/

tmp = "hello";

len = strlen(tmp);

if (len <= 0) return 0;

/* 如果口令超出给定长度,就把多余的删掉*/

if (len > size) len = size;

memcpy(buf, tmp, len);

return len;

}

10.2使用PEM系列函数常犯的一个错误

PEM系列函数的格式和参数基本相同,下面是一个常犯的导致错误的用法。

X509 *x;

PEM_read_bio_X509(bp, &x, 0, NULL);

这样的用法会导致出现不可预测的错误,因为x并没有进行初始化,分配内存空间,而接下来调用的函数却会往x里面写入数据,导致内存非法操作。这也是openssl本身没有处理好的一个BUG.

Openssl生成证书步骤说明

Openssl生成证书步骤说明 命令操作: 1、生成普通私钥: 2、生成带加密口令的密钥: 在生成带加密口令的密钥时需要自己去输入密码。对于为密钥加密现在提供了一下几种算 通过生成的私钥去生成证书:

在生成证书的时候需要按照提示输入一些个人信息。 通过私钥生成公钥: 格式转换:(证书、私钥、公钥)(PEM <----->DER) 从DER格式转换成PEM格式一样,就是把inform的格式改成DERoutform的格式改成PEM 即可。 服务器和客户端认证的证书生成 下面是一个服务器和客户端认证的证书、私钥生成方法:(server.crt、client.crt、ca.crt) 用默认openssl配置文件生成证书,先创建文件夹 创建文件夹demoCA/newcerts: mkdir -p demoCA/newcerts 创建个空文件index.txt: touch demoCA/index.txt 向文件serial中写入01: echo 01 > demoCA/serial 1.首先要生成服务器端的私钥(key 文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加密key 文件(参数des3 便是指加密算法,当然也可以选用其他你认 为安全的算法.),以后每当需读取此文件(通过openssl 提供的命令或API)都需输入口令.如果觉得不方 便,也可以去除这个口令,但一定要采取其他的保护措施!

去除key 文件口令的命令: openssl rsa -in server.key -out server.key 2.openssl req -new -key server.key -out server.csr 生成Certificate Signing Request(CSR),生成的csr 文件交给CA 签名后形成服务端自己的证书. 屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可. 3.对客户端也作同样的命令生成key 及csr 文件: openssl genrsa -des3 -out client.key 1024 openssl req -new -key client.key -out client.csr 4.CSR 文件必须有CA 的签名才可形成证书.可将此文件发送到verisign 等地方由它验证,要交一大笔钱, 何不自己做CA 呢. openssl req -new -x509 -keyout ca.key -out ca.crt 5.用生成的CA 的证书为刚才生成的server.csr,client.csr 文件签名: openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key 现在我们所需的全部文件便生成了. 另: client 使用的文件有:ca.crt,client.crt,client.key server 使用的文件有:ca.crt,server.crt,server.key .crt 文件和.key 可以合到一个文件里面,本人把2 个文件合成了一个.pem 文件(直接拷贝过去就行了)

自签名OpenSSL证书流程

自签名OpenSSL证书流程 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施! 去除key文件口令的命令: openssl rsa -in server.key -out server.key [生成过程中提示需要输入私钥的密码,现设为111111] 2.openssl req -new -key server.key -out server.csr -config https://www.wendangku.net/doc/4b581707.html,f 生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可. [利用私钥生成CA的证书请求,在这个过程中,按步骤提示输入各种信息,注意前面国家、州等信息和以后生成客户端.csr文件等,需要填入的信息时,需要保持一致,否则验证会通不过] Country Name(只能填2个字母) : cn State or Province Name : sz Locality Name : ns Organization Name : vc Organization Unit Name : odc Common Name : rome Email Address : rome80@https://www.wendangku.net/doc/4b581707.html,(邮箱名可以不一样,可以区别不同的证书) 其中有一个A challenge password,不知道做什么用,填111111 An optional company name : milano -config https://www.wendangku.net/doc/4b581707.html,f是配置文件信息 在生成.csr和证书的.crt时,都要填入上述信息 3.对客户端也作同样的命令生成key及csr文件: openssl genrsa -des3 -out client.key 1024 openssl req -new -key client.key -out client.csr -config https://www.wendangku.net/doc/4b581707.html,f 4.openssl genrsa -des3 -out ca.key 1024 [这步是自己加上去的,先生成ca的私钥]

荣誉证书格式要求

荣誉证书格式要求

各类比赛是学校团学工作的重要组成部分,每次赛事结束后,给获奖者颁发证书是免不了的事。这时候,负责的学生干部都会拿着一沓的奖状到办公室去盖章。但是,我经常会见到各种形式、各种规格的证书,不只是证书的样式,连证书里面的文字、语言风格、落款等都很不统一。这样的证书让人感觉不正式、不严肃,不方便获奖者使用,甚至不可信。为了帮助学生干部规范荣誉证书的内容、格式,我把所知写下,供大家参考。 第一,名称 我们现在比较常见的一般是“荣誉证书”。我记得小时候,还有现在的一些小学生,他们拿的是“奖状”。看起来这两种名称并没有什么实质性的区别,但是还是有不一样的地方。荣誉证书更侧重于颁发给个人,由个人收藏,证书纸张的尺寸较小;而奖状则一般是颁发给集体,且奖状的尺寸要比证书大得多。我们校园文化活动中所用的一般都是荣誉证书,便于学生个人的收藏和使用。还有一些人只有“证书”两字,这是不对的,因为还有毕业、结业等证书。 第二,纸质 纸质其实很简单,只要能够长久保存就好了,这是唯一的讲究,而不是要求加厚多少,这样既浪费钱又不容易折叠。有些证书的纸面做得很精致,一些还水印了很多花纹上去,显得很花俏。但是,我觉得花样的有无倒没什么关系,但是要考虑到价格和使用的问题。证书的最大用途永远是证明,要起到证明的作用,

就要方便获奖者的复印,水印花纹一般不会被复印出来,所以没什么用途;而对于一些装饰在表面的很明显的花纹,却往往会使复印效果大大降低。我认为纸面保持清楚就足够了,如果要美观的话,背景颜色可以染成粉色或者淡黄色,而边框稍加修饰即可。这样既显得大方、正式。至于价格,一张控制在一元多也就可以了,没有必要在这方面花无用的财力。 第三,大小 前面有说到,证书的尺寸比较小,一般A4、B5规格的纸张就足够了。在证书大小上,通常情况下是没有其他讲究的,但是赛事的级别各有不同,所以,我个人觉得证书的大小还应该根据级别的高低来选择。如果是团委等校级职能部门、学院党政等颁发的证书,一般可以用A4的尺寸,而校级学生组织、年级等举办的一些比赛的证书则只要B5就够了。纸张的大小算是赛事级别的一个体现,不可忽视。 第四,行文 证书的内容是整份证书的主体部分,是证书的精神所在。文字、格式、语言风格都很有讲究,很有必要进行统一。现在证书的正文一般都用打印,打印的字体以采用楷体、宋体为宜,显得庄重。字体大小视纸张大小而定,尽量使正文保持两三行的内容。在获奖人的姓名及其所获得的名次上,建议使用手写体,但一定要注意手写字的美观,不能潦潦草草,尽量要写得刚劲有力,这一来是对获奖者尊重,二来也能体现出一个组织的水平。

Linux下利用openssl 生成SSL证书步骤

Linux下利用openssl 生成SSL证书步骤 1、概念 首先要有一个CA根证书,然后用CA根证书来签发用户证书。 用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。 2、后缀详解 .key格式:私有的密钥 .csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request 的缩写 .crt格式:证书文件,certificate的缩写 .crl格式:证书吊销列表,Certificate Revocation List的缩写 .pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式 3、添加 index.txt 和 serial 文件 cd /etc/pki/CA/ touch /etc/pki/CA/index.txt touch /etc/pki/CA/serial echo 01 > /etc/pki/CA/serial 4、CA根证书的生成 4.1 生成CA私钥(.key) openssl genrsa -out ca.key 2048 [root@CA]# openssl genrsa -out ca.key 2048 Generating RSA private key, 2048 bit long modulus .............+++ .....+++ e is 65537 (0x10001) 4.2 生成CA证书请求(.csr) openssl req -new -key ca.key -out ca.csr [root@CA]# openssl req -new -key ca.key -out ca.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value,

荣誉证书格式要求

各类比赛是学校团学工作的重要组成部分,每次赛事结束后,给获奖者颁发证书是免不了的事。这时候,负责的学生干部都会拿着一沓的奖状到办公室去盖章。但是,我经常会见到各种形式、各种规格的证书,不只是证书的样式,连证书里面的文字、语言风格、落款等都很不统一。这样的证书让人感觉不正式、不严肃,不方便获奖者使用,甚至不可信。为了帮助学生干部规范荣誉证书的内容、格式,我把所知写下,供大家参考。 第一,名称 我们现在比较常见的一般是“荣誉证书”。我记得小时候,还有现在的一些小学生,他们拿的是“奖状”。看起来这两种名称并没有什么实质性的区别,但是还是有不一样的地方。荣誉证

书更侧重于颁发给个人,由个人收藏,证书纸张的尺寸较小;而奖状则一般是颁发给集体,且奖状的尺寸要比证书大得多。我们校园文化活动中所用的一般都是荣誉证书,便于学生个人的收藏和使用。还有一些人只有“证书”两字,这是不对的,因为还有毕业、结业等证书。 第二,纸质 纸质其实很简单,只要能够长久保存就好了,这是唯一的讲究,而不是要求加厚多少,这样既浪费钱又不容易折叠。有些证书的纸面做得很精致,一些还水印了很多花纹上去,显得很花俏。但是,我觉得花样的有无倒没什么关系,但是要考虑到价格和使用的问题。证书的最大用途永远是证明,要起到证明的作用,就要方便获奖者的复印,水印花纹一般不会被复印出来,所以没

什么用途;而对于一些装饰在表面的很明显的花纹,却往往会使复印效果大大降低。我认为纸面保持清楚就足够了,如果要美观的话,背景颜色可以染成粉色或者淡黄色,而边框稍加修饰即可。这样既显得大方、正式。至于价格,一张控制在一元多也就可以了,没有必要在这方面花无用的财力。 第三,大小 前面有说到,证书的尺寸比较小,一般A4、B5规格的纸张就足够了。在证书大小上,通常情况下是没有其他讲究的,但是赛事的级别各有不同,所以,我个人觉得证书的大小还应该根据级别的高低来选择。如果是团委等校级职能部门、学院党政等颁发的证书,一般可以用A4的尺寸,而校级学生组织、年级等举办的一些比赛

使用OpenSSL建立根CA及自签名证书制作过程

使用OpenSSL建立根CA及自签名证书制作过程 2009-12-24 11:35:32| 分类:openssl |字号订阅 Openssl版本:0.9.8 版本,可从https://www.wendangku.net/doc/4b581707.html,处下载。 1.先建立如下目录结构: $home/testca # testca 是待建CA的主目录 ├─newcerts/ # newcerts子目录将存放CA签发过的数组证书(备份目录) ├─private/ # private目录用来存放CA私钥 └─conf/ # conf目录用来存放简化openssl命令行参数用的配置文件 此外使用命令 echo "01" > serial touch index.txt 在ca根目录下创建文件serial (用来存放下一个证书的序列号) 和indext.txt (证书信息数据库文件)。 1.生成CA的私钥和自签名证书 (根证书) 创建配置文件:vi "$HOME/testca/conf/gentestca.conf" 文件内容如下: #################################### [ req ] default_keyfile = /home/cx/testCA/private/cakey.pem default_md = md5 prompt = no

distinguished_name = ca_distinguished_name x509_extensions = ca_extensions [ ca_distinguished_name ] organizationName = ss organizationalUnitName = sstc commonName = sstcCA emailAddress = GChen2@https://www.wendangku.net/doc/4b581707.html, #自己的邮件地址 [ ca_extensions ] basicConstraints = CA:true ######################################## 然后执行命令如下: cd "$HOME/testca" openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config "$HOME/testca/conf/gentestca.conf" 执行过程中需要输入CA私钥的保护密码,假设我们输入密码: 888888 可以用如下命令查看一下CA自己证书的内容 openssl x509 -in cacert.pem -text –noout 创建一个配置文件,以便后续CA日常操作中使用 vi "$HOME/testca/conf/testca.conf"

OpenSSL证书制作过程

比亚迪培训讲义 在J2EE中使用数字证书 深圳市金蝶中间件有限公司 2007年12月

Table of Contents 1 数字证书使用的场合 (3) 2 数字证书的颁发 (3) 2.1 概述 (3) 2.2 创建自签名CA (3) 2.2.1 生成ca私钥 (3) 2.2.2 生成ca待签名证书 (4) 2.2.3用CA私钥进行自签名,得到自签名的CA根证书 (4) 2.2.4 https://www.wendangku.net/doc/4b581707.html,f配置文档 (5) 2.3 颁发服务器证书 (7) 2.3.1 生成服务器私钥对及自签名证书 (7) 2.3.2 生成服务器待签名证书 (7) 2.3.3 请求CA签名服务器待签名证书,得到经CA签名的服务器证书 (8) 2.3.4把CA根证书导入密钥库 mykeystore (8) 2.3.5把经过CA签名的服务器证书导入密钥库mykeystore (8) 2.4 颁发客户端证书 (9) 2.4.1 生成客户端私钥 (9) 2.4.2生成客户端待签名证书 (9) 2.4.3请求CA签名客户端待签名证书,得到经CA签名的客户端证书 (10) 生成客户端的个人证书client.p12 (10) 2.5 CA根证书导入客户端 (11) 2.6个人证书导入客户端 (11) 3 在J2EE中使用证书 (11) 3.1 配置SSL双向认证 (11) 3.1.1 服务器端密钥库和信任库 (12) 3.1.2修改Muxer服务 (12) 3.1.3修改SecurityService服务 (13) 3.2 在程序中获取证书信息 (13) 4 练习 (13) 5 附录 (14) 5.1 SSL v3的处理步骤 (14) 5.2 命令行调试SSL证书 (14)

利用openSSL实现SSl双向认证学习笔记

SSl双向认证学习笔记 2010-09-02 13:16:39| 分类:ssl | 标签:|字号大中小订阅 url]https://www.wendangku.net/doc/4b581707.html,/sunyujia/archive/2008/10/03/3014667.aspx[/url] [url]https://www.wendangku.net/doc/4b581707.html,/nataka/archive/2005/09/03/470539.aspx[/url] [url]https://www.wendangku.net/doc/4b581707.html,/thread-743287-1-1.html[/url] 第一节基础知识 最近要做一个SSL的应用,先后了解了两个命令,一个是keytool,一个是openssl。keytool是JDK得集成环境 。只要安装了JDK,基本上都会有(^_^,除非你安装太老的!),我用的1.5。在安装openssl的时候,花了半天时间 。 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这 是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器不验证客户 机的证书。而连接网上银行时使用的U盾就是用来存储进行双向验证所需要的客户端证书的)。 JDK工具KEYTOOL -genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥 、私钥和证书 -alias 产生别名 -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中 -keyalg 指定密钥的算法 -validity 指定创建的证书有效期多少天 -keysize 指定密钥长度 -storepass 指定密钥库的密码 -keypass 指定别名条目的密码 -dname 指定证书拥有者信息例如:"CN=firstName,OU=org,O=bj,L=bj,ST=gd,C=cn" -list 显示密钥库中的证书信息keytool -list -v -keystore 别名-storepass .... -v 显示密钥库中的证书详细信息 -export 将别名指定的证书导出到文件keytool -export -alias 别名-file 文件名.crt -file 参数指定导出到文件的文件名 -delete 删除密钥库中某条目keytool -delete -alias 别名-keystore sage -keypasswd 修改密钥库中指定条目口令keytool -keypasswd -alias 别名-keypass .... -new .... -storepass ... -keystore 别名 -import 将已签名数字证书导入密钥库keytool -import -alias 别名-keystore 证书名-file 文件名 (可以加.crt 后缀) 命令: 生成证书 keytool -genkey -keystore 文件名(可包含路径) -keyalg rsa -alias 别名-validity 有效期 查看证书 keytool -list -v -keystore 路径 把证书导出到文件 keytool -export -alias 别名-keystore 证书名-rfc -file 文件名(可包含路径) 修改密码 keytool -keypasswd -alias 别名-keypass 旧密码-new 新密码 导出证书到新的TrustStore keytool -import -alias 别名-file 文件名-keystore truststore 此处省略3000字,待补^_^

OpenSSL 命令常用证书操作

在OpenSSL开发包中,包含一个实用工具:openssl,比如我用MinGW GCC 编译OpenSSL 0.9.8k 后,openssl 就保存在out目录下。openssl 工具是完成密钥、证书操作和其它SSL 事务的入口环境,直接运行不带参数的openssl 命令后,可以得到一个shell 环境,在其中可以以交互的方式完成SSL 相关的安全事务。 不过有时,如果用一个带参数选项的openssl 命令完成操作,会更方便。下面是我使用openssl 做证书操作时,记录的常用命令用法。 1.生成密钥 生成RSA密钥,保存在file.key中,命令如下: 上面命令的含义是:产生RSA密钥,包括:私钥和公钥两部分,然后使用DES3算法,用用户输入的密码(passphrase)加密该密钥数据,保存在file.key中。 file.key默认以BASE64方式编码密钥数据,file.key的格式称为:PEM (Privacy Enhanced Mail)格式,在RFC 1421到RFC 1424中定义,PEM是早期用来进行安全电子邮件传输的标准,但现在广泛用在证书、证书请求、PKCS#7对象的存储上,所以证书文件也经常以.pem为扩展名。 2.不加密的密钥 如果在生成密钥时,使用了-des3等加密选项,则会生成被用户密码保护的加密密钥,以增强密钥数据的保密性(因为密钥文件中包含私钥部分)。但有时为了方便,需要不加密的明文密钥(这样安全性会降低),比如:使用

Apache的HTTPS服务,每次启动Apache服务时,都需要用户输入保护密钥的密码,感觉麻烦的话,可以使用明文密钥。 明文密钥可以使用不带-des3等加密选项的openssl命令生成,还可以使用以下命令将加密保护的密钥转换成明文密钥,当然转换过程需要用户输入原来的加密保护密码: 3.查看密钥 查看保存在file.key中的RSA密钥的细节,如果此文件是加密保护的,会提示用户输入加密此文件的密码,命令如下: 输出的内容均是RSA密钥数据的数学信息(模数、指数、质数等),从输出的结果中也可知file.key保存的RSA密钥数据包括:私钥和公钥两部分。 该命令也能查看其它工具生成的密钥,比如SSH,只要密钥文件符合openssl支持的格式。 4.生成证书请求 由file.key产生一个证书请求(Certificate Request),保证在file.csr 中,命令如下: 指定时,默认会访问Unix格式的默认路径:/usr/local/ssl/https://www.wendangku.net/doc/4b581707.html,f。 创建证书请求时,会要求用户输入一些身份信息,示例如下:

OpenSSL来制作证书,在IIS中配置HTTPS(SSL)笔记

info@https://www.wendangku.net/doc/4b581707.html, 使用OpenSSL来制作证书,在IIS中配置HTTPS(SSL)笔记 下载Win32编译的openssl版本0.9.8e. 1.获取IIS证书请求:打开IIS,右键单击【默认网站】,在【目录安全性】选项卡中点击【服务器证书】按钮,【下一步】,【新建证书】,【现在准备证书请求--下一步】,输入【名称】,输入【单位】和【部门】,输入【公用名称】,选择【国家】并输入【省】和【市县】并【下一步】,【下一步】,【下一步】,【完成】,IIS的证书请求已经获取,就是C:\certreq.txt。这里请牢记输入的信息。 2.准备openssl工作环境:把openssl(编译后的版本)解压到D:\OpenSSL-0.9.8e\下, 在bin目录下建立目录demoCA,在demoCA下建立private和newcerts目录, 并新建index.txt,内容为空 如果没有serial文件,则到openssl网站上下载openssl的源文件,解压后,到apps\demoCA下,拷贝serial文件过来,两个目录两个文件都放到新建的 demoCA下。 3.生成自签名根证书: openssl req -x509 -newkey rsa:1024 -keyout ca.key -out ca.cer -days 3650 -config D:\OpenSSL-0.9.8e\https://www.wendangku.net/doc/4b581707.html,f PEM pass phrase: password // 根证书私钥密码 Verifying - Enter PEM pass phrase: password Country Name: CN // 两个字母的国家代号 State or Province Name: HB // 省份名称 Locality Name: WUHAN // 城市名称 Organization Name: Skyworth TTG // 公司名称 Organizational Unit Name: Service // 部门名称 Common Name: https://www.wendangku.net/doc/4b581707.html, // 你的姓名(要是生成服务器端的证书一定要输入域名或者ip地址) Email Address: admin@https://www.wendangku.net/doc/4b581707.html, // Email地址

linux下利用openssl来实现证书的颁发(详细步骤)

linux下利用openssl来实现证书的颁发(详细步骤) 1、首先需要安装openssl,一个开源的实现加解密和证书的专业系统。在centos下可以利用yum安装。 2、openssl的配置文件是https://www.wendangku.net/doc/4b581707.html,f,我们一般就是用默认配置就可以。如果证书有特殊要求的话,可以修改配置适应需求。这样必须把相关的文件放到配置文件指定的目录下面。 3、首先需要利用openssl生成根证书,以后的服务器端证书或者客户端证书都用他来签发,可以建立多个根证书,就像对应不同的公司一样 #生成根证书的私钥 openssl genrsa -out /home/lengshan/ca.key #利用私钥生成一个根证书的申请,一般证书的申请格式都是csr。所以私钥和csr一般需要保存好openssl req -new -key /home/lengshan/ca.key -out /home/lengshan/ca.csr #自签名的方式签发我们之前的申请的证书,生成的证书为ca.crt openssl x509 -req -days 3650 -in /home/lengshan/ca.csr -signkey /home/lengshan/ca.key -out /home/lengshan/ca.crt #为我们的证书建立第一个序列号,一般都是用4个字符,这个不影响之后的证书颁发等操作 echo FACE > /home/lengshan/serial #建立ca的证书库,不影响后面的操作,默认配置文件里也有存储的地方 touch /home/lengshan/index.txt #建立证书回收列表保存失效的证书

奖状范文模板格式

奖状范文模板格式 奖状,是用于表彰和奖励先进单位或个人而颁发的镜匾或证书时使用的一种固定模式的文体。 用于表彰和奖励的锦旗也属此列。 在社会主义现代化建设中,一批批先进典型不断涌现,要大力弘扬其先进事迹,激励他们再创佳绩,同时激发其他单位或个人以他们为榜样,勤奋学习,努力工作,颁发奖状是一种有效手段。 奖状一般分为两类,一种是在学习或工作中,通过评比,排出了具体的名次,在奖励时,取前几名,奖状上直书第儿名;另一种是评比后,根据不同层次,分出优秀、先进等档次,每个档次可有几个,甚至更多。 一张奖状一般应该包括以下几个方面的内容:获奖人姓名(或获奖单位名称)、获奖时间、获得何种奖项(或种获得何种荣誉称号)、颁奖单位名称、颁奖单位公章、颁奖时间等。 人名或单位:在什么活动或比赛中获得了第几名或被授予了什么称号或者直接写做了什么贡献。特发此证,以资鼓励或感谢或奖励!下一行写发证单位和日期奖状的格式较为固定,分为标题、内容、结尾三个部分。 标题。一般为“奖状”、“奖励证书”等字样。锦旗则没有标题,直接写“奖给xx单位或个人”。 内容。首先要注明受奖单位名称或个人姓名。其次,第二行写明为什么受到奖励、奖励的程度、受到怎样的奖励。 结尾。包括颁奖单位名称、时间,颁奖单位公章要盖在单位名称上。颁发锦旗则不用盖章。若是同时几个单位共同颁奖,则按这几个单位大小顺序上下或前后排好。 范例:

优秀学生:在00x年下学期因品学兼优,全面发展,表现出色,被评为x中学优秀学生,特发此证,以资鼓励。 优秀特长生:在00x年下学期因在(文艺表演/体育竞赛)活动中的精彩表现,被评为x中学优秀特长生,特发此证,以资鼓励。 优秀党校学员:在00x年下学期因在学生党校活动中表现出色,被评为x中学优秀党校学员,特发此证,以资鼓励。 优秀青年志愿者:在00x年下学期因在服务学校、服务班级的公益活动中,表现出色,被评为x中学优秀青年志愿者,特发此证,以资鼓励。 学习标兵:在00x年下学期因勤奋好学,成绩优秀(或成绩进步显著),被评为x中学学习标兵,特发此证,以资鼓励。 品行标兵:在00x年下学期因优秀的品行表现成为同学的楷模,被评为x中学品行标兵,特发此证,以资鼓励。 工作标兵:在00x年下学期因工作勤勉,能力优秀,成效显著,被评为x中学工作标兵,特发此证,以资鼓励。 体艺标兵:在00x年下学期因积极参加文体活动,成效显著,被评为x中学体艺标兵,特发此证,以资鼓励。 奖状 ×××: 在1999年度精神文明工作中,成绩显著,被评为精神文明先进个人。 特颁此证 中共××乡党委 ×××人民政府(章) ×××年××月×日

用OpenSSL命令行生成证书文件

用OpenSSL命令行生成证书文件证书文件生成 也许很多人和本人一样深有体会,使用OpenSSL库写一个加密通讯过程,代码很容易就写出来了,可是整个工作却花了了好几天。除将程序编译成功外(没有可以使用的证书文件,编译成功了,它并不能跑起来,并不表示它能正常使用,所以......),还需生成必要的证书和私钥文件使双方能够成功验证对方。 找了n多的资料,很多是说的很模糊,看了n多的英文资料,还是没有办法(不知道是不是外国朋友都比较厉害,不用说明得太清?),无意间找到yawl(yawl@https://www.wendangku.net/doc/4b581707.html,)写的文章,难得的汉字(呵呵)。里面有生成证书部分,说到生成了Certificate Signing Request (CSR)文件后,就有点不太清楚了。后面生成自签字证书在很多地方都可以找到的,签名这部分,yawl说mod_ssl有比较好的脚本,但是笔者一时找不到,就自己用openssl的ca命令来完成了,也不是很麻烦。 说说本人的操作环境:无盘工作站(有权限问题使用起来不太方便),操作目录是openssl/bin(没办法改不了环境变量,如果你可以改的话,就不用在这个目录下工作了),为了方便本人把apps下的https://www.wendangku.net/doc/4b581707.html,f 也复制到了这个目录下来。文件名都是以本人使用的来说了: 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施! 去除key文件口令的命令: openssl rsa -in server.key -out server.key 2.生成Certificate Signing Request(CSR) openssl req -new -key server.key -out server.csr -config https://www.wendangku.net/doc/4b581707.html,f 生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可. 3.对客户端也作同样的命令生成key及csr文件: openssl genrsa -des3 -out client.key 1024 openssl req -new -key client.key -out client.csr -config https://www.wendangku.net/doc/4b581707.html,f 4.CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢. openssl req -new -x509 -keyout ca.key -out ca.crt -config https://www.wendangku.net/doc/4b581707.html,f

openssl,CA证书生成命令集合

多级证书 平时我们自己签发CA证书再签发服务器证书的场景其实都非常简单。浏览器把自签CA导入后,就可以信任由这个CA直接签发的服务器证书。 但是实际上网站使用的证书肯定都不是由根CA直接签发的,比如 淘宝登陆服务器使用的证书。 我之前是自己写了脚本由自签CA直接签发服务器证书,为了真清楚的理解一下证书链的作用就直接使用openssl先签发2层的子CA,再由子CA去签发服务器证书。 手动签发证书的脚本如下: 生成自签CA # cat makerootca.sh #!/bin/bash DIR=/root/ssl.test2 mkdir -p $DIR/demoCA/{private,newcerts} touch $DIR/demoCA/index.txt echo 01 > $DIR/demoCA/serial opensslgenrsa -des3 -out $DIR/demoCA/private/cakey.pem 2048

opensslreq -new -x509 -days 3650 -key $DIR/demoCA/private/cakey.pem -out $DIR/demoCA/careq.pem 签发二级CA的脚本 https://www.wendangku.net/doc/4b581707.html,f/root/ssl.test2 # cat no2domain.sh #!/bin/bash [ $# -ne 1 ] && echo "$0 NAME" && exit NAME=$1 DIR=/root/ssl.test2/autoget mkdir -p $DIR opensslgenrsa -des3 -out $DIR/$NAME.key 2048 openssl x509 -in $DIR/../demoCA/careq.pem -noout -text opensslrsa -in $DIR/$NAME.key -out $DIR/$NAME.key opensslreq -new -days 3650 -key $DIR/$NAME.key -out $DIR/$NAME.csr opensslca -extensions v3_ca -in $DIR/$NAME.csr -config $DIR/../https://www.wendangku.net/doc/4b581707.html,f -days 3000 -out $DIR/$NAME.crt -cert $DIR/../demoCA/careq.pem -keyfile $DIR/../demoCA/private/cakey.pem 签发三级CA的脚本 # cat no3domain.sh #!/bin/bash #[ $# -ne 1 ] && echo "$0 NAME" && exit NAME=calv3 DIR=/root/ssl.test2/autoget opensslgenrsa -des3 -out $DIR/$NAME.key 2048

Linux下用Openssl生成证书

用openssl签发ssl x.509证书 Linux及Openssl版本: 首先在/home目录下建立ssl目录: cd /home mkdir ssl cd ssl 建立几个要用到的目录: mkdir private certs newcerts crl 其中private主要用来存放私钥的. certs用于存入签出的证书 cp /usr/share/ssl/https://www.wendangku.net/doc/4b581707.html,f . 将配置文件复制到当前目录 构建相关文件: echo 构建索引文件index.txt echo 0>index.txt echo 构建序列号文件serial echo 01>serial 设定环境变量 export OPENSSL_CONF="/home/ssl/https://www.wendangku.net/doc/4b581707.html,f" 更改https://www.wendangku.net/doc/4b581707.html,f中的配置:

dir = /home/ssl 产生一个随机数文件: openssl rand -out /home/ssl/private/.rand 1000下面才开始建立根证书: 1.制作私钥: openssl genrsa -des3 -out private/ca.key.pem 2048 这来细细讲一下这条命令:openssl指进入openssl环境,genrsa 是openssl中的一个小应用程序,用来产生rsa私钥。-des3是指将产生的私钥用triple DES进行加密。这是个可选项,还有-des -idea都是对称加密算法,随你自己选择. -out就是指定输出了,如果不加这个选项的话,就会将输出发到标准输出中.2048指私钥的长度,单们是bit,默认是512 输入这条命令后,产生私钥,提示你设定密码. 2.填写证书申请表: openssl req -new -key private/ca.key.pem -out ca.req.pem 提示你私钥的密码,一步一步输入就行了。 因为证书中要有公钥,和个人信息,所以我们指定私钥,程序推导出公钥,供申请表用。 3.自己签定根签书: openssl x509 -req -days 1000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in ca.req.pem -out certs/ca.crt.pem

嵌入式设备CA证书的生成步骤

1、环境准备 1.1 向设备添加动态库文件(用于支持openssl生成证书请求文件): libssl.so.6、libgssapi_krb5.so.2、libkrb5.so.3、libcom_err.so.2、 libk5crypto.so.3、libresolv.so.2、libkrb5support.so.0、 1.2 创建所需结点: mknod /dev/random c 1 8 mknod /dev/urandom c 1 9 1.3 放置生成证书的工具: 在设备上根目录新建文件夹/path/to : mkdir -p /path/to 将openssl-bin.tar.bz2 解压到设备/path/to目录下,并给/path/to/openssl/bin目录下的文件赋予可执行权限。 2、制作需CA(Certificate Authority)签署证书 2.1、生成私钥 进入/path/to/openssl/bin目录下,执行 方式一:./openssl genrsa -des3 1024 >server.key 注:采用DES3加密新产生的私钥server.key文件,每次要使用这个私钥时都要用输入密码。如果您的电子证书是用在apache等服务器中,您每次启动服务器时都要输入密码一次。 方式二:./openssl genrsa 1024 >server.key 注:采用128位rsa算法生成密钥server.key文件,这种方法产生的证书在apache 等服务器中启动服务器时不会要求输入密码,同时也不会把私钥加密。 我们采用方式二生成私钥。 2.2 生成证书请求文件(Certificate Signing Request) ./openssl req -new -key server.key > server.csr 注:这是用步骤1的密钥生成证书请求文件server.csr, 这一步输入内容和创建自签名证书的内容类似,按要求输入就可以了。 2.3 签署生成CA证书 您只要把server.csr这个档案给第三方CA(Certificate Authority)机构签署生成证书就可以了。 2.4 自己做CA证书,生成证书ca.crt和私钥ca.key 2.4.1 在当前目录下创建如下文件和文件夹: 生成证书时,不仅需要ca.key和ca.crt,还需要读配置文件/path/to/openssl/ssl/openssl.conf,所以必须要按照/usr/share/ssl/https://www.wendangku.net/doc/4b581707.html,f罩的设置,建 立起各层目录 mkdir demoCA mkdir demoCA/newcerts mkdir demoCA/private cat /dev/null >demoCA/index.txt (确保创建的

Linux下OpenSSL客户端中使用req命令来生成证书的教程

Linux下OpenSSL客户端中使用req命令来生成证书的教程作者:Gordon0918 字体:[增加减小] 来源:开源中文社区时间:04-22 11:56:58?我要评论这篇文章主要介绍了Linux下OpenSSL客户端中使用req命令来生成证书的教程,详细讲解了自动生成密钥和生成自签名证书的方法,需要的朋友可以参考下 openssl req 用于生成证书请求,以让第三方权威机构CA来签发,生成我们需要的证书。req 命令也可以调用x509命令,以进行格式转换及显示证书文件中的text,modulus等信息。如果你还没有密钥对,req命令可以一统帮你生成密钥对和证书请求,也可以指定是否对私钥文件进行加密。 1、密钥、证书请求、证书概要说明 在证书申请签发过程中,客户端涉及到密钥、证书请求、证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水。我们以申请证书的流程说明三者的关系。客户端(相对于CA)在申请证书的时候,大体上有三个步骤: 第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。 第二步:以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。 第三步:CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。 至此客户端申请证书流程结束,其中涉及到证书签发机构CA,CA是被绝对信任的机构。如果把客户端证书比作用户身份证,那么CA就是颁发身份证的机构,我们以https为例说明证书的用处。 为了数据传输安全,越来越多的网站启用https。在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在PC或者手机上,内置了世界上著名的CA机构的证书)查找对应CA证书,然后使用内置的证书公钥校验服

相关文档