Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Received fatal alert: handshake_failure #769

Open
yaoyaoadzz opened this issue Apr 20, 2024 · 57 comments
Open

Received fatal alert: handshake_failure #769

yaoyaoadzz opened this issue Apr 20, 2024 · 57 comments
Assignees
Labels
question Further information is requested

Comments

@yaoyaoadzz
Copy link

您好,请问我想自签名的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 johnshajiang self-assigned this Apr 21, 2024
@johnshajiang johnshajiang added the question Further information is requested label Apr 21, 2024
@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

@yaoyaoadzz
Copy link
Author

我用的kona是1.0.9版本的

@johnshajiang
Copy link
Collaborator

 % 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
Copy link
Collaborator

我用的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
Copy link
Author

 % 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
Copy link
Author

我用的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
Copy link
Collaborator

请问这个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
Copy link
Collaborator

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

是的。

@yaoyaoadzz
Copy link
Author

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

是的。

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

@yaoyaoadzz
Copy link
Author

您好,我看了一下脚本文件,其中有这行命令
$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
Copy link
Collaborator

但是我是用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
Copy link
Author

但是我是用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
Copy link
Author

您好,我已经使用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
Copy link
Author

我使用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
Copy link
Collaborator

johnshajiang commented Apr 22, 2024

会报错,

那是什么错呢?

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

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

@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

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

@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

@yaoyaoadzz
Copy link
Author

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

@johnshajiang
Copy link
Collaborator

可能是由于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
Copy link
Author

可能是由于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
Copy link
Collaborator

johnshajiang commented Apr 23, 2024

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
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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
Copy link
Author

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

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

@yaoyaoadzz
Copy link
Author

日志+文件.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
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

yaoyaoadzz commented Apr 23, 2024

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

@yaoyaoadzz
Copy link
Author

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

好的我去检查一下

@johnshajiang
Copy link
Collaborator

国密历览器请求服务器.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
Copy link
Author

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

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

@yaoyaoadzz
Copy link
Author

国密历览器请求服务器.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
Copy link
Collaborator

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

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

@johnshajiang
Copy link
Collaborator

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

是的。

@yaoyaoadzz
Copy link
Author

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

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

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

@yaoyaoadzz
Copy link
Author

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

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

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

@yaoyaoadzz
Copy link
Author

yaoyaoadzz commented Apr 23, 2024

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

@yaoyaoadzz
Copy link
Author

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

@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

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

@johnshajiang
Copy link
Collaborator

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

@yaoyaoadzz
Copy link
Author

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

@yaoyaoadzz
Copy link
Author

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

@yaoyaoadzz
Copy link
Author

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

@yaoyaoadzz
Copy link
Author

您好,我设置了一下CN域名,然后启动jetty的服务器,使用国密浏览器可以访问了,但是不太清楚原理,用代码的客户端请求还是会失败,现在应该是客户端的证书生成或者导入的时候有问题吧?
image
我这里使用的是密信浏览器

@johnshajiang
Copy link
Collaborator

是把server证书,而非CA证书,的CN设置为localhost

@yaoyaoadzz
Copy link
Author

是把server证书,而非CA证书,的CN设置为localhost

image
那请问CA证书的域名设置成什么呢?他也有这个选项,这个可以自定义吗?不是很清楚生成自签名的CA证书这个CN有什么作用

@johnshajiang
Copy link
Collaborator

测试用的CA的CN可以就写成CA

@johnshajiang
Copy link
Collaborator

如果这个问题已经解决了,请关闭它。
若有新的问题,欢迎新开issue。

P.S. 如想支持该项目,请为它加星 ;-)

@yaoyaoadzz
Copy link
Author

如果这个问题已经解决了,请关闭它。 若有新的问题,欢迎新开issue。

P.S. 如想支持该项目,请为它加星 ;-)

您好,这个问题目前还没有解决,最近在处理别的事情,不好意思耽误您的时间,我会尽快找时间继续看一下这个问题,谢谢!

@johnshajiang
Copy link
Collaborator

我只是确认一下这个问题。并没有耽误我的时间。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants