GmSSL Build with VS2017

本文详细记录了GMSSL在Windows环境下32位编译的过程及遇到的问题,包括使用ActivePerl、NASM等工具的环境配置,以及解决编译错误的具体步骤。同时,文章提到了64位编译存在的问题。

转自:

最近研究GB35114, 有关于sip协议部分,exosip的已经编译过,由于gb3511中采用的是国密算法,因此这里记录一下GMSSL在windows下的编译过程以及遇到的错误, 32位已经ok,64位暂时不行,准备将错误提交作者。。。。

详细GMSSL的介绍见:http://gmssl.org/

 

根据文档说明,步骤如下:

在Window下的编译和安装

安装ActivePerl和Visual Studio,以管理员身份打开Visual Studio Tools下的Developer Command Prompt控制台并运行:

perl Configure VC-WIN32
nmake
nmake install

环境准备:
   1. ActivePerl: ActivePerl-5.28.1.0000-MSWin32-x64-432e1938.exe
   2. NASM: nasm-2.14.03rc2-installer-x64.exe

 

32位编译:

第一步便遇到了问题:  Can‘t locate Win32/Console.pm in @INC (you may need to install the Win32::Console module)

分享图片

 

解决: 自然想到是perl缺少Win32:Console module

网上搜索Win32:Console module perl module,其中看到perl的安装, cpan方式

perl -MCPAN -e shell

install Win32:Console

 

 

对照操作后,重新再来,发现dmake错误,又无法识别,继续搜索dmake...

继续各种查找,各种尝试,最终能真正work的方法是使用如下链接的site替换perl安装下的site目录。。。。。。

https://download.youkuaiyun.com/download/u011234288/10346624

 

解决此问题后

nmake

nmake install

就一路畅通

 

 

分享图片

注意,管理员权限安装

分享图片

 

分享图片

 

64位编译:

     由于文档上面介绍默认是32位的编译安装,64位可能会有问题,尝试一下,有问题提交作者,

config看看64位的 

perl Configure VC-WIN64A / VC-WIN64I 

貌似都有相同的错误,无法编译通过。。。。。。

 

 

 

        IF EXIST libcrypto-1_1-x64.dll.manifest DEL /F /Q libcrypto-1_1-x64.dll.manifest

        link /nologo /debug /dll  /implib:libcrypto.lib /out:libcrypto-1_1-x64.dll /def:libcrypto-1_1-x64.def @C:\Users\leehm\AppData\Local\Temp\nm7B43.tmp || (DEL /Q libcrypto.* libcrypto-1_1-x64.* && EXIT 1)

crypto\aes\aes_cfb.obj : fatal error LNK1112: module machine type ‘x86‘ conflicts with target machine type ‘x64‘

NMAKE : fatal error U1077: ‘link‘ : return code ‘0x1‘

Stop.

