编译使用win64版 TASSL1.1.1k
下载链接:TASSL-1.1.1k,然后解压。
OpenSSL是一套件开放源代码的安全套接字密码学基础库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL/TLS协议,并提供丰富的API,以供应用程序开发、测试或其它目的使用。它广泛地集成在各种类型的操作系统中,作为其基础组件之一,深爱广大IT爱好者的喜爱。即使用某些操作系统没有将其集成为组件,通过源代码下载,也是十分轻松地构建OpenSSL的开发及应用环境。
尽管OpenSSL的功能十分强大且丰富,然而对于中国商用密码体系的算法及相关应用来说,它距离我们还是十分遥远,因为它仅仅包含的国际通用的密码算法、认证体系及相关协议,却没有将中国商用密码体系中的公开算法SM2、SM3、SM4及祖冲之流密码算法纳入其中,也不支持双证书体系的应用及相关协议。这对于推广及研究中国商用密码体系的广大密码爱好者来说,却是十分无奈的事情。 国内也存在着不少密码界同仁,尝试着将OpenSSL国密化,但其大多都局限于公司内部交流使用,这对于国密SSL的推广不利。针对这种现状,北京江南天安公司经过长时间的研究分析,于2017年上半年推出天安版国密OpenSSL,也就是TASSL,解决了中国商用密码体系无法构建基于OpenSSL应用的实际问题。现以源码的形式提供出来,供大家参考使用,为促进国密的推广和应用贡献自己的一份力量。
解决方案:使用win下的MSYS2 MINGW64
1. 编译`TASSL1.1.1k源码
-
下载MSYS2
-
打开MSYS MINGW64
-
进入到TASSL目录下,执行指令
no-shared
生成静态库,shared
生成动态库 ,不指定同时生成动态库和静态库./config --prefix=/usr/local/out [no-shared或者shared]
注意:prefix一定要填写绝对路径
-
找到生成的
Makefile
文件,先执行make clean
,再运行make
命令
-
如果发现
make
命令不存在,执行语句pacman -S make
安装make-4.3-3-x86_64
-
如果发现
gcc
不存在,安装Mingw-w64 GCC
编译工具链,按照默认安装,直接回车,如果报错,多执行几次pacman -S --needed base-devel mingw-w64-x86_64-toolchain
- 安装好
gcc
后,执行gcc -v
可以查看安装的版本
- 此时,继续执行
make
,等待make
完毕,大概持续两分钟
- 执行
make install
指令,注意,这一步需要在MSYS2
系统目录创建一些文件夹,如果你的MSYS2
安装在系统盘,需要重新使用管理员打开MSYS2 MINGW64
,等待两分钟安装完毕,会安装到第三步指定的/usr/local/out
内,得到五个文件夹
- 查看
bin
目录下正确生成了openssl.exe
可执行文件
- 路径对应关系:
MSYS2
的安装路径是MSYS2 MINGW64
虚拟linux
的根目录。通过MSYS2
找到TASSL
的安装目录,注意这里MYSYS2
的安装目录是C:\msys64
,则/usr/local/out
对应到win10
的绝对路径为:C:\msys64\usr\local\out
- 查看安装完成的
win10
下文件夹,
- bin
文件夹下包含了openssl可执行文件,如果生成了动态库会包含libcrypto-1_1-x64.dll
、libssl-1_1-x64.dll
。如果仅仅生成了静态库,则只有openssl.exe
-
include
文件夹包含了生成的头文件
-
lib
文件夹包含了生成的动态库/静态库。如果生成静态库会生成[libssl.a、libcrypto.a]
,如果生成动态库会生成[libssl.dll.a、libcrypto.dll.a]
,这里需要注意的是,不要被后缀迷惑了,libssl.a等价于libssl.lib
-
简单说一下动态库和静态库的区别。
- 如果使用静态库,只需要用到
include
文件夹,以及[libssl.a、libcrypto.a]
,使用的时候,包含目录添加include
文件夹路径,附加库目录为[libssl.a、libcrypto.a]
的目录,然后附加依赖项添加[libssl.a、libcrypto.a]
这里两个名字。在生成可执行文件后,就会链接静态库,可以直接使用。 - 如果使用动态库,需要用到
include
文件夹,以及[libssl.dll.a、libcrypto.dll.a、libcrypto-1_1-x64.dll
、libssl-1_1-x64.dll]
,使用的时候,包含目录添加include
文件夹路径,附加库目录为[libssl.a、libcrypto.a]
的目录,然后附加依赖项添加[libssl.dll.a、libcrypto.dll.a]
这里两个名字。在生成可执行文件后,必须要在运行目录下添加[libcrypto-1_1-x64.dll
、libssl-1_1-x64.dll]
这两个动态库才能正常使用。
- 如果使用静态库,只需要用到
2.使用OPENSSL生成CA证书
使用管理员打开命令提示符,进入bin
目录,运行openssl
生成CA证书。
-
Step1:制作
ca.key
私钥(SM2算法加密)openssl ecparam -genkey -name SM2 -out ./myCert/ca/ca.key
- -genkey——生成密钥
- -name——指定生成密钥算法名称
- -out——输出文件的路径
-
Step2:制作生成CA证书请求
openssl req -new -key ./myCert/ca/ca.key -out ./myCert/ca/ca.csr -subj "/C=CN/ST=Hubei/L=Wuhan/O=HUST NCC/OU=NCLINK/CN=nclink.com/"
- req——执行证书签发命令
- -new——新证书签发请求
- -key——指定私钥路径
- -out——输出的csr文件的路径
- -subj——证书相关的用户信息(subject的缩写)
- 检查证书请求命令
openssl req -text -in ./myCert/ca.csr -noout
-
Step3:自签名得到根证书,注意这里也可以生成ca.crt文件。
openssl x509 -req -days 3650 -sm3 -extfile C:/msys64/usr/ssl/openssl.cnf -extensions v3_ca -signkey ./myCert/ca/ca.key -in ./myCert/ca/ca.csr -out ./myCert/ca/ca.crt Signature ok subject=C = CN, ST = Hubei, L = Wuhan, O = HUST NCC, OU = NCLINK, CN = nclink.com Getting Private key
3.使用OPENSSL生成服务器证书
在上一步生成的CA根证书的基础上,为服务器nclink.com
签名并颁发证书
注意:根证书的 Common Name(CN)不要和生成的证书CN一样,证书校验会出错
在./myCert
目录下创建文件夹server
存放服务器的证书
1. 生成服务器的签名证书
-
Step1:生成签名证书的私钥
SS_nclink.com.key
:openssl ecparam -genkey -name SM2 -out ./myCert/server/SS_nclink.com.key
-
Step2:生成签名证书的证书请求文件
SS_nclin.com.csr
openssl req -new -key ./myCert/server/SS_nclink.com.key -out ./myCert/server/SS_nclink.com.csr -subj "/C=CN/ST=Hubei/L=Wuhan/O=HUST NCC/OU=NCLINK/CN=nclink.com/"
-
Step3:使用根CA证书签发nclink.com的签名证书
SS_nclink.com.crt
openssl x509 -req -days 3650 -sm3 -extfile C:/msys64/usr/ssl/openssl.cnf -extensions v3_req -CA ./myCert/ca/ca.crt -CAkey ./myCert/ca/ca.key -CAserial ./myCert/ca.srl -CAcreateserial -in ./myCert/server/SS_nclink.com.csr -out ./myCert/server/SS_nclink.com.crt
-
Step4:校验证书
openssl verify -CAfile ./myCert/ca/ca.crt ./myCert/server/SS_nclink.com.crt
-
命令解释
-
-CA——指定CA证书的路径
-
-CAkey——指定CA证书的私钥路径
-
-CAserial——指定证书序列号文件的路径
-
-CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀,第一次创建证书需要使用该参数创建,此后不需要该参数
在x509指令中,有多重方式可以指定一个将要生成证书的序列号,可以使用set_serial选项来直接指定证书的序列号,也可以使用-CAserial选项来指定一个包含序列号的文件。所谓的序列号是一个包含一个十六进制正整数的文件,在默认情况下,该文件的名称为输入的证书名称加上.srl后缀,比如输入的证书文件为ca.cer,那么指令会试图从ca.srl文件中获取序列号,可以自己创建一个ca.srl文件,也可以通过-CAcreateserial选项来生成一个序列号文件。
注意:这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE;而前面生成根证书时,使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书。可以查看文件
/opt/local/ssl/openssl.cnf
[ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature [ v3enc_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = keyAgreement, keyEncipherment, dataEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = critical,CA:true
-
在server文件夹下得到三个文件
-
SS_nclink.com.key
服务器签名证书的SM2私钥文件 -
SS_nclink.com.csr
服务器签名证书的 请求文件 -
SS_nclink.com.crt
服务器的签名证书(经过CA私钥签名认证)
-
-
2. 生成服务器的加密证书
-
Step1:生成加密证书的私钥
SE_nclink.com.key
-
Step2:生成加密证书的证书请求文件
SE_nclink.com.csr
-
Step3:使用根证书CA签发服务器的加密证书
SE_nclink.com.crt
,注意这里的-extensions
参数使用的是v3enc_req
openssl ecparam -genkey -name SM2 -out ./myCert/server/SE_nclink.com.key openssl req -new -key ./myCert/server/SE_nclink.com.key -out ./myCert/server/SE_nclink.com.csr -subj "/C=CN/ST=Hubei/L=Wuhan/O=HUST NCC/OU=NCLINK/CN=nclink.com/" openssl x509 -req -days 3650 -sm3 -extfile ./openssl.cnf -extensions v3enc_req -CA ./myCert/ca/ca.crt -CAkey ./myCert/ca/ca.key -CAserial ./myCert/ca.srl -in ./myCert/server/SE_nclink.com.csr -out ./myCert/server/SE_nclink.com.crt
-
在server文件夹下增加了三个文件
SE_nclink.com.key
服务器签名证书的SM2私钥文件SE_nclink.com.csr
服务器签名证书的 请求文件SE_nclink.com.crt
服务器的签名证书(经过CA私钥签名认证)
3. 使用根证书校验服务器证书
-
验证证书出错
-
解决办法
我们在生成ca根证书时,Common Name 最好是有效根域名(如 openssl.com ), 并且不能和后来服务器证书签署请求文件中填写的 Common Name 完全一样,否则会导致证书生成的时候出现 上图错误。