OpenSSL和GmSSL tassl在Windows下编译 类似

OpenSSL和GmSSL在Windows下编译过程

本文用于记录GmSSL-2.0在Windows下的编译过程。
 
1,环境:Win7-x64,VS2015,编译WIN32库;
2,下载GmSSL-2.0源码;
3,编译:参考GmSSL官网编译说明,链接地址http://gmssl.org/docs/install.html
4,需要按照ActivePerl和NASM;
NASM下载地址:www.nasm.us,下载版本:nasm-2.13.03-installer-x64.exe
需要将NASM安装目录添加至Windows系统环境变量Path中
5,打开VS Tools中“VS2015 x86 本机工具命令提示符”提示符,切换至GmSSL目录;
6,执行perl Configure VC-WIN32 (perl Configure VC-WIN64A           参考VC-WIN64A-masm VC-WIN64I)
带调试的:
perl Configure  -DDEBUG -D_DEBUG -DOPENSSL_DEBUG_KEYGEN -DSSL_DEBUG -DALG_DEBUG -DCIPHER_DEBUG  -DTLS_DEBUG  -DKSSL_DEBUG no-asm TASSL_DEBUG debug-VC-WIN64A 
 --prefix=C:MyProgramFilesOpenSSLv1.0.2h --openssldir=C:MyProgramFilesOpenSSLv1.0.2hSSL

7,执行nmake

8,编译完成。nmake install 可以不执行。
参考:

Windows 10 x64 专业版 编译与测试【调试】Openssl【OpenSSL_1_0_2h】之 TLS

自建证书:https://blog.csdn.net/ljttianqin/article/details/73016014

 
本步骤同样适用与OpenSSL,已在OpenSSL-1.1.1-pre7版本上测试通过。
查看程序或动态库所依赖的动态库
dumpbin /dependents  abc.exe

查看动态库的输出函数
dumpbin /exports abc.dll

另一款查看动态库依赖的小工具depends,官网http://www.dependencywalker.com/
 
连接ssl网站测试:https://sm2test.ovssl.cn/
#下载第三方的最新的PEM(privacy-enhanced mail)格式的可信证书库
[root@localhost ~]# wget --no-check-certificate   https://curl.haxx.se/ca/cacert.pem

gmssl s_client -CAfile cacert.pem -connect sm2test.ovssl.cn:443 -debug -showcerts -msg

openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -msg

返回响应后,输入:

GET /   HTTP/1.1

支持协议测试:
openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -tls1_2
openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -tls1_1

查看协议
openssl ciphers -v
openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -cipher ECDHE-ECDSA-AES128-SHA256

测试会话复用:
openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -reconnect 2>/dev/null |grep -i 'new|reused'
如果支持复用,第二次链接就不是 New, 而是 reused 。不支持的复用的话,每次再连接都是 New。

测试OCSP stapling
[root@localhost ~]# openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -status

服务端自测:

证书产生 ~/mykey
gmssl ecparam -genkey -name sm2p256v1 -text -out zhibin.key gmssl req -new -key zhibin.key -out zhibin.req gmssl x509 -req -days 36500 -in zhibin.req -signkey zhibin.key -out zhibin_cert.pem -extfile certext.ext gmssl x509 -text -in zhibin_cert.pem gmssl s_server -key zhibin.key -cert zhibin_cert.pem -accept 443 -www
 ECDHE-SM4-SM3 套件,top1.1协议 下的双向验证测试方法。
  ./openssl s_client -connect 127.0.0.1:443 -cert cert/sm2/sm21.cer -key cert/sm2/sm21.key -CAfile cert/sm2/sm2root.cer -dcert cert/sm2/sm22.cer -dkey cert/sm2/sm22.key -cipher ECDHE-SM4-SM3 -top1.1
 ./openssl  s_server -cert cert/sm2/sm22.cer -key cert/sm2/sm22.key   -dcert cert/sm2/sm21.cer -dkey cert/sm2/sm21.key  -Verify 1  -CAfile cert/sm2/sm2root.cer   -port 443 -cipher ECDHE-SM4-SM3 -top1.1

本次实现的系统为 Linux环境,在Windows下的 gmssl 安装应该也差不多,所以环境影响不大。

(openssl.cnf默认配置在C:Program FilesCommon FilesSSL/openssl.cnf,设置ca库的主目录:dir = ./ # Where everything is kept。这个当前目录指运行gmssl的目录。

下面的执行都在 demoCA目录下。

用参数 -config ../ssl/openssl.cnf 重新指定配置位置。

创建过程中需要进行交互式填写信息:()

1). 国家:CN 两位国家代码(可以在openssl.cnf设置默认值)

2). 省份:beijing

3).   市: beijing

4). 公司:Client.Co

5). 部门:RD

6). 名字:www.client.com      #非常重要,一定要有一致。

7). 联系:test@client.com    #测试使用

8). 密码:#将申请文件加密

####################################################################
[ ca ]
default_ca  = CA_default        /*The default ca section*/
####################################################################
[ CA_default ]
 
dir     = /home/lt/demoCA    /* Where everything is kept */
                         /*  #### 这是第一个openssl目录结构中的目录 */
certs       = $dir/certs /* Where the issued certs are kept(已颁发的证书路径,即CA或自签的) */
                         /* #### 这是第二个openssl目录结构中的目录,但非必须 */
crl_dir     = $dir/crl   /* Where the issued crl are kept(已颁发的crl存放目录) */
                         /*  #### 这是第三个openssl目录结构中的目录*/
database    = $dir/index.txt /* database index file */
#unique_subject = no     /* 设置为yes则database文件中的subject列不能出现重复值 */
                         /* 即不能为subject相同的证书或证书请求签名*/
                         /* 建议设置为no,但为了保持老版本的兼容性默认是yes */
new_certs_dir = $dir/newcerts /* default place for new certs(将来颁发的证书存放路径) */
                             /* #### 这是第四个openssl目录结构中的目录 */
certificate = $dir/cacert.pem  /* The A certificate(CA自己的证书文件) */
serial      = $dir/serial      /* The current serial number(提供序列号的文件)*/
crlnumber   = $dir/crlnumber   /* the current crl number(当前crl序列号) */
crl     = $dir/crl.pem         /* The current CRL(当前CRL) */
private_key = $dir/private/cakey.pem  /* The private key(签名时需要的私钥,即CA自己的私钥) */
RANDFILE    = $dir/private/.rand      /* private random number file(提供随机数种子的文件) */
x509_extensions = usr_cert  /* The extentions to add to the cert(添加到证书中的扩展项) */
/* 以下两行是关于证书展示格式的,虽非必须项,但推荐设置。一般就如下格式不用修改 */
name_opt    = ca_default        /* Subject Name options*/
cert_opt    = ca_default        /* Certificate field options */
/* 以下是copy_extensions扩展项,需谨慎使用 */
# copy_extensions = copy  /* 生成证书时扩展项的copy行为,可设置为none/copy/copyall */
                          /* 不设置该name时默认为none */
                          /* 建议简单使用时设置为none或不设置,且强烈建议不要设置为copyall */
# crl_extensions    = crl_ext
default_days    = 365   /* how long to certify for(默认的证书有效期) */
default_crl_days= 30    /* how long before next CRL(CRL的有效期) */
default_md  = default   /* use public key default MD(默认摘要算法) */
preserve    = no        /* keep passed DN ordering(Distinguished Name顺序,一般设置为no */
                        /* 设置为yes仅为了和老版本的IE兼容)*/
policy      = policy_match /* 证书匹配策略,此处表示引用[ policy_match ]的策略 */
/* 证书匹配策略定义了证书请求的DN字段(field)被CA签署时和CA证书的匹配规则 */
/* 对于CA证书请求,这些匹配规则必须要和父CA完全相同 */
[ policy_match ]
countryName = match     /* match表示请求中填写的该字段信息要和CA证书中的匹配 */
stateOrProvinceName = match
organizationName    = match
organizationalUnitName  = optional  /* optional表示该字段信息可提供可不提供 */
commonName      = supplied    /* supplied表示该字段信息必须提供 */
emailAddress        = optional
/* For the 'anything' policy*/
/* At this point in time, you must list all acceptable 'object' types. */
 
/* 以下是没被引用的策略扩展,只要是没被引用的都是被忽略的 */
[ policy_anything ]
countryName     = optional
stateOrProvinceName = optional
localityName        = optional
organizationName    = optional
organizationalUnitName  = optional
commonName      = supplied
emailAddress        = optional 
/* 以下是添加的扩展项usr_cert的内容*/
[ usr_cert ]
basicConstraints=CA:FALSE   /* 基本约束,CA:FALSE表示该证书不能作为CA证书,即不能给其他人颁发证书*/
/* keyUsage = critical,keyCertSign,cRLSign  # 指定证书的目的,也就是限制证书的用法*/
/* 除了上面两个扩展项可能会修改下,其余的扩展项别管了,如下面的 */
nsComment  = "OpenSSL Generated Certificate" 
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
####################################################################

1.根CA的生成
系统建立CA时,需要先在离线状态下建立一个根CA。根CA所需要的文件夹有certs(证书文件夹)、crl(吊销数据文件夹)、newcerts(新生成的证书文件夹)、private(私有数据文件夹)。同时还需要在本地生成数据记录文件index.txt, index.txt.attr,用以记录对证书的操作,需要初始化设定序列号。

执行的初始化操作如下:

mkdir certs clr newcerts private 
touch index.txt

touch index.txt.attr

echo “01” > serial
 随后,便可以生成根 CA 的 sm2 公私钥对,使用命令如下,生成的密钥文件为 root-cakey.pem

gmssl ecparam -genkey -name sm2p256v1  -text -out private/root-cakey.pem -config ../ssl/openssl.cnf  #生成私钥

然后,生成根 CA 的证书请求。使用的算法为 sm3 签名算法,生成的证书请求为 root-cacsr.pem.

gmssl req -new -sm3 -key private/root-cakey.pem -out root-cacsr.pem  #生成证书请求 cert sign request。
最后让根 CA 对自己的证书请求进行自签名生成证书文件,生成的证书有效期为365天,证书文件名称为 root-cacert.pem。

gmssl req -x509 -sm3 -days 365 -key private/root-cakey.pem -out root-cacert.pem   #生成自签名证书文件。
生成的根CA证书信息如下,我们可以看到该证书的公私钥为SM2算法生成,对证书的签名算法采用SM3。证书的发布者和证书主体信息一致,说明该证书是由自签名生成。

gmssl x509 -text  -noout -in root-cacert.pem 

       到此,根CA建立完成,可为二级CA的证书进行签发。

2. 二级 CA 的生成
二级CA生成SM2公私钥的命令为,使用的算法为sm2。生成的密钥文件为sub-cakey.pem。

gmssl ecparam -genkey -name sm2p256v1 -out private/sub-cakey.pem
生成证书请求的命令为,使用的签名算法为sm3。生成的证书请求为sub-cacsr.pem。

gmssl req  -new -sm3 -key private/sub-cakey.pem -out sub-cacsr.pem  (-batch 会按照openssl.cnf的隐含值填入。小心和自己输入的不一致。)
根CA生成二级CA证书命令如下,使用sm3算法。生成的二级CA证书名称为sub-cacert.pem。

gmssl ca -md sm3 -extensions v3_ca -in sub-cacsr.pem -out newcerts/sub-cacert.pem -days 365 -cert root-cacert.pem -keyfile ./private/root-cakey.pem #生成由root ca签名的二级证书。
生成的二级CA证书如下图所示,可以看到证书的发布者信息与根CA信息一致,说明该证书由根CA签发。同时该证书主体信息与我们管理界面输入的信息一致。 

        自此,一个二级CA的初始化已经完成。

3.用户证书的签发
用户私钥对生成:

gmssl ecparam -genkey -name sm2p256v1 -out thirdkey.pem
用户证书请求生成:

gmssl req -new -sm3 -key thirdkey.pem -out thirdcsr.pem
随后二级CA签发用户证书请求:

gmssl ca -md sm3 -extensions v3_ca -in thirdcsr.pem -out thirdcert.pem -days 365 -cert newcerts/sub-cacert.pem -keyfile private/sub-cakey.pem
生成的用户证书如下:

4. 证书吊销
吊销用户证书如下,所示:

openssl ca -keyfile ./private/sub-cakey.pem -cert ./sub-cacert.pem -revoke thirdcert.pem
吊销之后的index.txt的内容变化如下图所示,可以看到证书的状态从已经验证状态“V”转换到已经吊销状态“R”。

5,验证:

openssl verify -CAfile ca.crt server.crt 

1.https://github.com/guanzhi/GmSSL下载源码,解压后到源码目录下执行以下命令:
  ./config
  make
  make install   //必须安装,否则后续执行gmssl会因为打开openssl.cnf出错。gmssl内部处理问题
2.证书生成准备:
  cd apps/demoCA/
  mkdir certs crl newcerts private
  touch index.txt
  echo "01" > serial
3.生成根证书:
  gmssl ecparam -genkey -name sm2p256v1 -text -out Root.key  #生成私钥
  gmssl req -new -key Root.key -out Root.req  #证书请求
  gmssl x509 -req -days 3650 -sm3 -in Root.req -signkey Root.key -out RootCA.crt #生成根证书
4.生成服务端证书
  gmssl ecparam -genkey -name sm2p256v1 -text -out Server.key  #生成私钥
  gmssl req -new -key Server.key -out Server.req  #证书请求
  gmssl x509 -req -sm3 -days 3650 -CA RootCA.crt -CAkey Root.key -CAcreateserial -in Server.req -out ServerCA.crt #签发证书
  mssl verify -CAfile RootCA.crt ServerCA.crt #证书验证
  gmssl x509 -in ServerCA.crt -text -noout #查看证书
5.生成客户端证书
  gmssl ecparam -genkey -name sm2p256v1 -text -out Client.key  #生成私钥
  gmssl req -new -key Client.key -out Client.req  #证书请求
  gmssl x509 -req -sm3 -days 3650 -CA RootCA.crt -CAkey Root.key -CAcreateserial -in Client.req -out ClientCA.crt #签发证书
  gmssl verify -CAfile RootCA.crt ClientCA.crt #证书验证
  gmssl x509 -in ClientCA.crt -text -noout #查看证书
6.客户端/服务端通信验证
  gmssl s_server -accept *:443 -key Server.key -cert ServerCA.crt  -dkey Server.key -dcert ServerCA.crt -CAfile RootCA.crt -msg -debug -gmtls #服务端
  gmssl s_client -connect localhost:443 -key Client.key -cert ClientCA.crt -CAfile RootCA.crt -msg -debug -gmtls#客户端
  -servername 双证书:这个其实是有漏洞的,必须先设置签名证书。。然后才是加密证书

测试不通(去掉 -gmtls可以通。可以加上参数: -cipher ECDHE-SM2-WITH-SMS4-GCM-SM3 )。参见:https://blog.csdn.net/tmaccs/article/details/103293957
1. error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher:ssl/statem/statem_srvr.c:1502:

2. 140616840058688:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl/record/rec_layer_s3.c:1385:SSL alert number 40
    ---
    no peer certificate available
    ---
    No client certificate CA names sent
————————————————
版权声明:本文为CSDN博主「敬致知」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tmaccs/article/details/103293957

 下面是官方示例成功,socket通信:

gmssl s_server -port 443 -cipher SM2  -key Server.key -cert ServerCA.crt -www 
gmssl s_server -port 443 
 -cipher ECDHE-SM2-WITH-SMS4-GCM-SM3 -key Server.key -cert ServerCA.crt  -www

gmssl s_client -connect localhost:443  -CAfile ClientCA.crt

注:由于使用gmtls时,gmssl内部要求服务指定双证书(签名证书和加密证书),此处使用同一个证书ServerCA.crt
————————————————

gmssl对国标支持

gmssl ciphers -V |grep GMTLS
0xE0,0x17 - SM9-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM9 Au=SM9 Enc=SMS4(128) Mac=SM3
0xE0,0x15 - SM9DHE-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM9DHE Au=SM9 Enc=SMS4(128) Mac=SM3
0xE0,0x13 - SM2-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM2 Au=SM2 Enc=SMS4(128) Mac=SM3
0xE0,0x11 - SM2DHE-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM2DHE Au=SM2 Enc=SMS4(128) Mac=SM3
0xE0,0x1A - RSA-WITH-SMS4-SHA1 GMTLSv1.1 Kx=RSA Au=RSA Enc=SMS4(128) Mac=SHA1
0xE0,0x19 - RSA-WITH-SMS4-SM3 GMTLSv1.1 Kx=RSA Au=RSA Enc=SMS4(128) Mac=SM3

 

OpenSSL命令---s_client
用途:

s_client为一个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进行通信,也能与任何使用ssl协议的其他服务程序进行通信。

用法:

openssl s_client [-host host] [-port port] [-connect host:port] [-verify depth] [-cert filename]
[-certform DER|PEM] [-key filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename]
[-reconnect][-pause] [-showcerts] [-debug] [-msg] [-state] [-nbio_test] [-nbio][-crlf] [-ign_eof] [-no_ign_eof]
[-quiet] [-ssl2] [-ssl3] [-tls1_1] [-tls1_2] [-tls1] [-dtls1] [-no_ssl2][-no_ssl3] [-no_tls1] [-no_tls1_1]
[-no_tls1_2] [-bugs] [-cipher cipherlist] [-starttls protocol] [-engine id] [-tlsextdebug] [-no_ticket]
[-sess_out filename] [-sess_in filename] [-rand file(s)]
选项说明:

-host host:设置服务地址。

-port port:设置服务端口,默认为4433。

-connect host:port:设置服务器地址和端口号。如果没有设置,则默认为本地主机以及端口号4433。

-verify depth:设置证书的验证深度。记得CA也是分层次的吧?如果对方的证书的签名CA不是Root CA,那么你可以再去验证给该CA的证书签名的CA,一直到Root CA. 目前的验证操作即使这条CA链上的某一个证书验证有问题也不会影响对更深层的CA的身份的验证。所以整个CA链上的问题都可以检查出来。当然CA的验证出问题并不会直接造成连接马上断开,好的应用程序可以让你根据验证结果决定下一步怎么走。

-cert filename:使用的证书文件。如果server不要求要证书,这个可以省略。

-certform DER|PEM:证书的格式,一般为DER和PEM。默认为PEM格式。

-key filename:使用的证书私钥文件。

-keyform DER|PEM:证书私钥文件的格式,一般为DER和PEM。默认为PEM格式。

-pass arg:私钥保护口令来源,比如:-pass file:pwd.txt,将私钥保护口令存放在一个文件中,通过此选项来指定,不需要用户来输入口令。

-CApath directory:设置信任CA文件所在路径,此路径中的ca文件名采用特殊的形式:xxx.0,其中xxx为CA证书持有者的哈希值,它通过x509 -hash命令获得。

-CAfile filename:某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。

-reconnect:使用同样的session-id连接同一个server五次,用来测试server的session缓冲功能是否有问题。

-pause:每当读写数据时,sleep 1秒。

-showcerts:显示整条server的证书的CA的证书链。否则只显示server的证书。

-debug:打印所有的调试信息。

-msg:用16进制显示所有的协议数据。

-state:打印SSL session的状态, ssl也是一个协议,当然有状态。

-nbio_test:检查非阻塞socket的I/O运行情况。

-nbio:使用非阻塞socket。

-crlf:把在终端输入的换行回车转化成/r/n送出去。

-ign_eof:当输入文件到达文件尾的时候并不断开连接。

-no_ign_eof:当输入文件到达文件尾的时候断开连接。

-quiet:不打印出session和证书的信息。同时会打开-ign_eof这个选项。

-ssl2、-ssl3、-tls1_1、-tls1_2、-tls1、-dtls1、-no_ssl2、-no_ssl3、-no_tls1、-no_tls1_1、-no_tls1_2:使用的协议状态值。

-bugs:兼容老版本服务端的中的bug。

