国密SSL协议之双证书体系

1 背景

国密SSL协议使用双证书体系。本文描述了国密双证书体系的组成和差别,并描述了在U盾里面的使用情况。

2 国密SSL双证书

国密SSL协议使用双证书体系,分别称为签名证书和加密证书,服务器和用户持有两对SM2独立的密钥对。其中加密证书和签名证书主要的区别就是密钥用法(KeyUsage)不一样(当然对应的密钥等也不一样),使用相同的DN。密钥用法具体是:

 

签名证书:Digital Signature, Non-Repudiation (c0)

 

加密证书:Key Encipherment, Data Encipherment, Key Agreement (38)

3 国密SSL加密证书的颁发流程

国密CA体系里面,加密密钥对是在CA端产生的,和通常的签名证书流程不一样(签名密钥对通常是用户自己产生的,发送证书请求给CA来申请证书)。

那用户怎么安全获得加密证书和私钥呢?国密规范规定,加密私钥需要通过数字信封使用用户的签名公钥加密。CA将加密私钥密文返回给用户,用户因为有对应的签名私钥,因此只有该用户才可以解开密文,获得加密私钥。过程如下:

1)用户使用U盾产生签名密钥对,生成签名证书请求,发送签名证书请求给CA;

2)CA审核生成签名证书,产生加密密钥对,生成加密证书;

3)CA生成对称密钥,使用用户签名公钥加密,输出对称密钥密文;

4)CA使用对称密钥,加密用户加密私钥,输出加密私钥密文;

5)CA返回给用户签名证书、加密证书、对称密钥密文和加密私钥密文;

6)用户导入对称密钥密文,使用U盾内部签名私钥解密,获得对称密钥句柄;

7)用户使用对称密钥句柄解密加密私钥,获得加密私钥明文。

用户使用SKF(U盾)接口时,6)和7)以及导入加密证书时,使用一个API一步完成的,所述过程是在U盾内部的处理。

4 国密U盾伴侣

目前大部分国密U盾的管理工具,并不支持国密证书请求产生和国密证书应答导入。www.GMSSL.cn提供一个《国密U盾辅助工具》,支持国密生成证书请求/导入证书应答操作。目前支持龙脉科技的mToken GM3000。

下载请参见https://www.gmssl.cn/gmssl/index.jsp?go=ukey

1)生成证书请求

 

2)提交签名证书请求给https://www.gmssl.cn/gmssl/index.jsp?go=ca

3)www.gmssl.cn生成签名证书/加密证书/加密私钥密文

4)导入证书应答

 

5 国密测试CA

www.GMSSL.cn提供一个国密测试CA。通过国密CA,配合国密U盾伴侣,可以给用户生成国密双证书,然后可以通过国密浏览器,就使用证书登录国密双向认证的网站了。

CA参见https://www.gmssl.cn/gmssl/index.jsp?go=ca

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
如果你想在 libcurl 中使用 gmSSL 进行向认证,可以按照以下步骤进行操作: 1. 生成服务器证书和私钥。可以使用 OpenSSL 工具生成证书和私钥。例如: ``` openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt ``` 2. 生成客户端证书和私钥。可以使用 OpenSSL 工具生成证书和私钥。例如: ``` openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr openssl x509 -req -days 365 -in client.csr -signkey client.key -out client.crt ``` 3. 将服务器证书和私钥放到服务器端,将客户端证书和私钥放到客户端。 4. 在服务器端,启动一个 HTTPS 服务器,并加载服务器证书和私钥。可以使用 OpenSSL 或其他 HTTP 服务器软件来实现。在这里,我们假设你已经启动了一个名为 `example.com` 的 HTTPS 服务器,并将服务器证书和私钥保存在 `server.crt` 和 `server.key` 文件中。 5. 在客户端,使用 libcurl 发起 HTTPS 请求,并加载客户端证书和私钥。可以使用以下代码来实现: ``` #include <curl/curl.h> #include <openssl/gmssl.h> int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, "ECDHE-ECDSA-AES128-GCM-SHA256"); curl_easy_setopt(curl, CURLOPT_CAINFO, "ca-bundle.crt"); curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.crt"); curl_easy_setopt(curl, CURLOPT_SSLKEY, "client.key"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; } ``` 在上面的示例代码中,我们使用了 `CURLOPT_SSLCERT` 和 `CURLOPT_SSLKEY` 选项来加载客户端证书和私钥。需要注意的是,客户端证书需要是 PEM 格式,并且需要包含完整的证书链。 同时,我们还设置了 `CURLOPT_CAINFO` 选项来加载根证书。如果根证书不在系统的默认位置,需要将其保存为 PEM 格式,并指定其路径。 需要注意的是,向认证需要在服务器端和客户端都进行配置,才能实现向认证的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值