开放原子训练营(第一季)铜锁探密学习营学习心得

开放原子训练营(第一季)铜锁探密学习营学习心得

学习目标:

  • 掌握铜锁环境部署
  • 掌握铜锁的常用加解密、签名算法
  • 掌握基于铜锁国密算法的TLS协议

学习内容:

  1. 搭建铜锁实验环境
  2. SM2&SM3&SM4算法实战
  3. 签发国密证书
  4. 国密传输协议实战
  5. 铜锁应用示例

学习时间:

2023-05-07 10:00-18:00


学习产出:

  • 学习心得

心得总结如下:

铜锁/Tongsuo是一个提供现代密码学算法和安全通信协议的开源基础密码库,为存储、网络、密钥管理、隐私计算等诸多业务场景提供底层的密码学基础能力,实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性,为数据生命周期中的隐私和安全提供保护能力(更详细的介绍见github库)。按照学习内容整理心得如下:

1. 搭建铜锁实验环境

见官方文档源码编译。建议在linux arm64的平台机器中编译,兼容性最好。
注:与linux自带的openssl兼容性问题也可见官方文档Tongsuo(原 BabaSSL) 与其他 openssl 版本库共存方案

2. SM2&SM3&SM4算法实战

这部分学习内容主要是熟悉常用国密算法的加解密和签名。

  • 实战SM4加解密算法
echo "hello tongsuo" > msg.bin
# SM4-CBC加密
/opt/tongsuo/bin/tongsuo enc -K "3f342e9d67d6ce7be701756af7bac8f2" -e -sm4
-cbc -in msg.bin -iv "1fb2d42fb36e2e88a220b04f2e49aa13" -nosalt -out ciphe
r.bin
# SM4-CBC解密
/opt/tongsuo/bin/tongsuo enc -K "3f342e9d67d6ce7be701756af7bac8f2" -d -sm4
-cbc -in cipher.bin -iv "1fb2d42fb36e2e88a220b04f2e49aa13" -nosalt -out ms
g2.bin
# ⽐较解密的明⽂和原来的消息是否⼀样
diff msg.bin msg2.bin
  • 实战SM3杂凑算法
echo -n "hello tongsuo" | /opt/tongsuo/bin/tongsuo dgst -sm3
  • 实战SM2签名和验签
# ⽣成⼀个随机内容⽂件
dd if=/dev/urandom of=msg.bin bs=1024 count=1
# SM2私钥签名,签名算法为SM2withSM3,Tongsuo/test/certs/sm2.key来⾃Tongsuo源代码
仓库
/opt/tongsuo/bin/tongsuo dgst -sm3 -sign Tongsuo/test/certs/sm2.key -out si
gfile msg.bin
# SM2公钥验签,Tongsuo/test/certs/sm2pub.key来⾃Tongsuo源代码仓库
/opt/tongsuo/bin/tongsuo dgst -sm3 -verify Tongsuo/test/certs/sm2pub.key -s
ignature sigfile msg.bin

3. 签发国密证书

这部分内容是学习国密证书的生成和签发过程

  1. 签发CA根证书

生成ca.conf

