Closed zhangshdn closed 11 months ago
老师,您看下这个问题,和咱们有关系吗 https://github.com/tjfoc/gmsm/issues/27
应该无关。 如果有这个问题的话,单向验证,也会失败吧。 而且,目前使用的证书应该都是用的默认ID。 由于TLS/TLCP没有为传递ID设计字段,所以现实的通信中,应该没办法支持使用非默认ID的证书签名。
您好,老师,我们尝试只修改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,先验证下加密公钥验签的正确性呢
你可以直接拉取master的代码,然后用IDE,如IDEA,打开这个Gradle工程。 然后在里面修改源代码,开发测试程序,然后直接在IDE中执行测试程序。 不过,开发过程中,需要使用OpenJDK,不能使用Oracle JDK。
尝试改了源码,然后启动,还是报这个错
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");
}
那还是得分析一下gmssl的源代码了。 毕竟,这是交互中的错误,只看一边也很难确定是什么问题。
再说了,如果确定了是gmssl的问题,那还不是要修改它的源代码。
嗯嗯,目前看来,这个问题https://github.com/guanzhi/GmSSL/issues/854 可能性比较大,我们尝试重新编译下
找了一圈,还是gmssl的问题 ;-D 这个项目完全没维护了,还是Tongsuo更合适 ;-)
感谢您给的宝贵意见,确实如您所说,gmssl在版本:GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019上确实存在问题,现在编译修改后的gmssl,TencentKonaSMSuite已经完美支持了
非常高兴你们终于解决了这个问题! 那我就关闭这个issue了。 如果有更多问题的话,欢迎提交新的issue。
感谢感谢,我将证书改成pkcs#8格式后,自签的证书和私钥也可以用了, 现在单向的我已经调通了,多谢多谢。 我现在在搞双向的认证,通过客户端发送请求后,服务端后台报错,您看我哪个地方除了问题,麻烦给指个方向吧 附上我现在用的证书和私钥 server_en_pkcs8.zip
看到您这里修改PKCS8#格式,已经调通了单向认证。这里我同样遇到了私钥解析失败的问题。 请问您这里通过GMSSL生成PKCS8#格式的私钥,是如何对GMSSL生成PKCS8#格式私钥的代码进行修改的呢?需要在代码中修改或增加什么内容呢? 我们这边现在的实现,也是使用GMSSL代码生成支持TLCP的证书和私钥。但是在客户端集成使用kona代码后,客户端通过loadPrivateKey方法加载使用GMSSL生成的私钥的时候,却报解析失败的错误;但是如果换成tongsuo生成的证书和私钥的时,却能正常使用。 我们现在该如何进行修改呢?看到您这边已经成功联通,希望您这边能指导一下,谢谢。
感谢感谢,我将证书改成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标准文件
感谢感谢,我将证书改成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标准文件
已解决上述遇到的问题,谢谢
感谢您给的宝贵意见,确实如您所说,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成功连通的呢?
感谢您给的宝贵意见,确实如您所说,gmssl在版本:GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019上确实存在问题,现在编译修改后的gmssl,TencentKonaSMSuite已经完美支持了
请问您是在gmssl上做了哪些修改后实现了双向认证
首先感谢提供国密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
困扰很长时间了,方便的时候给看看吧,感谢