基于GmSSL的CA系统构建及应用

一、主要工作

  1. 初步了解GmSSL的基本指令及使用方法
  2. 使用GmSSL生成自签名根证书
  3. 使用根证书签名服务端证书
  4. 构建简单的Web项目,配置服务端证书

二、设计过程

  1. 在Ubuntu 16.04版本上安装GmSSL
     GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法SM2 国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。因此,我们首先按照如下方式来安装GmSSL:

    • 在GmSSL的官网上下载相应版本的压缩包,我安装的是2.5.4版本,下载完毕后将其解压

    在安装之前有一个需要特别注意的地方:第一次以动态库的形式对GmSSL进行编译与安装时,会生成openssl.so的动态库文件,与系统原本的openssl.so动态库产生冲突。而openssl.so是操作系统所依赖的重要库文件,包括联网等活动都会受其影响,所以我们在安装的时候需要进行如下设置:

    • 进入解压包,在终端中输入
    ./config --prefix=/usr/local/gmssl --openssldir=/usr/local/gmssl no-shared
    

    这里的--prefix 表示安装路径;no-shared 表示只编译静态库

    • 接下来使用make和make install来安装
    make & make install
    
    • 修改/etc/profile文件
    sudo vi /etc/profile
    

    并且在文件末尾追加 export PATH="$PATH:/usr/local/gmssl/bin"

    • 使配置文件生效
    source /etc/profile
    
    • 最后分别查看系统原有OpenSSL与新安装的GmSSL的版本信息,可以看到二者是兼容的
    gmssl version
    openssl version
    

  2. 使用Gmssl生成自签名的根证书

    • 第一步,生成根证书的密钥文件
    gmssl genrsa -aes128 -out rootPri.key 2048
    

    这里使用aes128算法来生成2048位根证书的私钥,下图中的pass phrase是查看私钥的密码,是需要记住的,在接下来的步骤中还会用到它。

    • 第二步,生成自签名证书的请求文件
    gmssl req -new -key rootPri.key -out request.csr
    

    这里需要用到刚才生成的根证书的私钥,而且也要输入pass phrase来查看私钥。另外,在生成证书请求文件的时候会要求你输入一系列构建证书的相关信息,如下图所示,这一部分可由读者自由输入。

    • 第三步,对证书请求文件进行自签名,生成根证书
    gmssl x509 -req -days 365 -in request.csr -signkey rootPri.key -out root.crt
    

    依然是需要输入之前的密码来查看私钥,至此,自签名的根证书就制作完成了,我们之后需要将其导入至相应的浏览器中。

  3. 使用自签名根证书来签发Web服务端证书
    这一过程和根证书的制作类似,只是个别细节之处稍有不同,注意看接下来的步骤:

    • 第一步,生成服务端证书的密钥文件
    gmssl genrsa -aes128 -out serverPri.key 2048
    

    • 第二步,生成服务端证书的请求文件,这边需要注意的是,在填写Common Name一栏信息时,需要输入服务器的IP地址或者域名,否则会出现“网站名称与证书名称不一致”的错误。因为我在本机上进行的测试,所以填的是localhost。
    gmssl req -new -key serverPri.key -out serverRequest.csr
    

    • 第三步,使用之前的根证书对服务端请求进行签名
    gmssl x509 -req -in serverRequest.csr -out serverCert.crt -signkey serverPri.key -CA root.crt -CAkey rootPri.key -CAcreateserial -days 365
    

    主要是使用根证书root.crt和密钥rootPri.key,对服务端请求进行签名,生成一个有效期为365天的服务端证书。

    • 第四步,转换服务端证书的格式
    gmssl pkcs12 -export -clcerts -in serverCert.crt -inkey serverPri.key -out serverCert.p12
    

    将服务端证书格式从crt转换为p12,因为在SpringBoot项目中需要p12的证书。
    其实这一步也可以和第三步合并,在导出时直接指定p12格式即可。

  4. 在SpringBoot项目里配置服务端证书
      这一部分主要是使用SpringBoot+Thymeleaf,这个是比较简单的部分,所以就不详细展开描述了。我们需要关注的是将刚才生成的serverCert.p12配置到项目中。这个也很容易操作,在application.yml(或者application.properties)里设置ssl相关内容:

