Tencent / TencentKonaSMSuite

Tencent Kona SM Suite contains a set of Java security providers, which support algorithms SM2, SM3 and SM4, and protocols TLCP/GMSSL, TLS 1.3 (with RFC 8998) and TLS 1.2.
Other
363 stars 73 forks source link

请问是否支持gmssl项目 #559

Closed zhangshdn closed 11 months ago

zhangshdn commented 11 months ago

首先感谢提供国密ssl的支持! 我利用项目中netty的例子TLCPWithNettyDemo启动了一个tcp服务器,监听端口18888,然后为了测试服务,我使用gmssl中提供的客户端工具gmssl s_client -connect localhost:18888,连接至服务端,但是gmssl客户端报错:Secure Renegotiation IS NOT supported

服务端报错: Received fatal alert: internal_error

第二个问题,我使用gmssl签双证书证书,获得了服务端加密,签名证书,CA根证书,通过 gmssl s_server -port 18888 -key server.key -cert server.crt -dkey server_en.key -dcert server_en.crt -CAfile root.crt 启动一个服务端,这样可以启动成功,通过gmssl s_client -connect localhost:18888也能连接成功,但是将证书内容写入TLCPWithNettyDemo例子后,启动客户端runClient,不能连接gmssl s_server

困扰很长时间了,方便的时候给看看吧,感谢

johnshajiang commented 11 months ago

老师,您看下这个问题,和咱们有关系吗 https://github.com/tjfoc/gmsm/issues/27

应该无关。 如果有这个问题的话,单向验证,也会失败吧。 而且,目前使用的证书应该都是用的默认ID。 由于TLS/TLCP没有为传递ID设计字段,所以现实的通信中,应该没办法支持使用非默认ID的证书签名。

zhangshdn commented 11 months ago

您好,老师,我们尝试只修改TLCPCertificateVerify这个类,但是发现kona-ssl-1.0.10.jar已经签了名,无法修改,尝试拉取tag1.0.10代码后,源码打jar,打出来的kona-ssl-1.0.10.jar直接使用,又报

java.security.NoSuchAlgorithmException: TlcpMasterSecret KeyGenerator not available

错误,有没有什么办法,我先改了这个TLCPCertificateVerify,先验证下加密公钥验签的正确性呢

johnshajiang commented 11 months ago

你可以直接拉取master的代码,然后用IDE,如IDEA,打开这个Gradle工程。 然后在里面修改源代码,开发测试程序,然后直接在IDE中执行测试程序。 不过,开发过程中,需要使用OpenJDK,不能使用Oracle JDK。

zhangshdn commented 11 months ago

尝试改了源码,然后启动,还是报这个错

com.tencent.kona.ssl|FINE|01|nioEventLoopGroup-3-1|2023-11-23 11:38:51.105 CST|SM2ClientKeyExchange.java:248|Consuming SM2 ClientKeyExchange handshake message (
"SM2 ClientKeyExchange": {
  "client_version":  TLCPv1.1
  "encncrypted": {
    0000: 30 81 99 02 20 3A FE 91   6A 1F CC C8 14 22 AC 13  0... :..j...."..
    0010: 37 A8 A4 CD FB 03 E5 A7   9E CC 65 9B CF F3 FC 6D  7.........e....m
    0020: B9 15 EB CF 13 02 21 00   D9 65 5C 3C F0 66 74 84  ......!..e\<.ft.
    0030: A9 2C B4 4B DD 47 BC 63   E8 43 82 29 45 43 A6 B3  .,.K.G.c.C.)EC..
    0040: 1B 70 05 61 1F 6F D1 4E   04 20 A5 64 20 7C DE 51  .p.a.o.N. .d ..Q
    0050: 49 AF 73 5D 1B 44 C4 29   CE 1A E0 AF 15 6A 6D A9  I.s].D.).....jm.
    0060: 52 72 98 D7 6B 1D 4D 99   89 10 04 30 06 65 89 D9  Rr..k.M....0.e..
    0070: 69 93 E8 49 19 18 9B BB   3A DB 95 7D 07 D4 32 40  i..I....:.....2@
    0080: 04 4A 11 05 13 1C AA A5   5F CC 28 FE 1A 7E 3D A1  .J......_.(...=.
    0090: 8C 44 A5 A6 EA E4 32 5A   91 4E 9B FB              .D....2Z.N..
  }
}
)
com.tencent.kona.ssl|FINE|01|nioEventLoopGroup-3-1|2023-11-23 11:38:51.155 CST|SSLEngineInputRecord.java:177|Raw read (
  0000: 16 01 01 00 4D 0F 00 00   49 00 47 30 45 02 20 6B  ....M...I.G0E. k
  0010: DB 46 5A 38 D3 5D 05 0B   7C 8B 0C 3A ED 64 C8 BD  .FZ8.].....:.d..
  0020: 33 08 FB F8 49 93 2D EB   63 52 79 B5 FA 03 B2 02  3...I.-.cRy.....
  0030: 21 00 B3 10 AD B2 C7 F9   02 10 53 20 91 2B CC 21  !.........S .+.!
  0040: FB 4B E8 DD 32 5B 95 0A   19 21 2A A4 5B DA 00 93  .K..2[...!*.[...
  0050: B5 75                                              .u
)
com.tencent.kona.ssl|FINE|01|nioEventLoopGroup-3-1|2023-11-23 11:38:51.156 CST|SSLEngineInputRecord.java:214|READ: TLCPv1.1 handshake, length = 77
com.tencent.kona.ssl|SEVERE|01|nioEventLoopGroup-3-1|2023-11-23 11:39:53.010 CST|TransportContext.java:370|Fatal (HANDSHAKE_FAILURE): Invalid CertificateVerify signature (
"throwable" : {
  javax.net.ssl.SSLHandshakeException: Invalid CertificateVerify signature
    at com.tencent.kona.sun.security.ssl.Alert.createSSLException(Alert.java:131)
    at com.tencent.kona.sun.security.ssl.Alert.createSSLException(Alert.java:117)
    at com.tencent.kona.sun.security.ssl.TransportContext.fatal(TransportContext.java:365)
    at com.tencent.kona.sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
    at com.tencent.kona.sun.security.ssl.TransportContext.fatal(TransportContext.java:312)
    at com.tencent.kona.sun.security.ssl.TLCPCertificateVerify$TLCPCertificateVerifyMessage.<init>(TLCPCertificateVerify.java:164)
    at com.tencent.kona.sun.security.ssl.TLCPCertificateVerify$TLCPCertificateVerifyConsumer.consume(TLCPCertificateVerify.java:293)
    at com.tencent.kona.sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:464)
    at com.tencent.kona.sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:502)
    at com.tencent.kona.sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1277)
    at com.tencent.kona.sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1263)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.tencent.kona.sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1208)
    at io.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:1642)
    at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1488)
    at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1329)
    at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1378)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:750)}

)

源码修改

Signature signer = SignatureScheme.SM2SIG_SM3.getVerifier(
                        tlcpCredentials.popSignPublicKey,
                        new SM2SignatureParameterSpec(
                                Constants.defaultId(),
                                // (ECPublicKey) tlcpCredentials.popSignPublicKey));
                                (ECPublicKey) tlcpCredentials.popEncPublicKey));

                signer.update(shc.handshakeHash.digest());
                if (!signer.verify(signature)) {
                    throw shc.conContext.fatal(Alert.HANDSHAKE_FAILURE,
                            "Invalid CertificateVerify signature");
                }
johnshajiang commented 11 months ago

那还是得分析一下gmssl的源代码了。 毕竟,这是交互中的错误,只看一边也很难确定是什么问题。

再说了,如果确定了是gmssl的问题,那还不是要修改它的源代码。

zhangshdn commented 11 months ago

嗯嗯,目前看来,这个问题https://github.com/guanzhi/GmSSL/issues/854 可能性比较大,我们尝试重新编译下

johnshajiang commented 11 months ago

找了一圈,还是gmssl的问题 ;-D 这个项目完全没维护了,还是Tongsuo更合适 ;-)

zhangshdn commented 11 months ago

感谢您给的宝贵意见,确实如您所说,gmssl在版本:GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019上确实存在问题,现在编译修改后的gmssl,TencentKonaSMSuite已经完美支持了

johnshajiang commented 11 months ago

非常高兴你们终于解决了这个问题! 那我就关闭这个issue了。 如果有更多问题的话,欢迎提交新的issue。

Paranoid-L commented 10 months ago

