北京电子科技学院

《信息安全工程技术应用》课程设计报告

                                                                                 基于OpenSSL的证书格式转换工具设计与实现                                                                                                                                                                                                                                                                     

 

 

 

 

 

 

 

小组成员姓名:20175119郑楚琪

  

指导教师:娄家鹏

  

提交时间:202054  

 

 

 

 

一、    个人分工:

1、 学习证书格式区别,证书格式转换方式,opensll命令行。

2、 学会使用openssl生成数字证书的方式。编程完成后每个人都需要掌握了解代码。

3、 负责码云项目管理,负责收集证书格式及转换方面的资料。

二、    学习成果:

1、常见数字证书格式:

1)、 pem:Privacy Enhanced Mail,一般为文本格式,以-----BEGIN...开头,以-----END...结尾。中间的内容是 BASE64 编码。这种格式可以保存证书和私钥,有时我们也把PEM 格式的私钥的后缀改为.key以区别证书与私钥。

BEGIN CERTIFICATE指证书,BEGIN RSA PRIVATE KEY为私钥。

2)、der:用二进制der编码方法储存的证书,二进制格式,只有证书信息,没有私钥。

3)、crt:有可能用der,也有可能用pem编码

4)、jks:Java Key Storage,JAVA的专属格式,利用keytool可以进行格式转换。一般用于 Tomcat 服务器。

5)、PFX 或 P12公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件。转换时需要输入PFX文件的加密密码。

2、代码:

#include <cstdio>
#include <iostream>
#include <openssl/pem.h>
#include <openssl/x509.h>
bool MakePemSSL(const char* cerFilePath, const char* savePemFilePath) {
    int      ret = 0;
    X509 *x509 = NULL;
    FILE    *cerFile = NULL, *pemFile = NULL;
    cerFile = fopen(cerFilePath, "rb");
    if (cerFile == NULL) {
        fprintf(stderr, "MakeLocalPemSSL fopen cerFilePath err \n");
        goto free_all;
    }
 
    pemFile = fopen(savePemFilePath, "w+");
    if (pemFile == NULL) {
        fprintf(stderr, "MakeLocalPemSSL fopen savePemFilePath err \n");
        goto free_all;
    }
 
    x509 = d2i_X509_fp(cerFile, NULL);
    if (x509 == NULL) {
        fprintf(stderr, "MakeLocalPemSSL failed to parse to X509 from cerFile \n");
        goto free_all;
    }
 
   PEM_write_X509(pemFile, x509);
    ret =  PEM_write_X509(pemFile, x509);
    if (ret != 1) {
        fprintf(stderr, "MakeLocalPemSSL failed to PEM_write_X509 \n");
        goto free_all;
    }
 
free_all:
    if (cerFile) fclose(cerFile);
    if (pemFile) fclose(pemFile);
 
    return (ret == 1);
}
int main(){
     FILE    *cerFile = NULL, *pemFile = NULL;
char cerNAME[100],pemNAME[100];
printf("请输入要转换的证书路径\n");
scanf("%s",cerNAME);
printf("请输入要保存的文件路径\n");
 scanf("%s",pemNAME);
 MakePemSSL(cerNAME, pemNAME);
}

3、openssl查看证书命令:

der:openssl x509 -in certificate.der -inform der -text -noout

pem:openssl x509 -in certificate.pem -text -noout

pfx:openssl pkcs12 -in for-iis.pfx

 

4、openssl转化格式命令:

  1. der转化为pem
  • openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
  1. pem转化为der
  • openssl x509 -in cert.pem -outform der -out cert.der
  1. pfx转化为pem
  • openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

 

5、openssl生成证书:

生成rsa私钥:openssl genrsa -out rsa_private.key 2048

生成rsa公钥:openssl rsa -in rsa_private.key -pubout -out rsa_public.key

三、    个人感想:

这次实验由于我个人能力的不足,做起来有些吃力,但是在老师和其他两位同学的帮助下,终于可以运行成功openssl命令行,但是对其原理的理解还不是很透彻,希望在以后具体内容的实践中逐步深入了解,可以做到熟练运行。