server:
  port: 8443
  ssl:
    key-password: 654321
    key-store-password: 654321
    key-store-type: PKCS12
    key-store: classpath:serverCert.p12
spring:
  thymeleaf:
    cache: false

  serverCert.p12证书可以放在resources文件夹下,指定其密码、格式等信息即可完成配置。至于最后关闭Thymeleaf的缓存,主要是用于开发时使用的,生产环境下应当关闭。这里更好的做法是使用多环境配置,有兴趣的读者可以自己修改。

三、调试过程

  其实进行初步设置时并不是和上面的流程一样,对于https的验证出现了一些小问题,下面我会列出几种错误情况。启动SpringBoot项目后,从浏览器访问https://localhost:8443,观察页面的显示:

  1. 在填写Common Name信息时,使用了非服务器的IP地址或者是域名。
    下面两张图片反映的都是这个问题,只不过火狐和Microsoft Edge的警告信息不一致。

  我们直接看Edge上的警告信息:“该网站的安全证书中的主机名与你正在尝试访问的网站不同。”,这是因为我没有填写localhost作为Common Name,看到这个警告信息后,就可以知道需要在之前生成请求文件时,Common Name一栏不可随意填写。

  1. 在Spring项目里使用自签名的根证书。
    针对这样的设置,火狐依然给出了警告信息,而Edge却允许此设置。

  在火狐的警告信息里,清晰地写明了“该证书因为其自签名而不被信任。”,因为我当时在项目里配置的是根证书,而不是服务端证书。虽然Edge没有给出警告,但这样的设置还是一种不安全的行为,所以最好再生成一个服务端的证书。

  1. 此服务器无法证明它是localhost。

  这个问题是在其他成员电脑上测试发现的,而且除了Google Chrome以外,在新版的Microsoft Edge上也会有这样的问题。这是一个暂时未解决的问题,我目前没有想到好的办法,而且网上的回答也不太多。

  1. 根据以上几种警告信息,我重新对证书的生成和配置做了相应的修改,最后终于达成了想要的效果。

  但是完全按照上述步骤操作也不一定能够实现上图一样的效果,因为是否能实现HTTPS的认证,还要考虑到不同浏览器或者是浏览器的不同版本带来的差异,希望有兴趣读者根据这些因素具体分析。

四、设计体会与收获

  基于GmSSL来搭建CA系统,简单来说就是实现HTTP向HTTPS的转换,这一过程是相当重要的。虽然整体的操作相对容易,但是在设计过程中依然出现了一些问题,而且我也有了一些新的收获:

  1. 首先,本次课程设计让我对OpenSSL或是GmSSL有了一个了解的机会,并且初步掌握了一些加密、签名、生成证书等基本用法。
  2. 其次,对于HTTPS和CA的工作原理,我也获得了更加深入的理解。虽然在以前的课程中学习过相关的内容,但是实践性的操作往往会带来更好的效果。其实说实践操作也不太准确,因为HTTPS的加密过程是由浏览器与服务端封装完成的。不过至少在查阅相关资料的过程中,我对此也有了更深的印象。
  3. 还有一点,本次的课程设计是我第一次在SpringBoot项目中配置SSL,虽然配置过程并不复杂,但是这也是极具重要性和必要性的一次实践,因为目前的后端服务几乎都是基于HTTPS而搭建的,更进一步,像微信小程序的线上版本更是只允许发送安全的HTTPS请求,所以说本次实现HTTPS服务也是为了日后的开发做基础。
  4. 最后我想指出,调试过程也是不可忽视的一部分,很少有人在进行开发时能够一次成功,总要经历数次的调试和改错。就像我上面给出的那些警告信息一样,我也遇到了许多的小问题,正是依据这些给出的信息,我才能够明白在生成证书时应当如何填写、在配置证书时应当怎样操作,也对证书生成、签发的整个流程有了清晰的理解。

五、参考资料

  1. 关于GmSSL与OpenSSL的兼容安装
  2. openssl实现自签名证书
  3. Spring Boot 支持 HTTPS 如此简单,So easy!
posted @ 2020-11-08 22:51  高教授  阅读(1072)  评论(0编辑  收藏  举报