感谢感谢,我将证书改成pkcs#8格式后,自签的证书和私钥也可以用了, 现在单向的我已经调通了,多谢多谢。 我现在在搞双向的认证,通过客户端发送请求后,服务端后台报错,您看我哪个地方除了问题,麻烦给指个方向吧 附上我现在用的证书和私钥 server_en_pkcs8.zip

看到您这里修改PKCS8#格式,已经调通了单向认证。这里我同样遇到了私钥解析失败的问题。 请问您这里通过GMSSL生成PKCS8#格式的私钥,是如何对GMSSL生成PKCS8#格式私钥的代码进行修改的呢?需要在代码中修改或增加什么内容呢? 我们这边现在的实现,也是使用GMSSL代码生成支持TLCP的证书和私钥。但是在客户端集成使用kona代码后,客户端通过loadPrivateKey方法加载使用GMSSL生成的私钥的时候,却报解析失败的错误;但是如果换成tongsuo生成的证书和私钥的时,却能正常使用。 我们现在该如何进行修改呢?看到您这边已经成功联通,希望您这边能指导一下,谢谢。

zhangshdn commented 10 months ago

感谢感谢,我将证书改成pkcs#8格式后,自签的证书和私钥也可以用了, 现在单向的我已经调通了,多谢多谢。 我现在在搞双向的认证,通过客户端发送请求后,服务端后台报错,您看我哪个地方除了问题,麻烦给指个方向吧 附上我现在用的证书和私钥 server_en_pkcs8.zip

看到您这里修改PKCS8#格式,已经调通了单向认证。这里我同样遇到了私钥解析失败的问题。 请问您这里通过GMSSL生成PKCS8#格式的私钥,是如何对GMSSL生成PKCS8#格式私钥的代码进行修改的呢?需要在代码中修改或增加什么内容呢? 我们这边现在的实现,也是使用GMSSL代码生成支持TLCP的证书和私钥。但是在客户端集成使用kona代码后,客户端通过loadPrivateKey方法加载使用GMSSL生成的私钥的时候,却报解析失败的错误;但是如果换成tongsuo生成的证书和私钥的时,却能正常使用。 我们现在该如何进行修改呢?看到您这边已经成功联通,希望您这边能指导一下,谢谢。

您好,gmssl默认生成的私钥是PKCS#1, 您可以尝试使用命令 gmssl pkcs8 -topk8 -in root.key -out root8.key -nocrypt 转为PKCS#8标准文件

Paranoid-L commented 10 months ago

感谢感谢,我将证书改成pkcs#8格式后,自签的证书和私钥也可以用了, 现在单向的我已经调通了,多谢多谢。 我现在在搞双向的认证,通过客户端发送请求后,服务端后台报错,您看我哪个地方除了问题,麻烦给指个方向吧 附上我现在用的证书和私钥 server_en_pkcs8.zip

看到您这里修改PKCS8#格式,已经调通了单向认证。这里我同样遇到了私钥解析失败的问题。 请问您这里通过GMSSL生成PKCS8#格式的私钥,是如何对GMSSL生成PKCS8#格式私钥的代码进行修改的呢?需要在代码中修改或增加什么内容呢? 我们这边现在的实现,也是使用GMSSL代码生成支持TLCP的证书和私钥。但是在客户端集成使用kona代码后,客户端通过loadPrivateKey方法加载使用GMSSL生成的私钥的时候,却报解析失败的错误;但是如果换成tongsuo生成的证书和私钥的时,却能正常使用。 我们现在该如何进行修改呢?看到您这边已经成功联通,希望您这边能指导一下,谢谢。

您好,gmssl默认生成的私钥是PKCS#1, 您可以尝试使用命令 gmssl pkcs8 -topk8 -in root.key -out root8.key -nocrypt 转为PKCS#8标准文件

已解决上述遇到的问题,谢谢

MiRaIOMeZaSu commented 10 months ago

感谢您给的宝贵意见,确实如您所说,gmssl在版本:GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019上确实存在问题,现在编译修改后的gmssl,TencentKonaSMSuite已经完美支持了

您好,请问您是在GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019版本的基础上做了哪些修改后能通过TencentKonaSMSuite成功连通的呢?

Gaozp18410026550 commented 2 months ago

感谢您给的宝贵意见,确实如您所说,gmssl在版本:GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019上确实存在问题,现在编译修改后的gmssl,TencentKonaSMSuite已经完美支持了

请问您是在gmssl上做了哪些修改后实现了双向认证