GmSSL支持SM2/SM3/SM4/SM9/SSL国产商用密码开源库

程序员咋不秃头 2024-07-03 20:11:30

概述

GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。

GmSSL项目是OpenSSL项目的分支,并与OpenSSL保持接口兼容。因此GmSSL可以替代应用中的OpenSSL组件,并使应用自动具备基于国密的安全能力。GmSSL项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。

GmSSL项目由北京大学关志副研究员的密码学研究组开发维护,项目源码托管于GitHub。自2014年发布以来,GmSSL已经在多个项目和产品中获得部署与应用,并获得2015年度“一铭杯”中国Linux软件大赛二等奖(年度最高奖项)与开源中国密码类推荐项目。GmSSL项目的核心目标是通过开源的密码技术推动国内网络空间安全建设。

主要特性超轻量:GmSSL 3 大幅度降低了内存需求和二进制代码体积,不依赖动态内存,可以用于无操作系统的低功耗嵌入式环境(MCU、SOC等),开发者也可以更容易地将国密算法和SSL协议嵌入到现有的项目中。更合规:GmSSL 3 可以配置为仅包含国密算法和国密协议(TLCP协议),依赖GmSSL 的密码应用更容易满足密码产品型号检测的要求,避免由于混杂非国密算法、不安全算法等导致的安全问题和合规问题。更安全:TLS 1.3在安全性和通信延迟上相对之前的TLS协议有巨大的提升,GmSSL 3 支持TLS 1.3协议和RFC 8998的国密套件。GmSSL 3 默认支持密钥的加密保护,提升了密码算法的抗侧信道攻击能力。跨平台:GmSSL 3 更容易跨平台,构建系统不再依赖Perl,默认的CMake构建系统可以容易地和Visual Studio、Android NDK等默认编译工具配合使用,开发者也可以手工编写Makefile在特殊环境中编译、剪裁。支持Java、Go、PHP等多语言接口绑定和REST服务接口国密算法

国密算法是国家商用密码算法的简称。自2012年以来,国家密码管理局以《中华人民共和国密码行业标准》的方式,陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。

其中SM2为基于椭圆曲线密码的公钥密码算法标准,包含数字签名、密钥交换和公钥加密,用于替换RSA/Diffie-Hellman/ECDSA/ECDH等国际算法。SM3为密码哈希算法,用于替代MD5/SHA-1/SHA-256等国际算法。SM4为分组密码,用于替代DES/AES等国际算法;SM9为基于身份的密码算法,可以替代基于数字证书的PKI/CA体系。通过部署国密算法,可以降低由弱密码和错误实现带来的安全风险和部署PKI/CA带来的开销。

编译与安装

下载

wget https://github.com/guanzhi/GmSSL/archive/refs/tags/v3.1.1.zipunzip v3.1.1.zip

安装

cd GmSSL-3.1.1/mkdir buildcd build/sudo cmake ..

cmake编译

sudo cmake ..-- The C compiler identification is GNU 7.5.0-- Check for working C compiler: /usr/bin/cc-- Check for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- Detecting C compile features-- Detecting C compile features - done-- Looking for getentropy-- Looking for getentropy - found-- have getentropy-- Configuring done-- Generating done-- Build files have been written to: /home/www/build/GmSSL-3.1.1/build

编译

make

安装

sudo make install

执行gmssl时的错误

sudo /usr/local/bin/gmssl/usr/local/bin/gmssl: error while loading shared libraries: libgmssl.so.3: cannot open shared object file: No such file or directory

这时候要编辑/etc/ld.so.conf文件,添加一行:

/usr/local/lib

然后执行命令:

ldconfig

在命令行中输入 gmssl version

sudo /usr/local/bin/gmssl versionGmSSL 3.1.1

当你看到GmSSL 3.1.1的时候,说明gmssl安装成功了。

赋予当前用户执行权限

sudo chown www:www /usr/local/bin/基础命令

通过执行gmssl --help 命令

gmssl --helpgmssl: illegal option '--help'usage: gmssl command [options]command -helpCommands: help Print this help message version Print version rand Generate random bytes sm2keygen Generate SM2 keypair sm2sign Generate SM2 signature sm2verify Verify SM2 signature sm2encrypt Encrypt with SM2 public key sm2decrypt Decrypt with SM2 private key sm3 Generate SM3 hash sm3hmac Generate SM3 HMAC tag sm4 Encrypt or decrypt with SM4 zuc Encrypt or decrypt with ZUC sm9setup Generate SM9 master secret sm9keygen Generate SM9 private key sm9sign Generate SM9 signature sm9verify Verify SM9 signature sm9encrypt SM9 public key encryption sm9decrypt SM9 decryption pbkdf2 Generate key from password reqgen Generate certificate signing request (CSR) reqsign Generate certificate from CSR reqparse Parse and print a CSR crlget Download the CRL of given certificate crlgen Sign a CRL with CA certificate and private key crlverify Verify a CRL with issuer's certificate crlparse Parse and print CRL certgen Generate a self-signed certificate certparse Parse and print certificates certverify Verify certificate chain certrevoke Revoke certificate and output RevokedCertificate record cmsparse Parse CMS (cryptographic message syntax) file cmsencrypt Generate CMS EnvelopedData cmsdecrypt Decrypt CMS EnvelopedData cmssign Generate CMS SignedData cmsverify Verify CMS SignedData sdfutil SDF crypto device utility skfutil SKF crypto device utility tlcp_client TLCP client tlcp_server TLCP server tls12_client TLS 1.2 client tls12_server TLS 1.2 server tls13_client TLS 1.3 client tls13_server TLS 1.3 serverSM4加密解密$ KEY=11223344556677881122334455667788$ IV=11223344556677881122334455667788

