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
319 stars 68 forks source link

Received fatal alert: handshake_failure #769

Open yaoyaoadzz opened 2 months ago

yaoyaoadzz commented 2 months ago

您好,请问我想自签名的ca证书去进行单向认证,测试一下java客户端和jetty服务端的连接,我的证书生成过程是这样的,都是使用的kona工具去执行的命令,生成两个密钥对分别是ca.ks的server.ks,用ca.ks和server.ks分别生成csr, java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyTool -genkeypair -keystore ca.ks -storetype PKCS12 -storepass 000000 -keyalg EC -groupname curveSM2 -sigalg SM3withSM2 -dname CN=ca -alias ca -validity 2838605 执行后返回如下 Generating 256 bit EC (curveSM2) key pair and self-signed certificate (SM3withSM2) with a validity of 2,838,605 days for: CN=ca

java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyTool -genkeypair -keystore server.ks -storetype PKCS12 -storepass 000000 -keyalg EC -groupname curveSM2 -sigalg SM3withSM2 -dname CN=ca -alias server -validity 2838605 执行后返回如下 Generating 256 bit EC (curveSM2) key pair and self-signed certificate (SM3withSM2) with a validity of 2,838,605 days for: CN=ca 我又用ca.ks生成了ca.crt证书和server.crt证书 生成ca.crt java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyTool -certreq -keystore ca.ks -storetype PKCS12 -storepass 000000 -alias ca -file ca.csr

java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyTool -gencert -rfc -keystore ca.ks -storetype PKCS12 -storepass 000000 -sigalg SM3withSM2 -alias ca -infile ca.csr -outfile ca.crt

生成server.crt java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyTool -certreq -keystore server.ks -storetype PKCS12 -storepass comstar -alias server -file server.csr

java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyTool -gencert -rfc -keystore ca.ks -storetype PKCS12 -storepass comstar -sigalg SM3withSM2 -alias ca -infile server.csr -outfile server.crt 然后我分别将ca.crt导入clientTrust.keystore java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias ca -certs ca.crt -store clientTrust.keystore -storePasswd 000000 将server.crt导入server.keystore中 java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias ca -certs server.crt -store server.keystore -storePasswd 000000 然后我在kona里面的TLCPWithHttpClientDemo代码作为参考,分别写了服务端和客户端的代码,修改了获取keystore的代码,因为我的keystore使用的kona工具生成的,所以我直接加载了我生成的keystore,指定了路径 private static SSLContext createContext() throws Exception { // Load trust store KeyStore trustStore = KeyStore.getInstance("PKCS12", "KonaPKIX"); try (FileInputStream keyStoreIn = new FileInputStream( TRUSTSTORE.toFile())) { trustStore.load(keyStoreIn, PASSWORD.toCharArray()); }

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX", "KonaSSL");
    tmf.init(trustStore);

    // Load key store
    KeyStore keyStore = KeyStore.getInstance("PKCS12", "KonaPKIX");
    try (FileInputStream keyStoreIn = new FileInputStream(
            KEYSTORE.toFile())) {
        keyStore.load(keyStoreIn, PASSWORD.toCharArray());
    }
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509", "KonaSSL");
    kmf.init(keyStore, PASSWORD.toCharArray());

    SSLContext context = SSLContext.getInstance("TLCPv1.1", "KonaSSL");
    context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
    return context;
}
服务端启动后,客户端再启动,会报错,标题就是报错的信息,我不是很懂为什么,请大佬指点!
如果是证书生成过程有问题,能告知一下如何去生成吗?非常感谢!
johnshajiang commented 2 months ago

能否打印详细的日志? 在java命令中加入系统属性-Dcom.tencent.kona.ssl.debug=all

yaoyaoadzz commented 2 months ago

您好,日志信息在附件里面,麻烦您帮忙看一下,谢谢! 日志信息.zip

johnshajiang commented 2 months ago

看起来是没有找到适用的证书。 能把测试证书也发过来吗?

yaoyaoadzz commented 2 months ago

您好,生成的证书过程中的文件以及导入证书的keystore文件都在附件里面了,麻烦您看一下,谢谢!storepass都是comstar 证书.zip

