gpt4 book ai didi

java - 使用 SSLEngine 使用为内部网络位置签名的证书

转载 作者:行者123 更新时间:2023-12-04 22:39:14 24 4
gpt4 key购买 nike

背景
我正在尝试创建 2 个通过 SSL 在内部网络上相互通信的 Java 应用程序。我通过授予 SSLEngine 访问 keystore 的权限来做到这一点,该 keystore 包含要使用的证书的私钥条目。

   private static SSLEngine createSslEngine()
{
try
{
KeyStore ks = KeyStore.getInstance( KeyStore.getDefaultType() );
char[] pwdArray = "changeit".toCharArray();
ks.load( null, pwdArray );
try ( InputStream ksIs = ServerAssociationConnector.class.getResourceAsStream( "clientkeystore" ) )
{
ks.load( ksIs, pwdArray );
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );

kmf.init( ks, pwdArray );
SSLContext context = SSLContext.getInstance( "TLSv1.3" );
context.init( kmf.getKeyManagers(), null, null );

return context.createSSLEngine();
}
catch ( NoSuchAlgorithmException | UnrecoverableKeyException | KeyStoreException | CertificateException | IOException | KeyManagementException exception )
{
throw new AssertionError( "SSLException", exception );
}
}
这在使用根证书时工作正常(在浏览器中点击 dubrovnik:2762 会提示证书不受信任,但其他情况下也可以)。然而;我想使用由内部 CA 签名的非根证书,仅用于相关域(在本例中称为 dubrovnik)。
当我使用根证书签署证书并在主题替代名称中使用 dubrovnik 时,java 拒绝使用该证书,而是生成 javax.net.ssl.SSLHandshakeException: No available authentication scheme异常(exception)
enter image description here
我正在使用的 keystore 包含以下内容:
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 2 entries

dubrovnik, 2 Nov 2020, PrivateKeyEntry,
Certificate fingerprint (SHA-256): 88:5F:53:7C:85:8E:65:01:3E:E1:E8:F0:D6:17:7A:8B:22:EF:11:DD:5F:E6:30:FE:A7:3B:F1:FA:07:C8:46:38
thecaroot, 2 Nov 2020, trustedCertEntry,
Certificate fingerprint (SHA-256): 9E:2F:86:B6:17:83:D2:26:88:42:49:E4:3F:DA:DA:19:31:11:18:F7:15:6D:16:35:C4:3E:1B:E4:F8:E6:FC:3A
我是如何创建证书的
我一直在使用 openssl 和 keytool 创建本地 ca 和签名证书
openssl genrsa -des3 -out myCA.key 2048
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

##create the certificate to sign
keytool -keystore clientkeystore -genkey -alias dubrovnik -dname "CN=dubrovnik" -ext san=dns:dubrovnik
##create a request to have certificate signed
keytool –certreq –keystore clientkeystore –alias dubrovnik –keyalg rsa –file dubrovnik.csr

##CREATE A FILE CALLED dubrovnik.conf as described in https://stackoverflow.com/a/47779814/2187042

##sign the request
openssl x509 -req -CA myCA.pem -CAkey myCA.key -in dubrovnik.csr -out dubrovnik.cer -days 3650 -CAcreateserial -extfile dubrovnik.conf -extensions v3_req
##import the root level certificate (just the certificate, not the private key)
keytool -import -keystore clientkeystore -file myCA.pem -alias theCARoot
##import the signed client certificate
keytool -import -keystore clientkeystore -file dubrovnik.cer -alias dubrovnik
问题
我需要做什么才能使 SSLEngine 接受内部网络证书(不是根证书)并避免 javax.net.ssl.SSLHandshakeException: No available authentication scheme异常(exception)

最佳答案

我相信我的问题实际上只是根证书是 RSA 证书,但非根证书是 DSA,并且 DSA 已被弃用(因此被忽略)。
javax.net.ssl.SSLHandshakeException: No available authentication scheme 也遇到了这个问题。
证书的DSA性质可以在证书详细信息中看到
enter image description here
需要更改 keygen 命令以使用 RSA
keytool -keystore clientkeystore -genkey -alias dubrovnik –keyalg rsa

关于java - 使用 SSLEngine 使用为内部网络位置签名的证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64644090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com