-cipher cipherlist:由我们自己来决定选用什么加密算法,尽管是由server来决定使用什么算法列表,但它一般都会采用我们送过去的cipher列表里的第一个cipher。

-starttls protocol:protocol可以为smtp或pop3,用于邮件安全传输。

-engine id:硬件引擎。

-tlsextdebug:打印TLS协议中服务器端接收到的额外信息值。

-no_ticket:不支持RFC4507bis会话类型。

-sess_out filename:输出SSL会话信息值到filename中。

-sess_in filename:从filename中获取SSL Session值。

-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。

连接选项:

如果一个确认的连接到SSL服务器,并显示了从服务器端接收到了的数据,任何操作都被发送到服务器。当交互(这意味着没有给出B<-quiet> 、B<-ign_eof>这两个选项)的时候,如果命令行B<R>,被设置则session有可能会被重启。如果设置的是命令行B<Q>或到达了文件的结尾,连接将会被断开。

注意:

S_client可用于调试SSL服务器端。为了连接一个SSL HTTP服务器,命令如下:

openssl s_client -connect servername:443

一旦和某个SSL server建立连接之后,所有从server得到的数据都会被打印出来,所有你在终端上输入的东西也会被送给server. 这是人机交互式的。这时候不能设置-quiet和 -ign_eof这俩个选项。如果输入的某行开头字母是R,那么在这里session会重启, 如果输入的某行开头是Q,那么连接会被断开。你完成整个输入之后连接也会被断开。

如果连接成功,你可以用HTTP的指令,比如"GET /"什么的去获得网页了。

如果握手失败,原因可能有以下几种:

1.          server需要验证你的证书,但你没有证书。

2.          如果肯定不是原因1,那么就慢慢一个一个set以下几个选项:-bugs, -ssl2, -ssl3, -tls1,-no_ssl2,-no_ssl3, -no_dtls。

3.          这可能是因为对方的server处理SSL有bug。

有的时候,client会报错:没有证书可以使用,或者供选择的证书列表是空的。这一般是因为Server没有把给你签名的CA的名字列进它自己认为可以信任的CA列表,你可以用检查一下server的信任CA列表。有的http server只在 client给出了一个URL之后才验证client的证书,这中情况下要设置 -prexit这个选项,并且送给server一个页面请求。

即使使用-cert指明使用的证书,如果server不要求验证client的证书,那么该证书也不会被验证。所以不要以为在命令行里加了-cert 的参数又连接成功就代表你的证书没有问题。

如果验证server的证书有问题,就可以设置-showcerts来看看server的证书的CA链了。

自从SSLv23客户端hello不能够包含压缩方法或扩展仅仅会被支持。

BUGs:

因为该项目有很多选项,好多用的是老的技术,c代码的s_client很难去读取为什么会被关闭。一个典型的SSL客户端项目将会更加简单的。

如果服务器验证失败,B<-verify>将会退出。

B<-prexit>选项是一个很小的空间。当一个session重启后,我们必须报告。
————————————————
版权声明:本文为CSDN博主「卢队长」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/as3luyuan123/article/details/16812071

OpenSSL 1.1.1 国密SM2 SM3 SM4 SM9 ZUC EEA3 EIA3 SM2 +SM3签名 源码 Demo 下载 OpenSSL iOS端库下载

最近因为需要研究国密,所以寻找加密库,demo就很重要了,这里记录下。

直接进入正文,附上OpenSSL GitHub官网的下载地址,最新的已经支持国密了。
https://github.com/openssl/openssl

进入GitHub 下载OpenSSL demo,你会发现移动端 安卓,iOS的库呢?What F ?

网上找了很多,最新的基本没有。基本需要自己编译OpenSSL,这个过程很痛苦,你可以试试!

最后我用了一个大神的脚本,胜利解决打包成libcrypto.a libssl.a 文件,支持armv7,arm64,armv7s,i386,x86_64,附上大神GitHub链接
https://github.com/x2on/OpenSSL-for-iPhone

这里还有个插曲,以前用过支付宝里的OpenSSL,来进行RSA签名,验证签名,加解密。最近下了SDK发现最新的阿里支付SDK没找到SM2文件。于是又断了一条路。(其实OpenSSL提供一些编译指令,可以摒弃一些无用的算法,比如no sm2.这样减少libssl,libcrypto包大小)

