基于gmssl的CA系统构建及应用课程设计报告
北京电子科技学院
《信息安全工程技术应用》课程设计报告
基于gmssl的CA系统构建及应用
小组成员姓名:
20181311高雨辰
20181321覃泳龙
20181322王冠霖
指导老师:
娄嘉鹏
提交日期:
2020年11月8日
一、设计方案及可行性分析
对于这个选题,我们组经过讨论将该题分为构建与应用两部分,我们的目的在本地搭建一个使用https服务的网站。
1. 模型
2.设计方案
3. 可行性
https服务的关键就是数字证书,数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性,故要想提供安全可靠的https服务,服务器端就要向CA机构申请收信任的证书。
二、详细设计思路
1. 系统体系结构,技术选择:
SpringBoot框架+Thymeleaf模板
2. 创建自签名CA
1) 生成根证书的密钥文件
gmssl genrsa -aes128 -out rootPri.key 2048
1) 生成根证书的密钥文件
gmssl genrsa -aes128 -out rootPri.key 2048
2) 生成自签名证书的请求文件
gmssl req -new -key rootPri.key -out request.csr
3) 对证书请求文件进行自签名,生成根证书
gmssl x509 -req -days 365 -in request.csr -signkey rootPri.key -out root.crt
3. 创建服务端可信证书
1) 生成服务端证书的密钥文件
gmssl genrsa -aes128 -out serverPri.key 2048
2) 生成服务端证书的请求文件
gmssl req -new -key serverPri.key -out serverRequest.csr
3) 使用之前的根证书对服务端请求进行签名
gmssl x509 -req -in serverRequest.csr -out serverCert.crt -signkey serverPri.key -CA root.crt -CAkey rootPri.key -CAcreateserial -days 365
4) 转换服务端证书的格式
gmssl pkcs12 -export -clcerts -in serverCert.crt -inkey serverPri.key -out serverCert.p12
4. 测试过程
1) 测试目的:
检验是否搭建完成可用的CA系统,从而实现HTTPS服务。
2) 测试内容:
通过浏览器访问目的端口,观察网址前端是否加上使用HTTPS锁的图标。
3) 测试结果及分析:
以下将列出测试过程中的警告信息或者是成功案例,并给出相应的结果分析。
l 服务端证书Common Name一栏信息填写错误:
上面两张图片反映的都是这个问题,只不过火狐和Edge的警告信息不一致。出现此问题的原因在于:创建serverCert.csr时没有填写localhost作为Common Name。
l 使用自签名的根证书:
使用自签名的根证书,针对这样的设置,火狐浏览器给出了警告信息,而Edge允许此设置。火狐的警告信息中写到:“该证书因为其自签名而不被信任。”,提示尽量不要在Web项目使用根证书,需要创建服务端证书。
l 此服务器无法证明它是localhost:
这个问题是在其他成员电脑上测试发现的,而且除了Google Chrome以外,在新版的Microsoft Edge上也会有这样的问题。这是一个暂时未解决的问题,我们目前没有想到好的办法,而且网上的回答也不太多。
l 根据以上的警告信息进行修改,成功实现HTTPS服务:
三、设计特色
1. 基于GmSSL实现HTTPS
GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。GmSSL项目是OpenSSL项目的分支,并与OpenSSL保持接口兼容。因此GmSSL可以替代应用中的OpenSSL组件,并使应用自动具备基于国密的安全能力。GmSSL项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。另外,GmSSL还有以下优点:
支持SM2/SM3/SM4/SM9/ZUC等全部已公开国密算法;
支持国密SM2双证书SSL套件和国密SM9标识密码套件;
高效实现在主流处理器上可完成4.5万次SM2签名;
支持动态接入具备SKF/SDF接口的硬件密码模块;
支持门限签名、秘密共享和白盒密码等高级安全特性;
支持Java、Go、PHP等多语言接口绑定和REST服务接口。
2. 使用SpringBoot+Thymeleaf构建Web项目
1) 采用Spring Boot框架,创建独立的Spring应用程序。SpringBoot直接内嵌tomcat、jetty和undertow(不需要打包成war包部署),同时并不需要xml配置,简化了项目构建。
2) SpringBoot支持模板引擎技术,而Thymeleaf就是其中一种,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf,代码几乎没有任何区别,仅仅在模板语法上略有不同。同时,Thymeleaf页面采用模板+数据的方式,方便前后端的同时开发。
四、源代码及注释
项目程序已提交至码云,在这里就只对关键部分进行分析。
1)pom.xml
1.<?xml version="1.0" encoding="UTF-8"?> 2.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4. <modelVersion>4.0.0</modelVersion> 5. <parent> 6. <groupId>org.springframework.boot</groupId> 7. <artifactId>spring-boot-starter-parent</artifactId> 8. <version>2.3.4.RELEASE</version> 9. <relativePath/> <!-- lookup parent from repository --> 10. </parent> 11. <groupId>cn.edu.besti</groupId> 12. <artifactId>course-design</artifactId> 13. <version>0.0.1-SNAPSHOT</version> 14. <name>course-design</name> 15. <description>Course-design based on GmSSL.</description> 16. 17. <properties> 18. <java.version>1.8</java.version> 19. </properties> 20. 21. <dependencies> 22. <dependency> 23. <groupId>org.springframework.boot</groupId> 24. <artifactId>spring-boot-starter-web</artifactId> 25. </dependency> 26. <dependency> 27. <groupId>org.springframework.boot</groupId> 28. <artifactId>spring-boot-starter-thymeleaf</artifactId> 29. </dependency> 30. <dependency> 31. <groupId>org.springframework.boot</groupId> 32. <artifactId>spring-boot-devtools</artifactId> 33. <scope>runtime</scope> 34. <optional>true</optional> 35. </dependency> 36. <dependency> 37. <groupId>org.springframework.boot</groupId> 38. <artifactId>spring-boot-starter-test</artifactId> 39. <scope>test</scope> 40. <exclusions> 41. <exclusion> 42. <groupId>org.junit.vintage</groupId> 43. <artifactId>junit-vintage-engine</artifactId> 44. </exclusion> 45. </exclusions> 46. </dependency> 47. </dependencies> 48. 49. <build> 50. <plugins> 51. <plugin> 52. <groupId>org.springframework.boot</groupId> 53. <artifactId>spring-boot-maven-plugin</artifactId> 54. </plugin> 55. </plugins> 56. </build> 57. 58.</project> 59.
既然项目是基于SpringBoot+Thymeleaf构建的,那么需要在pom.xml中加上Thymeleaf的依赖;至于其他的依赖,比如热部署、单元测试等也可由读者自行添加。最后的maven plugin可以用来打包jar,直接使用jar允许项目比较方便。
2)Controller.java
1.package cn.edu.besti.coursedesign.controller; 2. 3.import org.springframework.web.bind.annotation.GetMapping; 4. 5./** 6. * @author GAO 7. */ 8.@org.springframework.stereotype.Controller 9.public class Controller { 10. 11. @GetMapping(value={"/","/index.html"}) 12. public String index() { return "index";} 13. @GetMapping("/single.html") 14. public String single() { 15. return "single"; 16. } 17. 18.}
controller层主要负责前端逻辑,针对不同的Get请求,返回不同的页面。
3)application.yml
1.server: 2. port: 8443 3. ssl: 4. key-password: 654321 5. key-store-password: 654321 6. key-store-type: PKCS12 7. key-store: classpath:serverCert.p12 8.spring: 9. thymeleaf: 10. cache: false
application.yml主要用来配置服务端证书,在server下增加ssl选项,填写证书的相关信息。至于最后关闭Thymeleaf的缓存,主要是用于开发时使用的,生产环境下应当关闭,这里更好的做法是使用多环境配置。
五、个人报告
1. 小组贡献排序及依据(每个人的工作量):
贡献排序:
1)、高雨辰 (https的配置、web网页的设计、网页调试、)
2)、王冠霖 (https的配置、tomcat的配置,网页调试)
3)、覃泳龙 (CA系统的搭建,网页部分调试,nginx的配置)
2.个人报告:
高雨辰:https://www.cnblogs.com/prof-gao/p/13924791.html
覃泳龙:https://www.cnblogs.com/qbll/p/13945580.html
王冠霖:https://www.cnblogs.com/sofar1322/p/13941557.html