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:\MyProgramFiles\OpenSSLv1.0.2h --openssldir=C:\MyProgramFiles\OpenSSLv1.0.2h\SSL

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 Files\Common Files\SSL/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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM