目前这边遇到一个问题,使用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";
}
}
尝试
-
通过抓包发现,在国密的 Client hello 中,Cipher Suites中有两个:0xe053和0xe013, 服务端回的 server hello 中使用了 e053 而使用 国密实验室 的 gmssl 和 nginx 时,国密双向成功了,而此时服务端回复的是e013,不知道是不是与此有关系 e053 没有找到确切是哪个密码套件,猜测可能是 ECC-SM4-GCM-SM3,我尝试在Tengine中禁用e053,但没有成功
-
过程中,还发现,在Tengine的 ssl_ciphers 配置里中,必须加入HIGH,否则无法在浏览器中弹出选择ukey证书的选项,客户端请求直接被拒绝,不知道Tengine这边为什么一定要这个
2022/2/17在国标《GB/T 38636-2020 信息安全技术传输层密码协议(TLCP)》中查到了,e013、e053分别为ECC-SM4-CBC-SM3、ECC-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)“,如果用法缺少,则会报错!