[ ca ]
# `man ca`
default_ca = CA_default
[ CA_default ]
# Directory and file locations.
dir = ./certs/ca
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/db/index
unique_subject = no
serial = $dir/db/serial
RANDFILE = $dir/private/random
# The root key and root certificate.
private_key = $dir/ca.key
certificate = $dir/ca.crt
# For certificate revocation lists.
crlnumber = $dir/crl/crlnumber
crl = $dir/crl/ca.crl.pem
crl_extensions = crl_ext
default_crl_days = 30
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days = 365
preserve = no
policy = policy_strict
[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
# Options for the `req` tool (`man req`).
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
# Extension to add when the -x509 option is used.
x509_extensions = v3_ca
req_extensions = v3_req
[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName = optional
stateOrProvinceName = optional
localityName = optional
0.organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional
# Optionally, specify some defaults.
countryName_default =
stateOrProvinceName_default =
localityName_default =
0.organizationName_default =
#organizationalUnitName_default =
#emailAddress_default =
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = test.com
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning
[ crl_ext ]
# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always

开始生成CA证书

mkdir -p certs/ca
mkdir certs/ca/{newcerts,db,private,crl}
touch certs/ca/crl/crlnumber
echo 00 > certs/ca/crl/crlnumber
touch certs/ca/db/{index,serial}
echo 00 > certs/ca/db/serial

# ca.conf需提前生成

# ⽣成SM2私钥
/opt/tongsuo/bin/tongsuo genpkey -algorithm ec -out certs/ca/sm2.key -pkeyo
pt ec_paramgen_curve:sm2
# ⽣成CSR
/opt/tongsuo/bin/tongsuo req -batch -config ca.cnf -key certs/ca/sm2.key -n
ew -nodes -out certs/ca/sm2.csr -sm3 -subj "/C=AB/ST=CD/L=EF/O=GH/OU=IJ/CN=
CA SM2"
# ⾃签发CA证书
/opt/tongsuo/bin/tongsuo ca -batch -config ca.cnf -days 365 -extensions v3_
ca -in certs/ca/sm2.csr -keyfile certs/ca/sm2.key -md sm3 -notext -out cert
s/ca/sm2.crt -selfsign
  1. 签发中间CA证书
mkdir -p certs/subca
mkdir certs/subca/{newcerts,db,private,crl}
touch certs/subca/crl/crlnumber
echo 00 > certs/subca/crl/crlnumber
touch certs/subca/db/{index,serial}
echo 00 > certs/subca/db/serial

# 生成 subca.cnf 大部分内容同ca.conf 略

# ⽣成SM2私钥
/opt/tongsuo/bin/tongsuo genpkey -algorithm "ec" -out certs/subca/sm2.key -
pkeyopt ec_paramgen_curve:sm2
# ⽣成CSR
/opt/tongsuo/bin/tongsuo req -batch -config subca.cnf -key certs/subca/sm2.
key -new -nodes -out certs/subca/sm2.csr -sm3 -subj "/C=AB/ST=CD/L=EF/O=GH/
OU=IJ/CN=SUBCA SM2"
# 使⽤CA证书签发中间CA证书
/opt/tongsuo/bin/tongsuo ca -batch -cert certs/ca/sm2.crt -config subca.cn
f -days 365 -extensions "v3_intermediate_ca" -in certs/subca/sm2.csr -keyfi
le certs/ca/sm2.key -md sm3 -notext -out certs/subca/sm2.crt
  1. 签发服务器双证书
mkdir certs/server

# ⽣成SM2签名私钥
/opt/tongsuo/bin/tongsuo genpkey -algorithm ec -out certs/server/sm2_sign.k
ey -pkeyopt "ec_paramgen_curve:sm2"
# ⽣成CSR
/opt/tongsuo/bin/tongsuo req -batch -config subca.cnf -key certs/server/sm2
_sign.key -new -nodes -out certs/server/sm2_sign.csr -sm3 -subj "/C=AB/ST=C
D/L=EF/O=GH/OU=IJ/CN=SERVER Sign SM2"
# 使⽤中间CA证书签发签名证书
/opt/tongsuo/bin/tongsuo ca -batch -cert certs/subca/sm2.crt -config subca.
cnf -days 365 -extensions server_sign_req -in certs/server/sm2_sign.csr -ke
yfile certs/subca/sm2.key -md sm3 -notext -out certs/server/sm2_sign.crt

# ⽣成SM2加密私钥
/opt/tongsuo/bin/tongsuo genpkey -algorithm ec -out certs/server/sm2_enc.ke
y -pkeyopt "ec_paramgen_curve:sm2"
# ⽣成CSR
/opt/tongsuo/bin/tongsuo req -batch -config subca.cnf -key certs/server/sm2
_enc.key -new -nodes -out certs/server/sm2_enc.csr -sm3 -subj "/C=AB/ST=CD/
L=EF/O=GH/OU=IJ/CN=SERVER Enc SM2"
# 使⽤中间CA证书签发加密证书
/opt/tongsuo/bin/tongsuo ca -batch -cert certs/subca/sm2.crt -config subca.
cnf -days 365 -extensions "server_enc_req" -in certs/server/sm2_enc.csr -ke
yfile certs/subca/sm2.key -md sm3 -notext -out certs/server/sm2_enc.crt
  1. 签发自签证书
mkdir certs/selfsign-server
/opt/tongsuo/bin/tongsuo genpkey -algorithm ec -out certs/selfsign-server/cakey.pem -pkeyopt "ec_paramgen_curve:sm2"
/opt/tongsuo/bin/tongsuo req -x509 -new -key certs/selfsign-server/cakey.pem -out certs/selfsign-server/cacert.pem -days 3650 -sm3 
  1. 查看私钥和证书
/opt/tongsuo/bin/tongsuo pkey -in certs/server/sm2_sign.key -text -noout
/opt/tongsuo/bin/tongsuo x509 -in certs/server/sm2_sign.crt -text -noout

可以看到 tongsuo和openssl的命令参数是差不多的,但是还是存在部分差异,使用的时候需注意。

4. 国密传输协议实战

这部分学习内容主要是国密传输协议NTLS的实践

  1. 使⽤s_client命令⾏发起国密传输协议的握⼿
/opt/tongsuo/bin/tongsuo s_client -connect ebssec.boc.cn:443 -enable_ntls -ntls -trace
  1. 国密服务端和客户端demo

5. 铜锁应用示例

这部分内容主要了解了tongsuo在实际项目中的运用的示例。

  1. Tengine + 铜锁,搭建国密服务器
  2. MySQL国密改造,基于TLS 1.3 + 商密套件

写在最后

铜锁凭借自己完善的功能,在实际业务中的各种安全场景都可以得到大量运用,是个很不多的国产开源项目。
最后,个人对csdn组织这次训练营表示十分的感谢,经过学习,我掌握了基于Tongsuo的国密+TLS协议开发入门基础,扩宽了技术视野,受益匪浅。同时也感谢耐心讲解铜锁相关知识的各位技术前辈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baidu_26507163

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值