alibaba / tengine

A distribution of Nginx with some advanced features
https://tengine.taobao.org
BSD 2-Clause "Simplified" License
12.82k stars 2.52k forks source link

如何使用Tengine+BabaSSL实现国密双证的双向认证 #1608

Open DayDreamPeter opened 2 years ago

DayDreamPeter commented 2 years ago

问题

目前这边遇到一个问题,使用Tengine+BabaSSL实现国密单向认证是成功的,但在实现国密双向认证时,报错:ERR_SSL_PROTOCOL_ERROR 我的双向配置如下:

server {
    listen       6444 ssl;
    server_name  localhost;

    enable_ntls  on;
    ssl_sign_certificate        /opt/babassl_tengine/smcert/sm2.10.1.30.63.sig.crt.pem;
    ssl_sign_certificate_key    /opt/babassl_tengine/smcert/sm2.10.1.30.63.sig.key.pem;
    ssl_enc_certificate         /opt/babassl_tengine/smcert/sm2.10.1.30.63.enc.crt.pem;
    ssl_enc_certificate_key     /opt/babassl_tengine/smcert/sm2.10.1.30.63.enc.key.pem;

    ssl_trusted_certificate     /opt/babassl_tengine/smcert/sd_sm2.pem;
    ssl_client_certificate      /opt/babassl_tengine/smcert/sd_sm2.pem;
    ssl_verify_client on;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers HIGH:ECC-SM4-CBC-SM3:ECDHE-SM4-GCM-SM3:!aNULL:!MD5;

    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers  on;

    location / {
        root   /opt/svs/admin/dist;
        index  index.html index.htm;
    }

    location /test {
       return 200 "body cert:$ssl_client_cert,$ssl_protocol:$ssl_cipher";
    }
}

尝试

  1. 通过抓包发现,在国密的 Client hello 中,Cipher Suites中有两个:0xe053和0xe013, 服务端回的 server hello 中使用了 e053 而使用 国密实验室gmsslnginx 时,国密双向成功了,而此时服务端回复的是e013,不知道是不是与此有关系 e053 没有找到确切是哪个密码套件,猜测可能是 ECC-SM4-GCM-SM3,我尝试在Tengine中禁用e053,但没有成功

  2. 过程中,还发现,在Tengine的 ssl_ciphers 配置里中,必须加入HIGH,否则无法在浏览器中弹出选择ukey证书的选项,客户端请求直接被拒绝,不知道Tengine这边为什么一定要这个

如何配置才能实现国密双向认证,希望得到大佬的解答!感谢!!!

更新

2022/2/17

在国标《GB/T 38636-2020 信息安全技术传输层密码协议(TLCP)》中查到了,e013、e053分别为ECC-SM4-CBC-SM3ECC-SM4-GCM-SM3 编写客户端测试程序,客户端用两个加密套件分别测试,都测试通过了!之前一直是通过奇安信的安全浏览器,选择ukey证书进行的测试,目前还是失败,是因为服务端要求发送双证吗?国密实验室的是客户端发送单证也能允许,不知道Tengine有没有配置控制可以只发送单证,目前ukey中只有单证,没有双证的ukey可以测试,也不知道奇安信的安全浏览器能否发送双证

2022/2/18

通过各种尝试,搞到了有两个证书的ukey,使用奇安信的安全浏览器,实现了国密双证双向认证!!!

但过程中也发现了问题,使用 https://gmcert.org/ 申请的证书就能成功,但用自己签出的证书,报错,http错误码495 SSL Certificate Error, 最后对比两个证书,发现在“密钥用法”中,加密证书必须为“Key Encipherment, Data Encipherment, Key Agreement (38)”,签名证书必须为“Digital Signature, Non-Repudiation (c0)“,如果用法缺少,则会报错!

DayDreamPeter commented 2 years ago

记录一下! 还有就是,Tengine是否有参数控制,国密单证也能通过双向认证?是否合规?

chobits commented 2 years ago

cc @dongbeiouba

InfoHunter commented 2 years ago

还有就是,Tengine是否有参数控制,国密单证也能通过双向认证?是否合规?

TLCP不允许单证书形式,如果你是需要在实现TLCP的过程中,还兼容客户端只有一个证书的情况,那原则上是不合规的

yonglezhu commented 1 year ago

我的客户端证书是双证,加密证书的用途是Key Encipherment, Data Encipherment (30),签名证书的用途是Digital Signature, Non-Repudiation (c0),tengine+tongsuo无法认证,厂商的国密ssl网关可以认证,而且同时支持rsa客户端证书认证