Я создаю клиент-серверное приложение. Я пытаюсь установить связь TLS, но подтверждение TLS не удается. Сервер и клиент находятся на одном компьютере, на одной виртуальной машине. Я уже проверил, что сгенерированный мной сертификат использует не DSA, а sha256WithRSAEncryption. Он основан на сгенерированном мной ключе длиной 3072 бита. Я сгенерировал их оба с помощью команды certtool. Я создал хранилище ключей для сервера и хранилище доверенных сертификатов для клиента на основе этого сертификата и закрытого ключа с помощью команды keytool.
Вот какую ошибку я получаю
java -jar target/testNio-1.0-SNAPSHOT.jar
Server launched on port 8443
Boss capture thread launches
Server handler launches
Worker thread launches
Thread sending messages launches
Attempted connection detected
TCP connection established with /127.0.0.1:44448
Attempted tls connection detected
NEED_UNWRAP
flag 1
NEED_TASK
NEED_WRAP
flag 2
javax.net.ssl.SSLHandshakeException: No available authentication scheme
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:130)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:365)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:312)
at java.base/sun.security.ssl.CertificateMessage$T13CertificateProducer.onProduceCertificate(CertificateMessage.java:975)
at java.base/sun.security.ssl.CertificateMessage$T13CertificateProducer.produce(CertificateMessage.java:964)
at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:437)
at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.goServerHello(ClientHello.java:1245)
at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1181)
at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:839)
at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:800)
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:393)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:476)
at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1274)
at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1260)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:714)
at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1205)
at io.test2.Boss.handleTLSConnection2(Boss.java:169)
at io.test2.Boss.run(Boss.java:218)
Это код класса, отвечающего за установление tls-соединений.
Я создаю клиент-серверное приложение. Я пытаюсь установить связь TLS, но подтверждение TLS не удается. Сервер и клиент находятся на одном компьютере, на одной виртуальной машине. Я уже проверил, что сгенерированный мной сертификат использует не DSA, а sha256WithRSAEncryption. Он основан на сгенерированном мной ключе длиной 3072 бита. Я сгенерировал их оба с помощью команды certtool. Я создал хранилище ключей для сервера и хранилище доверенных сертификатов для клиента на основе этого сертификата и закрытого ключа с помощью команды keytool. Вот какую ошибку я получаю [code]java -jar target/testNio-1.0-SNAPSHOT.jar
Server launched on port 8443 Boss capture thread launches Server handler launches Worker thread launches Thread sending messages launches Attempted connection detected TCP connection established with /127.0.0.1:44448 Attempted tls connection detected NEED_UNWRAP flag 1 NEED_TASK NEED_WRAP flag 2
javax.net.ssl.SSLHandshakeException: No available authentication scheme at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:130) at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:365) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:312) at java.base/sun.security.ssl.CertificateMessage$T13CertificateProducer.onProduceCertificate(CertificateMessage.java:975) at java.base/sun.security.ssl.CertificateMessage$T13CertificateProducer.produce(CertificateMessage.java:964) at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:437) at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.goServerHello(ClientHello.java:1245) at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1181) at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:839) at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:800) at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:393) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:476) at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1274) at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1260) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1205) at io.test2.Boss.handleTLSConnection2(Boss.java:169) at io.test2.Boss.run(Boss.java:218) [/code] Это код класса, отвечающего за установление tls-соединений. [code]package io.test2;
public class Boss extends Thread { public Selector acceptor; public Selector com; public ServerSocketChannel serverChannel; public boolean running; public ArrayList sessions; public ArrayList sessionsTemp; public SSLContext sslContext;
SSLEngineResult res = engine.unwrap(netBuffer, appBuffer); //appBuffer.compact(); if (!isTLSHandShake(netBuffer)) { System.out.println("Non-TLS attempted connection. Closing connection"); clientClose(info, client); return; } /* * If some tasks are required to end the establishment of the TLS connection */ if (res.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.NEED_TASK) { Runnable task; while ((task = engine.getDelegatedTask()) != null) task.run(); } if (res.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.FINISHED) { for (int i = 0; i < sessionsTemp.size(); i++) { if (sessionsTemp.get(i).sc.equals(client)) { System.out.println("Connection accepted from " + sessionsTemp.get(i).id.toString()); sessions.add(sessionsTemp.get(i)); sessionsTemp.remove(i); synchronized (com) { com.wakeup(); client.register(com, SelectionKey.OP_READ, info); } break; } } } }
public boolean isTLSHandShake(ByteBuffer buffer) {
if (buffer.remaining() < 5) return false; if (buffer.get(0) == 22 && buffer.get(1) == 3) return true; return false; }
public void handleTLSConnection2(SelectionKey key) throws IOException { System.out.println("Attempted tls connection detected"); SocketChannel client = (SocketChannel) key.channel(); TLSConnectionInformation info = (TLSConnectionInformation) key.attachment(); SSLEngine engine = info.engine; ByteBuffer appBuffer = ByteBuffer.allocate(engine.getSession().getApplicationBufferSize()); ByteBuffer netBuffer = ByteBuffer.allocate(engine.getSession().getPacketBufferSize()); while (true) { SSLEngineResult.HandshakeStatus handshakeStatus = engine.getHandshakeStatus(); switch (handshakeStatus) { case NEED_WRAP: System.out.println("NEED_WRAP"); netBuffer.clear(); System.out.println("flag 2"); ByteBuffer buf = ByteBuffer.allocate(10); SSLEngineResult wrapResult = engine.wrap(buf, netBuffer); //HERE2 System.out.println("flag 3"); if (wrapResult.getStatus() == SSLEngineResult.Status.CLOSED) { throw new IOException("Handshake failed: Engine closed during wrap"); } System.out.println("flag 4"); netBuffer.flip(); if (netBuffer.hasRemaining()) { client.write(netBuffer); } System.out.println("flag 5"); break; case NEED_UNWRAP: System.out.println("NEED_UNWRAP"); if (client.read(netBuffer) Но если я посмотрел на стандартный вывод, программа не проходит дальше флага 2, который равен //HERE2. Поэтому моя ошибка может быть связана с вызовом engine.wrap() ; запущенные выполняемые задачи; что-то не так с сертификатом или что-то, о чем я не знаю. Буду благодарен за любую помощь. Спасибо, что уделили время.