加密

echo Hello Tony | gmssl sm4 -cbc -encrypt -key $KEY -iv $IV -out sm4.cbc// 加密内容more sm4.cbc $×ʩ#

解密

gmssl sm4 -cbc -decrypt -key $KEY -iv $IV -in sm4.cbcHello TonySM3摘要echo -n “开源技术” | gmssl sm33b944faa488763d08967e7999aa565f8035277f9b017adc8fe209e81de698465

生成公钥和私钥

gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem

私钥

cat sm2.pem -----BEGIN ENCRYPTED PRIVATE KEY-----MIIBBjBhBgkqhkiG9w0BBQ0wVDA0BgkqhkiG9w0BBQwwJwQQD7UeQ0Nd0c8HjwJCBwrZDAIDAQAAAgEQMAsGCSqBHM9VAYMRAjAcBggqgRzPVQFoAgQQJXNNiqfAxKIxy4Ze0KxunASBoHsXGe2jtW6N1DkBROWr/QAY9r6zRlZ4JTphVjdy5MzRJo1Wa6pc+AxPKqouSi5kfayp0nKvJijIZY2e67J3hF327g+xGHj9+keSfTZS1sJfN2c/i1CMZcg2IKes5/T3Zk6DRZKcGIwuuUo3cVYcw+oT3lE5onnSBYT0DXdrRpfGzM8yB3QbyfEcSLm+f22Xzx05AzyiMKWQHSk7n+aH50o=-----END ENCRYPTED PRIVATE KEY-----

公钥

cat sm2pub.pem -----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE7DOZdFLay3eY7/H8J1CECQ5s2Z8o4flOpF1HdPjUh4mPGigJzuOp/PzrrEMTuu9cISHqMmHn6XQDP6B6cy56Rg==

公钥加密

echo -n "Tony 开源技术" | gmssl sm3 -pubkey sm2pub.pem -id 12345678123456787b2f0eb9ce8bf75a799bccff590f38178fbe8d14ff56a2ab001ce382b05cfcf0SM2签名及验签$ gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem$ echo hello | gmssl sm2sign -key sm2.pem -pass 1234 -out sm2.sig #-id 1234567812345678$ echo hello | gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig -id 1234567812345678$ echo hello | gmssl sm2encrypt -pubkey sm2pub.pem -out sm2.der$ gmssl sm2decrypt -key sm2.pem -pass 1234 -in sm2.derSM2加密及解密$ gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem$ echo hello | gmssl sm2encrypt -pubkey sm2pub.pem -out sm2.der$ gmssl sm2decrypt -key sm2.pem -pass 1234 -in sm2.der生成SM2根证书rootcakey.pem及CA证书cakey.pem$ gmssl sm2keygen -pass 1234 -out rootcakey.pem$ gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN ROOTCA -days 3650 -key rootcakey.pem -pass 1234 -out rootcacert.pem -key_usage keyCertSign -key_usage cRLSign$ gmssl certparse -in rootcacert.pem$ gmssl sm2keygen -pass 1234 -out cakey.pem$ gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN "Sub CA" -days 3650 -key cakey.pem -pass 1234 -out careq.pem$ gmssl reqsign -in careq.pem -days 365 -key_usage keyCertSign -path_len_constraint 0 -cacert rootcacert.pem -key rootcakey.pem -pass 1234 -out cacert.pem使用CA证书签发签名证书和加密证书$ gmssl sm2keygen -pass 1234 -out signkey.pem$ gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -days 365 -key signkey.pem -pass 1234 -out signreq.pem$ gmssl reqsign -in signreq.pem -days 365 -key_usage digitalSignature -cacert cacert.pem -key cakey.pem -pass 1234 -out signcert.pem$ gmssl sm2keygen -pass 1234 -out enckey.pem$ gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -days 365 -key enckey.pem -pass 1234 -out encreq.pem$ gmssl reqsign -in encreq.pem -days 365 -key_usage keyEncipherment -cacert cacert.pem -key cakey.pem -pass 1234 -out enccert.pem将签名证书和ca证书合并为服务端证书certs.pem,并验证$ cat signcert.pem > certs.pem$ cat cacert.pem >> certs.pem$ gmssl certverify -in certs.pem -cacert rootcacert.pem查看证书内容$ gmssl certparse -in cacert.pem

官方文档:http://gmssl.org/docs/quickstart.html

0 阅读:0

程序员咋不秃头

简介:感谢大家的关注