库有了,查看SM2,SM3,SM4 加密OpenSSL的代码,发现很好很强大
/*
SM2 signature generation. Assumes input is an SM3 digest
*/
int SM2_sign(int type, const unsigned char *dgst, int dgstlen,
unsigned char *sig, unsigned int *siglen, EC_KEY *eckey);

/*
*SM2 signature verification. Assumes input is an SM3 digest
*/
int SM2_verify(int type, const unsigned char *dgst, int dgstlen,
const unsigned char *sig, int siglen, EC_KEY *eckey);

int SM2_encrypt(const EC_KEY *key,
const EVP_MD *digest,
const uint8_t *msg,
size_t msg_len,
uint8_t *ciphertext_buf, size_t *ciphertext_len);

int SM2_decrypt(const EC_KEY *key,
const EVP_MD *digest,
const uint8_t *ciphertext,
size_t ciphertext_len, uint8_t *ptext_buf, size_t *ptext_len);

每个参数没有备注,就问你怕不怕。API的话,你可以去
https://www.feistyduck.com/library/openssl-cookbook/
没账号的话,需要注册登录。注册腾讯邮箱可以,新浪邮箱半天都没收到确认链接。然后可以下载,或者在线查看相关英文Api。然后呢发现没有SM2 Api的(可能我方法有误,你可以找找,目前还在摸着石头过河中)。

OpenSS库,说完了。说说SM2,SM3,SM4 加解密。网上代码层出不穷,可是能用的没有几个。好不容易能用了,然后各种加密解密不成功,或者签名,验证签名失败。只能自己慢慢摸索了,好不容易搞通了加解密,签名和验证签名。这里附上demo的链接。

iOS demo SM2,SM4 加密算法,SM2+SM3签名
https://download.csdn.net/download/asia_zhangqq/10835061

OpenSSl 支持国密 1.1.1版本 iOS打包最新版本,支持armv7,arm64,armv7s,i386,x86_64
https://download.csdn.net/download/asia_zhangqq/10835116

最后奉上最新研究国密大招,包含SM2加解密,SM2+SM3 签名,验证签名,SM4加解密,ZUC包括EEA3 EIA3加密。同时兼容armv7,arm64,armv7s,i386,x86_64架构。以下链接是demo地址。
https://download.csdn.net/download/asia_zhangqq/10922992

奉上最新的SM9算法。代码是基于GMSSL的国密SM9算法。包括签名,密钥交换,加密,解密。demo直接运行就可以,有相关测试数据。
https://download.csdn.net/download/asia_zhangqq/10925337

看到这里你可能纳闷,OpenSSL的SM9国密算法呢,不好意思还没有。所以采用GMSSL的SM9来代替。但是这个库编译armv7,arm64,armv7s,i386,x86_64架构也有一序列问题。
这里是官网http://gmssl.org。一直维护更新在。
然后issue的话你可以看GMSSL的git官网问题,目前遇到卡住问题就在issue里的。
https://github.com/guanzhi/GmSSL这是GMSSL的github链接
————————————————
版权声明:本文为CSDN博主「Asia_ZhangQQ」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Asia_ZhangQQ/article/details/84876111


Yes, I mean a .gn file. Which .gn file depends on what you're adding and who needs to call it.

 
For example, if you wanted to add the ability to use OpenSSL instead of BoringSSL, you'd need to (a) write a build file for OpenSSL, (b) find all of the places in the current build files that reference targets in //third_party/boringssl, and change them to refer to your new OpenSSL targets in your new file.
 
On the other hand, if you wanted to do something like replace our use of //third_party/modp_b64 with a new library that has a Base64 implementation, modp_b64 is *only* referenced from //base/BUILD.gn, so you could probably just modify the //base/BUILD.gn library to link in your new .a (if you had it prebuilt), or you could write a target to build your new library from scratch and just put it in //base/BUILD.gn rather than creating a new file.
原文地址:https://www.cnblogs.com/bigben0123/p/12650545.html