北京电子科技学院
《信息安全工程技术应用》课程设计报告
基于OpenSSL的证书格式转换工具设计与实现
小组成员姓名:20175119郑楚琪
指导教师:娄家鹏
提交时间:2020年5月4日
一、个人任务:
- 掌握各种证书格式,了解不同格式的用法,,了解哪几种格式之间可以相互转换,如何用openssl查看,如何用openssl转换为其他格式。
- 使用openssl生成一个pem格式的证书,并转化为dem格式。
- 参与编程
二、学习成果:
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上安装。
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转化格式命令:
- der转化为pem
- openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
- pem转化为der
- openssl x509 -in cert.pem -outform der -out cert.der
- 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 req -new -x509 -days 365 -key rsa_private.key -out cert.crt
将证书转化为der格式:openssl x509 -in cert.pem -outform der -out cert.der
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