北京电子科技学院

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

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

 

openssl从cer证书提取公钥 openssl 证书转换_服务器

 

 

 

 



小组成员姓名:20175119郑楚琪


指导教师:娄家鹏


提交时间:202054  

 




一、个人任务:

  1. 掌握各种证书格式,了解不同格式的用法,,了解哪几种格式之间可以相互转换,如何用openssl查看,如何用openssl转换为其他格式。
  2. 使用openssl生成一个pem格式的证书,并转化为dem格式。
  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、安装unbutu及openssl:

1.从官网下载最新unbutu镜像,并在vmware上安装。

 

openssl从cer证书提取公钥 openssl 证书转换_#include_02

2.下载openssl离线安装包,解压后进入解压文件夹后打开终端,输入:

./config

make

sudo make install

 

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

openssl从cer证书提取公钥 openssl 证书转换_服务器_03

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

openssl从cer证书提取公钥 openssl 证书转换_#include_04

利用已有的公钥私钥生成证书:openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt

openssl从cer证书提取公钥 openssl 证书转换_#include_05

将证书转化为der格式:openssl x509 -in cert.pem -outform der -out cert.der

openssl从cer证书提取公钥 openssl 证书转换_数字证书_06

6、代码:
#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);
}

 三、遇到的困难及解决办法:

(1)在使用unbutu时,我参考一些博客提到了用命令sudo apt-get install安装一些资源,但是我在使用这条命令时却从未成功过,后来经查阅资料发现,是我的unbutu的源链接在国外服务器,访问速度过慢被系统识别为错误,解决方法为将源更换为国内服务器,我更换源为清华大学的源,最后解决了这个问题。更换的具体方法为:

$ cd /etc/apt/

# 备份源

$ sudo cp sources.list sources.list.bk

# 把原换为清华源

/etc/apt$ sudo gedit sources.list

修改sources.list的内容

$ sudo apt-get update

 

四、体会与收获

刚刚拿到题目时,我对openssl和各种证书格式没有一点了解,对如何完成设计一头雾水,可以说毫无头绪,不知道该从何处下手,通过这几周的实践,我终于对各种证书格式有了一定认识,同时也对openssl的原理有了一定了解,对一些命令操作有了很深的体会。对于我来说,除了学习证书格式和openssl,使用Linux也是一个难点,因为我以前从来未接触过Linux系统,一些基本的操作都花费了大量的时间去学习,比如刚开始我连解压一个压缩包都花了很长时间,安装软件时也经常出错。

开始着手编程时问题就更多了,openssl编程要掌握大量的数据结构的用法,而这是我之前从未遇到过的,同时我还发现我的数字证书知识并不够,我们最后采用了python编写的方法,这样的好处是代码简介明了。我们还有很多需要学习和完善的地方。

感谢娄老师悉心的教导和教育,令我在这三周的实践中收获颇丰。通过查阅资料我的分析能力和代码编程能力又有了一定的进步。

 

五、参考文献:

【1】《openssl与网络信息安全——基础、结构和指令》

【2】《openssl编程》

【3】

【4】https://stackoverflow.com/questions/256405/programmatically-create-x509-certificate-using-openssl/15082282#15082282