yaoyaoadzz commented 2 months ago

我用的kona是1.0.9版本的

johnshajiang commented 2 months ago
 % tongsuo x509 -text -in server.crt 
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 5685693034726256289 (0x4ee7a3b0e4c56ea1)
        Signature Algorithm: SM2-with-SM3
        Issuer: CN = ca
        Validity
            Not Before: Apr 20 12:42:52 2024 GMT
            Not After : Jul 19 12:42:52 2024 GMT
        Subject: CN = ca
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:ce:e0:91:3b:1f:2d:1a:ec:39:d4:a5:1f:bd:06:
                    87:2d:cd:3f:e6:35:28:90:33:a1:3a:47:ff:f9:94:
                    0a:7c:c6:89:30:7b:ee:ee:36:81:33:e1:ac:c5:20:
                    16:9d:80:be:8b:d1:02:91:77:07:74:04:7e:98:80:
                    11:88:ec:6b:01
                ASN1 OID: SM2
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                E4:D8:92:EB:5F:43:F9:A9:ED:DE:36:04:5F:7A:F5:2B:DA:CC:0C:4E
            X509v3 Authority Key Identifier: 
                6D:1E:B3:8D:C4:C4:4E:B7:5D:9B:C1:3F:2E:5D:56:B3:1C:9E:2D:27
    Signature Algorithm: SM2-with-SM3
    Signature Value:
        30:45:02:20:42:d3:4d:90:22:93:0b:28:55:9b:92:a5:db:9a:
        82:0d:20:ca:bd:2e:96:98:3e:97:e6:4b:40:c3:e4:81:0b:32:
        02:21:00:f7:f1:b5:f6:5f:b6:e1:55:0d:5a:a8:10:ff:f0:6a:
        09:a6:2f:18:cb:c3:84:e4:2f:a9:1c:54:51:12:cf:2e:ad
-----BEGIN CERTIFICATE-----
MIIBUTCB+KADAgECAghO56Ow5MVuoTAKBggqgRzPVQGDdTANMQswCQYDVQQDEwJj
YTAeFw0yNDA0MjAxMjQyNTJaFw0yNDA3MTkxMjQyNTJaMA0xCzAJBgNVBAMTAmNh
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEzuCROx8tGuw51KUfvQaHLc0/5jUo
kDOhOkf/+ZQKfMaJMHvu7jaBM+GsxSAWnYC+i9ECkXcHdAR+mIARiOxrAaNCMEAw
HQYDVR0OBBYEFOTYkutfQ/mp7d42BF969SvazAxOMB8GA1UdIwQYMBaAFG0es43E
xE63XZvBPy5dVrMcni0nMAoGCCqBHM9VAYN1A0gAMEUCIELTTZAikwsoVZuSpdua
gg0gyr0ulpg+l+ZLQMPkgQsyAiEA9/G19l+24VUNWqgQ//BqCaYvGMvDhOQvqRxU
URLPLq0=
-----END CERTIFICATE-----

我只看了上面这个server证书,但TLCP需要两个证书:认证证书和加密证书。 而且这个证书还没有Key Usage扩展。没有这个扩展,将无法判断这个证书的用途(身份认证;数据加密)。

请参考下面的测试证书: 认证证书:https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/tlcp/tlcp-server-sign.crt

X509v3 Key Usage: critical
        Digital Signature

加密证书:https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/tlcp/tlcp-server-enc.crt

X509v3 Key Usage: critical
        Key Encipherment, Data Encipherment, Key Agreement
johnshajiang commented 2 months ago

我用的kona是1.0.9版本的

上周刚刚发布了1.0.12,建议更新到最新版本上。

另外,生成国密证书时,建议使用铜锁/Tongsuo,它是OpenSSL的一个变体。 可以参考下面脚本中的命令, https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/gen_tlcp_certs.sh

yaoyaoadzz commented 2 months ago
 % tongsuo x509 -text -in server.crt 
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 5685693034726256289 (0x4ee7a3b0e4c56ea1)
        Signature Algorithm: SM2-with-SM3
        Issuer: CN = ca
        Validity
            Not Before: Apr 20 12:42:52 2024 GMT
            Not After : Jul 19 12:42:52 2024 GMT
        Subject: CN = ca
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:ce:e0:91:3b:1f:2d:1a:ec:39:d4:a5:1f:bd:06:
                    87:2d:cd:3f:e6:35:28:90:33:a1:3a:47:ff:f9:94:
                    0a:7c:c6:89:30:7b:ee:ee:36:81:33:e1:ac:c5:20:
                    16:9d:80:be:8b:d1:02:91:77:07:74:04:7e:98:80:
                    11:88:ec:6b:01
                ASN1 OID: SM2
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                E4:D8:92:EB:5F:43:F9:A9:ED:DE:36:04:5F:7A:F5:2B:DA:CC:0C:4E
            X509v3 Authority Key Identifier: 
                6D:1E:B3:8D:C4:C4:4E:B7:5D:9B:C1:3F:2E:5D:56:B3:1C:9E:2D:27
    Signature Algorithm: SM2-with-SM3
    Signature Value:
        30:45:02:20:42:d3:4d:90:22:93:0b:28:55:9b:92:a5:db:9a:
        82:0d:20:ca:bd:2e:96:98:3e:97:e6:4b:40:c3:e4:81:0b:32:
        02:21:00:f7:f1:b5:f6:5f:b6:e1:55:0d:5a:a8:10:ff:f0:6a:
        09:a6:2f:18:cb:c3:84:e4:2f:a9:1c:54:51:12:cf:2e:ad
-----BEGIN CERTIFICATE-----
MIIBUTCB+KADAgECAghO56Ow5MVuoTAKBggqgRzPVQGDdTANMQswCQYDVQQDEwJj
YTAeFw0yNDA0MjAxMjQyNTJaFw0yNDA3MTkxMjQyNTJaMA0xCzAJBgNVBAMTAmNh
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEzuCROx8tGuw51KUfvQaHLc0/5jUo
kDOhOkf/+ZQKfMaJMHvu7jaBM+GsxSAWnYC+i9ECkXcHdAR+mIARiOxrAaNCMEAw
HQYDVR0OBBYEFOTYkutfQ/mp7d42BF969SvazAxOMB8GA1UdIwQYMBaAFG0es43E
xE63XZvBPy5dVrMcni0nMAoGCCqBHM9VAYN1A0gAMEUCIELTTZAikwsoVZuSpdua
gg0gyr0ulpg+l+ZLQMPkgQsyAiEA9/G19l+24VUNWqgQ//BqCaYvGMvDhOQvqRxU
URLPLq0=
-----END CERTIFICATE-----

我只看了上面这个server证书,但TLCP需要两个证书:认证证书和加密证书。 而且这个证书还没有Key Usage扩展。没有这个扩展,将无法判断这个证书的用途(身份认证;数据加密)。

请参考下面的测试证书: 认证证书:https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/tlcp/tlcp-server-sign.crt

X509v3 Key Usage: critical
        Digital Signature

加密证书:https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/tlcp/tlcp-server-enc.crt

X509v3 Key Usage: critical
        Key Encipherment, Data Encipherment, Key Agreement

请问这个key usage扩展是在命令中指定的参数吗?还是说可以自动生成?

yaoyaoadzz commented 2 months ago

我用的kona是1.0.9版本的

上周刚刚发布了1.0.12,建议更新到最新版本上。

另外,生成国密证书时,建议使用铜锁/Tongsuo,它是OpenSSL的一个变体。 可以参考下面脚本中的命令, https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/gen_tlcp_certs.sh

好的,谢谢提醒,后面会更新到最新的版本,我先把这个当前的问题搞明白了,也就是说,tlcp是双证书的,我需要生成自签名的ca证书之后,还需要生成两个用ca.ks私钥签名的证书一个指定为认证证书,一个指定为加密证书吗?

johnshajiang commented 2 months ago

请问这个key usage扩展是在命令中指定的参数吗?还是说可以自动生成?

如果使用Tongsuo的话,可以在指定的扩展文件中定义,如下 https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/gen_tlcp_certs.sh#L49 https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-ssl/src/test/resources/gen_tlcp_certs.sh#L57

johnshajiang commented 2 months ago

tlcp是双证书的,我需要生成自签名的ca证书之后,还需要生成两个用ca.ks私钥签名的证书一个指定为认证证书,一个指定为加密证书吗?

是的。

yaoyaoadzz commented 2 months ago

tlcp是双证书的,我需要生成自签名的ca证书之后,还需要生成两个用ca.ks私钥签名的证书一个指定为认证证书,一个指定为加密证书吗?

是的。

好的,我去试一下,谢谢您!

yaoyaoadzz commented 2 months ago

您好,我看了一下脚本文件,其中有这行命令 $OPENSSL genpkey -algorithm ec -pkeyopt ec_paramgen_curve:SM2 -pkeyopt ec_param_enc:named_curve -out tlcp-ca.key 但是我是用kona的参考文档里面的keytool生成的ca.ks密钥对文件,请问这两者有什么联系吗?我可以将ca.ks转换为tlcp-ca.key吗?还有个问题我不太理解,就是这里的genpkey的pkey是“public key”公钥还是"private key"私钥?我认为应该是私钥吧?是不是这里私钥就够用,因为可以通过算法用私钥获取到公钥,我这么理解的对吗?其实整个过程中我们只需要关注私钥就好了,在获取证书的过程中,公钥已经在工具内部通过私钥去获取,然后做了处理了,对于使用者而言不需要去关心这个是吗?谢谢!

johnshajiang commented 2 months ago

但是我是用kona的参考文档里面的keytool生成的ca.ks密钥对文件,请问这两者有什么联系吗?我可以将ca.ks转换为tlcp-ca.key吗?

你可以从keystore文件中提取私钥和证书。

关于keytool的使用,请参考JDK的文档 https://docs.oracle.com/en/java/javase/21/docs/specs/man/keytool.html

另外,有一个快速的参考 https://stackoverflow.com/questions/46567394/how-to-add-multiple-key-usages-to-a-certificate-when-using-java-keytool

还有个问题我不太理解,就是这里的genpkey的pkey是“public key”公钥还是"private key"私钥?我认为应该是私钥吧?是不是这里私钥就够用,因为可以通过算法用私钥获取到公钥,我这么理解的对吗?其实整个过程中我们只需要关注私钥就好了,在获取证书的过程中,公钥已经在工具内部通过私钥去获取,然后做了处理了,对于使用者而言不需要去关心这个是吗?

是的,私钥是首要的,公钥可以从它推导出来。

yaoyaoadzz commented 2 months ago

但是我是用kona的参考文档里面的keytool生成的ca.ks密钥对文件,请问这两者有什么联系吗?我可以将ca.ks转换为tlcp-ca.key吗?

你可以从keystore文件中提取私钥和证书。

关于keytool的使用,请参考JDK的文档 https://docs.oracle.com/en/java/javase/21/docs/specs/man/keytool.html

另外,有一个快速的参考 https://stackoverflow.com/questions/46567394/how-to-add-multiple-key-usages-to-a-certificate-when-using-java-keytool

还有个问题我不太理解,就是这里的genpkey的pkey是“public key”公钥还是"private key"私钥?我认为应该是私钥吧?是不是这里私钥就够用,因为可以通过算法用私钥获取到公钥,我这么理解的对吗?其实整个过程中我们只需要关注私钥就好了,在获取证书的过程中,公钥已经在工具内部通过私钥去获取,然后做了处理了,对于使用者而言不需要去关心这个是吗?

是的,私钥是首要的,公钥可以从它推导出来。

好的,非常感谢!

yaoyaoadzz commented 2 months ago

您好,我已经使用openssl生成了server-sign.crt和server.enc.crt,并将这两个证书导入了服务端的server.keystore中,将自签名的ca证书导入了客户端的trust.keystore中,然后启动服务端和客户端还是握手失败,请问我是不是还需要把sign和enc的私钥一起导入到服务端的server.keystore中?如果是的话,请问我该如何将server-sign.key和server-enc.key导入到服务端的server.keystore中?我找了一段时间没有找到合适的办法,可以麻烦您提供一下思路吗?谢谢!

yaoyaoadzz commented 2 months ago

我使用keystoretool的命令 java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias server-sign -key server-sign.key -store server.keystore 会报错,是不是生成的.key文件不是PKCS12格式的?请问是什么格式的呢?

johnshajiang commented 2 months ago

会报错,

那是什么错呢?

是不是生成的.key文件不是PKCS12格式的?请问是什么格式的呢?

.key应该是PKCS#8格式。PKCS#12是针对key store文件,与key和证书无关。

johnshajiang commented 2 months ago

关于KeyStoreTool的用法,建议看看KeyStoreToolTest中的示例,比如, https://github.com/Tencent/TencentKonaSMSuite/blob/master/kona-pkix/src/test/java/com/tencent/kona/pkix/tool/KeyStoreToolTest.java#L151

yaoyaoadzz commented 2 months ago

您好,非常感谢您这么晚还帮忙解决问题,我刚坐地铁回到家,日志和证书在附件里面,麻烦您抽空帮忙看一下,感谢 日志信息.zip

johnshajiang commented 2 months ago

上面的日志信息.zip中只有证书,而没有私钥。 另外,在输出日志时,最好是为java命令加上系统属性-Dcom.tencent.kona.ssl.debug=all。 这样可以打印出握手过程的详细信息。

yaoyaoadzz commented 2 months ago

上面的日志信息.zip中只有证书,而没有私钥。 另外,在输出日志时,最好是为java命令加上系统属性-Dcom.tencent.kona.ssl.debug=all。 这样可以打印出握手过程的详细信息。

抱歉,昨天我回家用家里的电脑试的,那台电脑忘记配系统属性了,我重新生成了一份,麻烦您帮忙看一下,谢谢。 日志+文件.zip

johnshajiang commented 2 months ago

需要了解你的测试程序...怀疑server没有加载到证书。

yaoyaoadzz commented 2 months ago

您好,测试程序放在附件里了,麻烦帮忙看一下 kona_demo (2).zip 服务端启动类是ServerJetty,客户端启动类是KonaSslContextUtil

yaoyaoadzz commented 2 months ago

kona_demo (3).zip 这个是参考kona的TLCPWithHttpClientDemo这个写的,能麻烦帮忙一起看一下吗?谢谢

johnshajiang commented 2 months ago

可能是由于server.keystore中没有私钥。 KeyStore(非TrustStore)包含的是私钥以及与该私钥关联的证书链。

将server.crt导入server.keystore中
java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias ca -certs server.crt -store server.keystore -storePasswd 000000

上面的命令中还需要指定私钥。请参考KeyStoreToolTest.java中的示例,

String[] signArgs = new String[] {
        "-type", type,
        "-alias", signAlias,
        "-keyAlgo", "EC",
        "-key", signKeyPath, // This private key is not encrypted
        "-keyPasswd", "signkeypass",
        "-certs", signCertChainPath,
        "-store", storePath.toString(),
        "-storePasswd", storePasswd };
yaoyaoadzz commented 2 months ago

可能是由于server.keystore中没有私钥。 KeyStore(非TrustStore)包含的是私钥以及与该私钥关联的证书链。

将server.crt导入server.keystore中
java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias ca -certs server.crt -store server.keystore -storePasswd 000000

上面的命令中还需要指定私钥。请参考KeyStoreToolTest.java中的示例,

String[] signArgs = new String[] {
        "-type", type,
        "-alias", signAlias,
        "-keyAlgo", "EC",
        "-key", signKeyPath, // This private key is not encrypted
        "-keyPasswd", "signkeypass",
        "-certs", signCertChainPath,
        "-store", storePath.toString(),
        "-storePasswd", storePasswd };

您好,我导入证书的命令中使用-key指定了私钥 java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias sign -key server-sign.key -certs server-sign.crt -store server.keystore -storePasswd comstar

java -cp kona-crypto-1.0.9.jar;kona-pkix-1.0.9.jar com.tencent.kona.pkix.tool.KeyStoreTool -type PKCS12 -alias enc -key server-enc.key -certs server-enc.crt -store server.keystore -storePasswd comstar ,但是没有指定keypass,因为在生成私钥的时候参考了gen_tlcp_certs.sh中的内容,使用的openssl, 执行的命令是 OPENSSL genpkey -algorithm ec -pkeyopt ec_paramgen_curve:SM2 -pkeyopt ec_param_enc:named_curve -out ca.key 这个命令应该是没有给私钥指定keypass吧?请问这个环节有问题吗?我看kona使用了中间证书及其私钥,我没有用用中间证书,这也应该没有关系吧?

johnshajiang commented 2 months ago

keyPasswd是需要的。当私钥存入密钥库文件时,会使用这个密码进行加密。 另外,还需要keyAlgo

试试下面的命令,

java -cp kona-crypto-1.0.12.jar:kona-pkix-1.0.12.jar com.tencent.kona.pkix.tool.KeyStoreTool \
    -type PKCS12 -alias sign -keyAlgo EC -key server-sign.key -keyPasswd testpass -certs server-sign.crt \
    -store server.keystore -storePasswd testpass
johnshajiang commented 2 months ago

刚开了一个issue #771,会改进一个KeyStoreTool的用法说明。

yaoyaoadzz commented 2 months ago

keyPasswd是需要的。当私钥存入密钥库文件时,会使用这个密码进行加密。 另外,还需要keyAlgo

试试下面的命令,

java -cp kona-crypto-1.0.12.jar:kona-pkix-1.0.12.jar com.tencent.kona.pkix.tool.KeyStoreTool \
    -type PKCS12 -alias sign -keyAlgo EC -key server-sign.key -keyPasswd testpass -certs server-sign.crt \
    -store server.keystore -storePasswd testpass

您好,指定了keyAlgo和keypass之后还是有些问题,请问您用1.0.12版本kona测试生成的server.keystore和cliengTrust.keystore服务端和客户端能够进行通信吗?

yaoyaoadzz commented 2 months ago

刚开了一个issue #771,会改进一个KeyStoreTool的用法说明。

好的谢谢,一开始keypass确实没搞明白,以为是生成私钥的时候加密的,现在理解了,keypass是存入到密钥库文件中时对私钥进行加密的

yaoyaoadzz commented 2 months ago

日志+文件.zip 不过现在日志信息变了,Exception in thread "main" javax.net.ssl.SSLHandshakeException: PKIX path building failed: com.tencent.kona.sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target,出现了这个异常,详细日志信息在日志里面了,请您帮忙看一下

johnshajiang commented 2 months ago

应该是由于client无法对server的证书进行验证。 请检查client是否正确的加载了CA证书。

yaoyaoadzz commented 2 months ago

您好,请问我可以用密信浏览器(国密浏览器),请求一下服务端的IP地址吗?应该是可以的吧?但是我启动了服务端,在国密浏览器中请求https://127.0.0.1:8899。8899是我自己设定的端口,是请求不到的,是因为我的ca证书是自签名的原因吗? 国密历览器请求服务器.txt

yaoyaoadzz commented 2 months ago

应该是由于client无法对server的证书进行验证。 请检查client是否正确的加载了CA证书。

好的我去检查一下

johnshajiang commented 2 months ago

国密历览器请求服务器.txt

"cipher suites"       : "
[UNKNOWN-CIPHER-SUITE(0xCACA)(0xCACA),
TLS_AES_128_GCM_SHA256(0x1301),
TLS_AES_256_GCM_SHA384(0x1302),
TLS_CHACHA20_POLY1305_SHA256(0x1303),
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B),
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F),
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C),
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030),
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA9),
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA8),
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013),
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014),
TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), 
TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D),
TLS_RSA_WITH_AES_128_CBC_SHA(0x002F),
TLS_RSA_WITH_AES_256_CBC_SHA(0x0035),
UNKNOWN-CIPHER-SUITE(0x000A)(0x000A)]",

上面的加密套件没有包含TLCP指定的密码套件,比如ECC_SM4_CBC_SM3。上面的都是TLS密码套件。 我们实现了如下的TLCP密码套件,

ECC_SM4_GCM_SM3
ECC_SM4_CBC_SM3
ECDHE_SM4_GCM_SM3
ECDHE_SM4_CBC_SM3

是因为我的ca证书是自签名的原因吗?

我想最终还是有这个问题的。浏览器也是一个TLS客户端,它预先加载的信任CA证书需要包含你访问的server所使用的CA。

