首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

OpenSSL 解析P12格式证件文件

2012-07-04 
OpenSSL 解析P12格式证书文件1 解压openssl-0.9.8k_WIN32.zip 到 c:\根目录;解压文件夹如下; 2 打开控制台

OpenSSL 解析P12格式证书文件
1 解压openssl-0.9.8k_WIN32.zip 到 c:\根目录;解压文件夹如下;

2 打开控制台,并切换到OpenSSL可执行文件所在目录;

3 利用OpenSSL创建.p12测试文件(也就是证书制作过程);详细创建步骤如下;
  3.1 生成ca私钥
  a) openssl dsaparam -out dsaparam 1024
  b) openssl gendsa -out dsakey dsaparam

  3.2 生成ca待签名证书
  openssl req -new -out ca-req.csr -key dsakey -config ..\openssl.cnf


  3.3用CA私钥进行自签名,得到自签名的CA根证书
  openssl x509 -req -in ca-req.csr -out ca-cert.cer -signkey dsakey -days 365

  3.4至此,自签名CA根证书制作完毕。当前目录下将产生四个文件,分别是:
    ca-cert.cer  
     ca-req.csr
     dsakey
     dsaparam

  3.5 利用OpenSSL把.cer转换为.p12格式;
openssl pkcs12 -export -clcerts -in ca-cert.cer -inkey dsakey -out ca.p12


  3.6 检查并确认.p12文件;

 
4 添加OpenSLL头文件和lib库文件;
VS2008->Tools->Options->Projects and Solutions->VC++ Directories


5创建一个”Win32 Console Application”空的工程,命名为”OpenSSLTester”, 然后添加main.cpp,把如下测试代码添加进去;并且把libeay32.dll,ssleay32.dll和ca.p12添加到此工程文件夹下;



  这样.p12格式的信息就全部被解析出来了。

change:
  添加输出Key详细信息功能
void RSA_Printer(const RSA* rsa){    int i = 0, line = 0;    //modulus    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->n->dmax-1; i>=0; i--, line++)    {        if(i == rsa->n->dmax-1)        {            printf("n (modulus):\n");        }        printf("%.8X ",(unsigned long)*(rsa->n->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //publicExponent    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->e->dmax-1; i>=0; i--,line++)    {        if(i==rsa->e->dmax-1)        {            printf("e (publicExponent):\n");        }        printf("%.4X ",(unsigned long)*(rsa->e->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //privateExponent    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->d->dmax-1; i>=0; i--,line++)    {        if(i==rsa->d->dmax-1)        {            printf("d (privateExponent):\n");        }        printf("%.8X ",(unsigned long)*(rsa->d->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //prime1    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->p->dmax-1; i>=0; i--,line++)    {        if(i==rsa->p->dmax-1)        {            printf("p (prime1):\n");        }        printf("%.8X ",(unsigned long)*(rsa->p->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //prime2    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->q->dmax-1; i>=0; i--,line++)    {        if(i==rsa->q->dmax-1)        {            printf("q (prime2):\n");        }        printf("%.8X ",(unsigned long)*(rsa->q->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //exponent1    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->dmp1->dmax-1; i>=0; i--,line++)    {        if(i==rsa->dmp1->dmax-1)        {            printf("dmp1 (exponent1):\n");        }        printf("%.8X ",(unsigned long)*(rsa->dmp1->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //exponent2    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->dmq1->dmax-1; i>=0; i--,line++)    {        if(i==rsa->dmq1->dmax-1)        {            printf("dmq1 (exponent2):\n");        }        printf("%.8X ",(unsigned long)*(rsa->dmq1->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");    //coefficient    //////////////////////////////////////////////////////////////////////////    line = 1;    for(i=rsa->iqmp->dmax-1; i>=0; i--,line++)    {        if(i==rsa->iqmp->dmax-1)        {            printf("iqmp (coefficient):\n");        }        printf("%.8X ",(unsigned long)*(rsa->iqmp->d+i));        if ( (line!=0)            && (line%8==0) )        {            printf("\n");        }    }    printf("\n\n");}int main(){...     //P12    p12 = d2i_PKCS12_bio(bio, NULL); //得到p12结构    PKCS12_parse(p12, pass, &pkey, &usrCert, &ca); //得到x509结构    RSA *rsa;    int ret = 0;    rsa = pkey->pkey.rsa;    //Case 1    //////////////////////////////////////////////////////////////////////////    RSA_Printer(rsa);//自己写的RSA解析函数    //Case 2    //////////////////////////////////////////////////////////////////////////    BIO* bioOpt;    bioOpt = BIO_new_file("0000_MA2_20120207_0001_Private.key","w");//RSA key写到文件中    RSA_print(bioOpt, rsa, 0);    BIO_free(bioOpt);...}

参考:
1 OpenSSL证书制作过程.pdf

热点排行