<think>我们需要使用GmSSL(支持国密算法的OpenSSL分支)的TLS协议接口,并结合curl实现双向认证。 双向认证意味着客户端和服务器都需要验证对方的证书。 步骤: 1. 生成国密SSL证书(包括CA证书、服务器证书和客户端证书)。 2. 配置服务器端使用GmSSL,并设置双向认证。 3. 使用curl客户端,指定客户端证书和私钥,并信任服务器证书(或CA证书)进行连接。 由于环境搭建较为复杂,这里我们重点放在如何使用curl(编译支持GmSSL的版本)进行双向认证。 注意:标准的curl可能不支持国密算法,因此我们需要重新编译curl以支持GmSSL。 一、生成国密证书(使用GmSSL生成) 为了演示,我们将简要说明如何生成证书(详细步骤可参考GmSSL文档): - 生成CA密钥和自签名证书 - 生成服务器密钥和证书请求,并由CA签名 - 生成客户端密钥和证书请求,并由CA签名 二、编译支持GmSSL的curl 需要从源码编译curl,并链接GmSSL库。 三、使用curl进行双向认证的请求 命令示例: curl --cacert ca-cert.pem --cert client-cert.pem --key client-key.pem https://example.com 但是,由于国密算法使用ECC和SM2、SM3、SM4等,且TLS协议采用国密套件(如ECC-SM2-SM4-CBC-SM3),我们需要确保curl使用的底层库(GmSSL)支持这些套件。 下面我们给出一个使用GmSSL生成证书的示例脚本,然后演示如何用curl(支持GmSSL)进行双向认证请求。 生成证书脚本(使用GmSSL命令): ```bash #!/bin/bash # 创建目录 mkdir -p gmssl/ca gmssl/server gmssl/client # 生成CA密钥和证书 gmssl sm2keygen -pass 1234 -out gmssl/ca/ca.key gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN CA -days 3650 -pass 1234 -key gmssl/ca/ca.key -out gmssl/ca/ca.crt -key_usage keyCertSign -key_usage cRLSign # 生成服务器密钥和证书请求 gmssl sm2keygen -pass 1234 -out gmssl/server/server.key gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN server -days 3650 -pass 1234 -key gmssl/server/server.key -out gmssl/server/server.req # CA签名服务器证书 gmssl reqsign -in gmssl/server/server.req -days 365 -cacert gmssl/ca/ca.crt -key gmssl/ca/ca.key -pass 1234 -out gmssl/server/server.crt -key_usage digitalSignature -key_usage keyEncipherment -key_usage keyAgreement # 生成客户端密钥和证书请求 gmssl sm2keygen -pass 1234 -out gmssl/client/client.key gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN client -days 3650 -pass 1234 -key gmssl/client/client.key -out gmssl/client/client.req # CA签名客户端证书 gmssl reqsign -in gmssl/client/client.req -days 365 -cacert gmssl/ca/ca.crt -key gmssl/ca/ca.key -pass 1234 -out gmssl/client/client.crt -key_usage digitalSignature -key_usage keyEncipherment -key_usage keyAgreement # 将客户端证书和私钥导出为pkcs12格式(可选,某些客户端可能需要) gmssl pkcs12 -export -in gmssl/client/client.crt -inkey gmssl/client/client.key -passin pass:1234 -passout pass:1234 -out gmssl/client/client.p12 ``` 四、配置服务器(例如Nginx支持GmSSL) 这里不详细展开,但需要将生成的服务器证书和密钥配置到服务器,并设置双向认证(要求客户端提供证书)。 五、使用curl进行双向认证 假设我们已经编译好了支持GmSSL的curl,并且服务器已经配置好。 调用curl的命令如下: ```bash curl --tlsv1.2 --cacert gmssl/ca/ca.crt --cert gmssl/client/client.crt --key gmssl/client/client.key https://your_server_address ``` 注意:由于国密TLS协议目前通常使用TLSv1.3,但国密标准中定义了基于SM2的TLS1.3套件。然而,GmSSL可能使用自己的扩展套件,因此可能需要指定密码套件。在curl中可以使用`--ciphers`选项指定。 例如,使用国密的ECC-SM2-SM4-CBC-SM3套件(具体套件名称根据GmSSL的命名): ```bash curl --tlsv1.2 --ciphers ECC-SM2-SM4-CBC-SM3 --cacert gmssl/ca/ca.crt --cert gmssl/client/client.crt --key gmssl/client/client.key https://your_server_address ``` 但是,请注意,curl的版本以及GmSSL的版本可能影响套件的可用性。另外,国密TLS1.3的套件可能还没有被curl的标准选项完全支持,因此可能需要使用GmSSL提供的特定选项。 六、关于编译curl支持GmSSL 这里给出简要步骤: 1. 安装GmSSL(从源码编译安装) 2. 下载curl源码 3. 配置curl以使用GmSSL: ./configure --with-ssl=/path/to/gmssl/install --prefix=$YOUR_INSTALL_PATH 4. make && make install 由于国密TLS协议的双向认证流程与普通TLS类似,只是使用了国密算法,因此curl的命令行参数基本相同。 重要:在双向认证中,服务器必须配置为要求客户端提供证书,客户端则需要提供证书和私钥,并且客户端必须信任服务器的CA(通过--cacert指定)。 以上是一个整体的流程,具体实施可能需要根据实际环境调整。 下面我们给出一个简单的C代码示例,使用GmSSL的SSL接口实现一个简单的客户端进行双向认证(但题目要求使用curl,所以这里主要说明curl的使用)。如果确实需要代码级别的双向认证,我们可以写一个简单的客户端程序,但题目要求是curl,所以这里就不再展开C代码。 但是,为了完整性,我们也可以简要展示一个使用GmSSL库的SSL客户端代码(可选),但题目要求是curl,所以这里我们专注于curl命令。 因此,回答的重点在于使用GmSSL生成证书,并编译支持GmSSL的curl,然后使用curl命令进行双向认证。 相关问题如下: </think>### 使用GmSSL的TLS协议接口+curl实现双向认证 #### 解决方案概述 要实现基于GmSSL的双向认证TLS连接,需要: 1. 生成国密算法证书(CA、服务端、客户端) 2. 配置支持GmSSL的curl 3. 发起双向认证HTTPS请求 下面是详细步骤和代码实现: --- ### 1. 生成国密证书链 使用GmSSL生成证书(需要先安装[GmSSL](https://github.com/guanzhi/GmSSL)): ```bash # 生成CA证书(SM2算法) gmssl sm2keygen -pass 1234 -out ca.key gmssl certgen -C CN -ST Beijing -L Haidian -O "GmSSL CA" -CN "Test CA" -days 3650 \ -key ca.key -pass 1234 -out ca.crt # 生成服务端证书 gmssl sm2keygen -pass 1234 -out server.key gmssl certreq -key server.key -pass 1234 -out server.csr -CN "server.example.com" gmssl certsign -in server.csr -cacert ca.crt -key ca.key -pass 1234 -out server.crt -days 365 # 生成客户端证书 gmssl sm2keygen -pass 1234 -out client.key gmssl certreq -key client.key -pass 1234 -out client.csr -CN "client-device" gmssl certsign -in client.csr -cacert ca.crt -key ca.key -pass 1234 -out client.crt -days 365 ``` --- ### 2. 编译支持GmSSL的curl ```bash # 安装依赖 sudo apt install build-essential nghttp2 libnghttp2-dev # 下载源码 git clone https://github.com/curl/curl.git cd curl # 配置支持GmSSL ./buildconf ./configure --with-ssl=/usr/local/gmssl --prefix=$HOME/gmcurl \ --with-default-ssl-backend=gmssl # 编译安装 make -j && make install ``` --- ### 3. 使用curl发起双向认证请求 ```bash # 设置环境变量 export PATH=$HOME/gmcurl/bin:$PATH # 发起HTTPS请求(双向认证) curl --tlsv1.2 --cacert ca.crt \ --cert client.crt --key client.key \ --cert-type SM2 --key-type SM2 \ --ciphers ECC-SM2-SM4-CBC-SM3 \ https://server.example.com:443/api ``` #### 参数说明: - `--cacert ca.crt`:指定信任的CA证书 - `--cert/client.key`:客户端证书和私钥 - `--cert-type/--key-type SM2`:指定国密算法类型 - `--ciphers ECC-SM2-SM4-CBC-SM3`:指定国密套件 - `--tlsv1.2`:明确使用TLS 1.2协议 --- ### 4. 服务端配置示例(Nginx+GmSSL) ```nginx server { listen 443 ssl; server_name server.example.com; # 国密证书配置 ssl_certificate /path/to/server.crt; ssl_certificate_key /path/to/server.key; ssl_client_certificate /path/to/ca.crt; # 客户端CA ssl_verify_client on; # 开启客户端验证 # 国密算法套件 ssl_ciphers ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-CBC-SM3; ssl_protocols TLSv1.2; location /api { proxy_pass http://backend; } } ``` --- ### 关键原理说明 1. **双向认证流程**: - 客户端验证服务器证书 - 服务器验证客户端证书 - 使用SM2进行密钥交换 - 使用SM4进行数据加密 - 使用SM3进行完整性校验 2. **国密算法优势**: - SM2:基于椭圆曲线的数字签名/密钥交换 - SM3:密码杂凑算法(类似SHA-256) - SM4:分组密码算法(类似AES) 3. **证书验证**: - 服务端证书包含`serverAuth`扩展 - 客户端证书包含`clientAuth`扩展 - CA证书需要被双方信任
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值