yaoyaoadzz commented 2 months ago

应该是由于client无法对server的证书进行验证。 请检查client是否正确的加载了CA证书。

您好,请问我该如何去检查,不是很清楚,请您指点一下

yaoyaoadzz commented 2 months ago

国密历览器请求服务器.txt

"cipher suites"       : "
[UNKNOWN-CIPHER-SUITE(0xCACA)(0xCACA),
TLS_AES_128_GCM_SHA256(0x1301),
TLS_AES_256_GCM_SHA384(0x1302),
TLS_CHACHA20_POLY1305_SHA256(0x1303),
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B),
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F),
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C),
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030),
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA9),
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA8),
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013),
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014),
TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), 
TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D),
TLS_RSA_WITH_AES_128_CBC_SHA(0x002F),
TLS_RSA_WITH_AES_256_CBC_SHA(0x0035),
UNKNOWN-CIPHER-SUITE(0x000A)(0x000A)]",

上面的加密套件没有包含TLCP指定的密码套件,比如ECC_SM4_CBC_SM3。上面的都是TLS密码套件。 我们实现了如下的TLCP密码套件,

ECC_SM4_GCM_SM3
ECC_SM4_CBC_SM3
ECDHE_SM4_GCM_SM3
ECDHE_SM4_CBC_SM3

是因为我的ca证书是自签名的原因吗?

我想最终还是有这个问题的。浏览器也是一个TLS客户端,它预先加载的信任CA证书需要包含你访问的server所使用的CA。

所以一般自签名的ca证书我们可以使用本地程序去测试,想使用第三方的请求就需要在服务端导入ca机构颁发的证书以及对应的私钥是吗?

johnshajiang commented 2 months ago

您好,请问我该如何去检查,不是很清楚,请您指点一下

能否为你的测试程序创建一个GitHub仓库,它应该是一个良好的Maven或Gradle工程。 这样会比较方便讨论。

johnshajiang commented 2 months ago

所以一般自签名的ca证书我们可以使用本地程序去测试,想使用第三方的请求就需要在服务端导入ca机构颁发的证书以及对应的私钥是吗?

是的。

yaoyaoadzz commented 2 months ago

您好,请问我该如何去检查,不是很清楚,请您指点一下

能否为你的测试程序创建一个GitHub仓库,它应该是一个良好的Maven或Gradle工程。 这样会比较方便讨论。

我并没有用他作为一个maven或者gradle工程,而是直接将用到的jar包放在lib下面,整个项目直接依赖的lib,这样子应该跟maven工程差别不是很大吧?是因为我少引用了jar包吗? image 我的lib库里面是这样的

yaoyaoadzz commented 2 months ago

您好,请问我该如何去检查,不是很清楚,请您指点一下

能否为你的测试程序创建一个GitHub仓库,它应该是一个良好的Maven或Gradle工程。 这样会比较方便讨论。

好的,您先忙,我去创建一个GitHub仓库

yaoyaoadzz commented 2 months ago

您好,https://github.com/yaoyaoadzz/kona-demo.git,这是我建好的github仓库,我把代码放到这里了,麻烦您看一下

yaoyaoadzz commented 2 months ago

您好,这个测试程序,是别人写的,我也不太清楚,但是看起来不像是证书以及keystore的问题了,看起来是代码的问题,他应该是没有读取到ca证书所在的keystore,这个测试程序是从kona改造而来的

johnshajiang commented 2 months ago

试试将server端证书的CN修改为localhost

yaoyaoadzz commented 2 months ago

试试将server端证书的CN修改为localhost

请问这个CN指的是? image image 是哪个呢?使用什么命令去修改呢?

johnshajiang commented 2 months ago

创建证书时,指定-dname CN=localhost

yaoyaoadzz commented 2 months ago

您好,指定了CN域名之后还有有问题 Caused by: java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set 我看了一下我的CA证书免了设置了keyUsage呀,为啥会报这个错呢? image

yaoyaoadzz commented 2 months ago

我的CA证书里面设置了keyUsage呀,为啥会报这个错呢?

yaoyaoadzz commented 2 months ago

文件.zip 相关的文件我都放在附件里面了,麻烦您看一下