GmSSL-Go

GmSSL-Go [https://github.com/guanzhi/GmSSL/tree/master/go] 是GmSSL库的Go语言接口绑定,为Go语言应用提供密码算法、X.509证书、SSL协议和Engine等功能。GmSSL-Go以CGO方式将GmSSL的高层接口封装为Go语言组件,是一个与GmSSL库松耦合的轻量级的中间层,所有的密码功能均由底层的GmSSL库提供。

为何用GmSSL-Go

虽然Go语言的官方库提供了常用的密码算法包和SSL协议包,也存在一些第三方的纯Go语言的密码库,在项目中集成GmSSL-Go仍然有很多不可替代的优势:

  1. GmSSL-Go通过底层的GmSSL库提供完整、丰富的国密算法、证书和SSL协议的支持。
  2. GmSSL-Go可以通过Engine对象满足国密标准的U盾、PCI-E加密卡等国产硬件密码设备,提供系统的安全性、可用性和密码合规性。
  3. GmSSL-Go以CGO方式调用GmSSL库的密码算法实现,相对于纯Go语言实现在密码算法上具有性能上的优势,请参考GmSSL Benchmark。
  4. GmSSL-Go的功能和性能随着GmSSL的升级获得持续的改进。

GmSSL-Go的编译与安装

GmSSL-Go的编译和运行依赖GmSSL的C库,即libcryptolibssl和头文件,在编译安装GmSSL-Go之前应确保GmSSL的C库已经编译安装完成,GmSSL的C库编译安装请参考文档中的编译和安装一节。

GmSSL-Go是一个CGO项目,在编译前应将代码复制到GOPATH目录下的源代码目录。通常系统中的默认GOPATH目录为/home/<username>/go,GmSSL-Go代码的go/gmsslgo/gmssltest分别复制到/home/<username>/go/src/gmssl/home/<username>/go/src/gmssltest,在这两个目录中可以运行go buildgo install来编译和安装,或者在gmssltest目录下运行go run gmssltest.go来测试。

GmSSL-Go接口概述

GmSSL-Go的核心接口是用CGO实现的gmssl包,后续可能会在这组接口的基础上再封装一层兼容Go官方库的中间层。

由于GmSSL-Go的密码功能都是由底层的GmSSL库提供的,不同的编译选项可能导致底层的GmSSL库支持的密码算法不尽相同,因此应用在调用GmSSL-Go的时候可以首先检查GmSSL-Go接口的版本、GmSSL库的版本,以及GmSSL库支持的算法列表。其中函数GetVersions返回GmSSL-Go和GmSSL库的版本号,GetDigestNamesGetCipherNamesGetPublicKeyAlgorithmNamesGetSignAlgorithmNamesGetPublicKeyEncryptionNamesGetDeriveKeyAlgorithmNames返回当前GmSSL库支持的各类算法列表,需要注意的是,一些较新的算法,如SHA-3,或者已经不安全的算法,如DESMD5等,可能不包含在GmSSL库的默认配置中,在调用这些算法前可以通过上述接口进行检查。

GmSSL-Go的密码功能及服务接口如下:

缺失的功能

虽然一些缺失的功能会陆续补充,但是GmSSL-Go并不会试图提供完整的GmSSL功能接口。目前GmSSL-Go预想的典型应用场景为客户端,因此没有提供CA、SSL服务器所需的功能,在这些场景中使用GmSSL-CA、GmSSL反向代理或配置GmSSL的Web Server更为合理。