《信息安全工程技术应用》课程设计报告
基于gmssl的CA系统构建及应用
20181212滕珠江
一、自己的工作量(小组贡献)
1、第一周熟悉openssl的常用命令,实践利用openssl建立CA及自行签发证书
通过实践基本掌握openssl常用指令的作用,并利用openssl的指令建立CA及自行签发证书。
2、第二周熟悉gmssl的常用命令并初步开展网站制作
通过实践基本掌握分配的每一条gmssl指令的作用,并完成网站css和html部分的关键代码。
3、第三周完成网站的制作并将网页部署到Tomcat中
利用html、css、js完成了网站的制作,此外尝试了在eclipse中通过新建web项目制作网页,并将网页部署到Tomcat上。
4、第四周将ca部署进tomcat,并撰写课设报告。
将ca部署进tomcat并可以使用https协议访问自己制作的网站。完成小组课程设计报告的第二部分:详细设计思路的撰写,和另一位组员共同完成报告中第四部分:源代码及注释的撰写。完成个人报告的撰写。
二、设计中遇到的问题及解决方法
1、gmssl安装的问题
在下载GmSSL-master.zip后输入命令行:
$ unzip GmSSL-master.zip $ ./config $ make $ sudo make install
1)、首先是./config时报错:
Operating system: x86_64-whatever-linux2 “glob” is not exported by the File::Glob module Can’t continue after import errors at ./Configure line 18. BEGIN failed–compilation aborted at ./Configure line 18. “glob” is not exported by the File::Glob module Can’t continue after import errors at ./Configure line 18. BEGIN failed–compilation aborted at ./Configure line 18. This system (linux-x86_64) is not supported. See file INSTALL for details
这是glob相关问题,在 Configure文件和 test/build.info这个文件,
把use if $^O ne "VMS", 'File::Glob' => qw/glob/;改成use if $^O ne "VMS", 'File::Glob' => qw/:glob/; 就可以解决。
2)、输入gmssl version后报错:
输入openssl命令时也报错:
经过多方资料查阅并结合了同学给出的建议,终于解决了可以使用gmssl的问题:
暂时解决方法如下:
ldd /usr/local/bin/gmssl # 安装路径,查看gmssl依赖库路径# # 把make后的两个依赖库拷贝到相应路径 cp libcrypto.so.1.1 /usr/local/openssl-1.1.0d/lib/ cp libssl.so.1.1 /usr/local/openssl-1.1.0d/lib/
但这种方法会影响openssl的应用。
查阅资料发现,主要是LD_LIBRARY_PATH这个环境变量没有指定导致openssl正在使用旧的系统OpenSSL库。
但这样操作之后gmssl无法使用,这是因为默认的./config使gmssl与已安装的openssl冲突。
2、在进行crl命令的尝试时,由于需要先生成一个crl的文件,即一个被撤销的证书,这需要先生成一个可用的证书再吊销它。在生成证书时,遇到问题:
1)、首先遇到的问题就是找不到文件
需要在openssl的目录下建立默认CA的目录,默认CA 的查找方式是查阅openssl.cnf文件,可以看到有一行
故需要创建默认CA的目录./demoCA,但在此之前,需要找到openssl在虚拟机中的位置,经过查找,路径为:
usr/local/toolchain/toolchain-4.5.1/arm-none-linux-gnueabi/sys-root/usr/openssl,先进入openssl,创建新目录时又遇到报错:权限不够,后经过修改,发现需要在命令之前输入sudo即可完成。
之后再在demoCA的目录下创建certs,crl,newcerts,private文件夹和文件serial、crlnumber和index.txt,接着输入:
sudo openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048
生成CA 证书的 RSA 密钥对,
sudo openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem
生成CA证书请求,
openssl ca -selfsign -in careq.pem -out cacert.pem
对 CA 证书请求进行自签名,
openssl genrsa -des3 -out userkey.pem 1024
生成用户密钥对,
openssl req -new -days 365 -key userkey.pem -out userreq.pem
生成用户证书请求文件,
openssl ca -in userreq.pem -out usercert.pem
对用户证书签名
2)、在对用户证书签名这一步时,遇到了两个问题:
原因:CA根证书找不到,第4步生成的根证书放的位置不对。
问题解决:把4步生成的cacert.pem移动到./demoCA目录下即可。
仍然失败,原因:证书请求文件的单位名称和CA根证书的证书请求文件的单位名称不一致。而在Openssl的配置文件中,要求一致。
问题解决:将[policy_match]的organizationName = match改为:organizationName = optional再次签名成功了。
3、在对 CA 证书请求进行自签名时一直找不到private/cakey.pem文件
原因:在Openssl的配置文件中,dir的目录名一开始写的是D:/demoCA,然而命令行所在的目录名是/mnt/d/demoCA。
问题解决:将dir路径修改之后,则不会发生这样的错误。
4、使用RSA公钥验证签名时,找不到公钥文件
原因:-verify file:执行验证操作,后面指定的是公钥文件,-prverify file:执行验证操作,后面指定的是私钥文件,这里是公钥验签,故应当用verify。
问题解决:输入-verify即可
5、在搭建CA的步骤“移除客户端证书创建一个证书撤销列表”时,找不到文件
原因:openssl.conf文件中的默认目录与命令行不一致
问题解决:将openssl.conf中的绝对路径改为$dir/
三、调试过程中遇到的问题及解决方法
1、eclipse启动Tomcat报错:
原因:端口被占用
问题解决:
第一步:找到端口号对应的进程,也就是找到该进程标识符PID
方法一:命令行键入 netstat -ano
列出所有端口的情况,在列表中我们可以看到被占用的端口的使用情况,比如这里的8005, 8080三个端口,他们的进程标识符为9552,也就是这三个端口被PID为9552的进程占用
方法二:命令行键入 netstat -aon | findstr 8080
查看指定的端口号的使用情况,查看其PID
第二步:找到进程标识符PID对应的那个程序,禁用或结束它
方法一:
打开任务管理器,选择 详细信息,查看PID 为9552所对应的进程或程序,然后右击禁用或结束该进程即可
方法二:知道了PID,直接通过他结束进程
命令行输入 taskkill /pid 9552 /f,该命令可以将进程号指定的进程结束掉;
结束进程后,再次启动 Tomcat 成功
2、在运行一个jsp项目时,eclipse报错:404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示
原因:jsp或html等文件是直属于Webcontent,与【META-INF】【WEB-INF】平级,不要将jsp文件放置到【WEB-INF】下面,WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。所以会引起404错误。
问题解决:将jsp文件放在webcontent文件夹下,保持与WEB-INF平级,即可成功访问。
3、编辑Tomcat配置文件使之能提供https服务时,修改错误导致无法打开tomcat:
问题解决:查看tomcat官方帮助文档,发现Tomcat可以使用两种不同的SSL实现:一,作为Java运行时的一部分提供的JSSE实现(自1.4开始);二,APR实现,默认情况下使用OpenSSL引擎。
如果通过指定泛型来配置连接器, protocol="HTTP/1.1"则将自动选择Tomcat使用的实现。如果安装使用APR (即已经安装了Tomcat本机库),则它将使用APR SSL实现,否则将使用Java JSSE实现。
由于APR和JSSE实施之间SSL支持的配置属性存在显着差异,因此建议避免自动选择实施。通过在Connector的protocol属性中指定一个类名来完成此操作。
比如,要定义Java(JSSE)连接器(无论是否加载了APR库),则使用
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" .../>
具体做法:
在$CATALINA_BASE/conf/server.xml文件中配置连接器,该文件 $CATALINA_BASE代表Tomcat实例的基本目录,我的电脑上是C:\Program Files\Tomcat 9.0。注意 Tomcat<Connector>随附的默认server.xml文件中包含SSL连接器的示例元素。要配置使用JSSE的SSL连接器,需要先注释掉<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>,接着增加一段:
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="${user.home}/.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLS"/>
完成这些配置更改后,重新启动Tomcat,可以正常工作并能够通过SSL访问Tomcat支持的任何Web应用程序。
4、在修改server.xml文件后启动Tomcat报错,提示初始化组件失败:
问题解决:server.xml文件中keystorePass应该是将client证书转换为PKCS12文件时终端键入的密码,我的情况应该是12345,开始时设定的是challenge password的值,故初始化失败。
5、CA根证书显示有一个无效的数字签名。
问题解决:发现这是由于在生成客户端证书时,填写使用者时填写的和CA根证书的使用者一致,这意味着客户端证书的颁发者和使用者相同,且就是根CA,而客户端证书的使用者应当是服务器主机名(或者IP),即localhost(或者127.0.0.1):
改过之后证书正确:
客户端证书路径正确:
四、设计体会及收获
拿到本次课设题目时,首先有种惧怕感,因为课题题目中涉及两个关键词gmssl和CA,对于前者可谓是闻所未闻,对于后者,只是蜻蜓点水似的掌握一些最基本的概念,知道CA是颁发数字证书的机构,负责发放和管理数字证书,并作为受信任的第三方权威机构,进行公钥体系中公钥的合法性检验。却并不知道CA是如何生成、颁发、吊销以及管理证书的整个生命周期的,更别提利用gmssl命令来实现这一过程了。经过第一周对任务进行分析和疏通之后,便较快地确定了本次课程设计所要攻克的几大难点:
一是openssl和gmssl命令的运用,在命令行使用help参数查看各参数的使用方式和含义,接着就是熟悉的“做中学”了,通过查阅资料和自己的摸索来尝试一些常用命令的使用。比如,用aes,des算法进行对称加密,注意解密时不要在源文件上操作,否则万一解密失败,源文件也没有了;用sha256,sha512,hmac进行单向散列函数加密,注意md5不再推荐使用,刚开始给网站部署证书时使用md5算法即被认为证书不安全;使用genrsa生成私钥,然后再使用rsa从私钥中提取公钥,从而获得密钥对……在实现crl即证书吊销命令时,也初步掌握了证书的申请签署步骤,可以概括为生成申请请求,RA验证即负责注册公钥和身份认证,CA签署,获取证书。
二是网站的搭建以及如何使用Tomcat搭建本地web服务器。网站的搭建在web课上有所接触,但Tomcat的使用却一无所知。官方定义说,Tomcat是Apache组织的Jakarta项目的一个重要子项目,它是Sun公司推荐的运行Servlet和JSP的容器。Tomcat是用Java语言编写的,需要运行在Java虚拟机上,所以一般需要先安装JDK,以提供运行环境。Tomcat的容器作用体现在开发出来的应用需要装进Tomcat,这是因为忽略各个文件之间的跳转,web应用本质只是一个装有很多资源(java/html/jsp/js/css等各种格式文件)的文件夹。Tomcat的服务器作用体现在:当一个动态网页编写完成后是不能直接被别人通过浏览器访问的,要想访问此动态网页就必须让浏览器通过一段程序来访问此网页,这段程序就是服务器。它用来接受浏览器请求,进行处理然后返回结果。在web课程的基础之上,和其他组员合作制作了一个网站dykmovie,并通过查阅网络资料,成功安装Tomcat并能够通过本地服务器浏览网页。
三是解决如何给网站颁发证书即如何将证书部署到Tomcat,将证书与服务器连接使证书在网站上生效从而安全访问网站的问题。首先查阅了SSL双向认证和SSL单向认证的区别:双向认证 SSL 协议要求服务器和用户双方都有证书,需要服务端与客户端提供身份认证,只能是服务端允许的客户能去访问,安全性相对于要高一些;而单向认证 SSL 协议不需要客户拥有CA证书,即不需要服务器端验证客户证书的过程。但考虑到用户的数目庞大,并且一般都在应用层来保证用户的合法性而很少在网络层对用户身份进行验证,也为了可以让大部分人都可以访问自己的站点,多数web应用都采用SSL单项认证,因此,我们小组选择实现的是https单项认证,大致步骤如下:
一、使用Open SSL生成CA证书 1、在/root目录下新建一个ca文件夹,并在ca文件夹下创建四个子文件夹。 -newcerts目录将用于存放CA签署过的数字证书。 -private目录用于存放CA的私钥。 -conf目录用于存放一些简化参数用的配置文件。 -server目录存放服务器证书文件。 在conf目录下新建一个包含如下信息的openssl.conf文件。 ~su root ~mkdir ca ~cd ca ~mkdir newcerts private conf server ~cd conf/ ~vim openssl.conf [ ca ] default_ca = foo [ foo ] dir = /home/tzj/ca database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/private/ca.crt serial = $dir/serial private_key = $dir/private/ca.key RANDFILE = $dir/private/.rand default_days = 365 default_crl_days= 30 default_md = md5 unique_subject = no policy = policy_any [ policy_any ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = match localityName = optional commonName = supplied emailAddress = optional 2、生成私钥key文件。 ~openssl genrsa -out private/ca.key 3、执行如下命令,按照提示输入所需信息,然后按下回车键生成证书请求csr文件。 ~openssl req -new -key private/ca.key -out private/ca.csr 4、执行如下命令,生成凭证crt文件。 ~openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt 5、执行如下命令,为CA的key设置起始序列号,可以是任意四个字符,创建CA键库。 ~echo 1212 > serial ~touch index.txt 6、执行如下命令,为移除客户端证书创建一个证书撤销列表。 ~openssl ca -gencrl -out /root/ca/private/ca.crl -crldays 7 -config "/home/tzj/ca/conf/openssl.conf" 二、为客户端证书签名 1、执行如下命令,在ca目录内创建一个存放客户端key的目录users。为客户端创建一个key。 ~mkdir users ~openssl genrsa -des3 -out /home/tzj/ca/users/client.key 1024 2、执行如下命令,为客户端key创建一个证书签名请求csr文件。 ~openssl req -new -key /home/tzj/ca/users/client.key -out /home/tzj/ca/users/client.csr 3、执行如下命令,使用CA证书的key为客户端key签名。 ~openssl ca -in /home/tzj/ca/users/client.csr -cert /home/tzj/ca/private/ca.crt -keyfile /home/tzj/ca/private/ca.key -out /home/tzj/ca/users/client.crt -config "/home/tzj/ca/conf/openssl.conf" 4、将证书转换为PKCS12文件。 ~openssl pkcs12 -export -clcerts -in /home/tzj/ca/users/client.crt -inkey /home/tzj/ca/users/client.key -out /home/tzj/ca/users/client.p12
通过本次课设我对如何利用openssl和gmssl对证书进行管理,具体包括生成密钥对、注册公钥时对身份进行认证、颁发证书、吊销证书,有了实践性的认识,对tomcat的配置、网站的部署有了更深的了解,也能够通过自己生成证书,将证书部署到网站上,使自己搭建的网站能够被安全访问,实现这一步的过程也使我意识到阅读官方文档的重要性,通过查阅Tomcat官方文档,找到了在Tomcat中配置HTTPS的方法。
五、参考资料
https://blog.csdn.net/nange_nice/article/details/82182635
https://blog.csdn.net/RookieWutongshu/article/details/86728315
https://blog.csdn.net/chhlilt/article/details/105038966?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
https://www.cnblogs.com/wanghaoyuhappy/p/5267702.html
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html
https://blog.csdn.net/dh554112075/article/details/101285853
https://blog.csdn.net/qq_41813208/article/details/103086110
http://www.360doc.com/content/19/1224/17/16276861_881829888.shtml
https://www.cnblogs.com/coolworld/p/6946419.html
https://www.cnblogs.com/YDDMAX/p/5368404.html