gpt4 book ai didi

Java SSL 套接字无法从客户端连接

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:08 25 4
gpt4 key购买 nike

我正在尝试在我正在编写的服务器和我不太了解的设备之间建立 SSL 连接,除了它可能嵌入了公钥这一事实(如您所见)下面我有私钥)。

我所知道的是,我有一个运行正常的服务器的 python 代码,并且该设备能够连接并发送和接收消息。

除了 python 代码,我还收到了证书(PEM 格式)和我在套接字初始化期间提供的私钥。 python代码如下:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'

#Bind socket to local host and port
try:
sock.bind((HOST, 34567))
except socket.error as msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
print 'Socket bind complete'
sslSocket = ssl.wrap_socket(sock , server_side=True, certfile="device.crt", keyfile="device.key", ssl_version=ssl.PROTOCOL_TLSv1_2)

#Start listening on socket
sslSocket.listen(10)
print 'Socket now listening'

#wait to accept a connection - blocking call
print 'wait to accept a connection'

conn, addr = sslSocket.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])

#start new thread takes 1st argument as a function name to be run, second is
the tuple of arguments to the function.
start_new_thread(receiveThread ,(conn,))
time.sleep(1)
start_new_thread(clientThread ,(conn,))

while 1:
time.sleep(1)
if exitNow:
print 'Exit'
break

sock.close()

print 'exiting'
sys.exit()

我对套接字的经验为零,但根据我读到的有关 Java 套接字的内容,我必须初始化和设置 keystore 和信任库以创建 SSL 套接字。

我所做的是(根据 this SO answer )

将我的证书和 key 转换为 PKCS12 证书-

openssl pkcs12 -export -in device.crt -inkey device.key -certfile device.crt -name "someName" -out device.p12

创建一个 keystore 并将新生成的证书导入其中-

keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore keystore.jks -srckeystore device.p12 -srcstoretype PKCS12 -srcstorepass 1234 -alias someName

再次复制该 keystore 并将其称为信任库(不确定这样做是否正确)。然后我使用生成的 keystore 通过以下代码初始化套接字:(请注意,我使用 Spring Integration,因为我的最终目标是尝试启动应用程序,该应用程序将在接收到对 REST API 的调用后在套接字上发送消息):

@EnableIntegration
@IntegrationComponentScan
@Configuration
public class SocketConfiguration implements
ApplicationListener<TcpConnectionEvent> {

private final org.slf4j.Logger log = LoggerFactory.getLogger(getClass());

@Bean
public AbstractServerConnectionFactory AbstractServerConnectionFactory() {
TcpNetServerConnectionFactory tcpNetServerConnectionFactory = new TcpNetServerConnectionFactory(34567);
DefaultTcpNetSSLSocketFactorySupport tcpNetSSLSocketFactory = tcpSocketFactorySupport();
tcpNetServerConnectionFactory.setTcpSocketFactorySupport(tcpNetSSLSocketFactory);
return tcpNetServerConnectionFactory;
}
@Bean
public DefaultTcpNetSSLSocketFactorySupport tcpSocketFactorySupport() {
TcpSSLContextSupport sslContextSupport = new DefaultTcpSSLContextSupport("keystore.jks",
"trustStore.jks", "123456", "123456");
DefaultTcpNetSSLSocketFactorySupport tcpSocketFactorySupport =
new DefaultTcpNetSSLSocketFactorySupport(sslContextSupport);
return tcpSocketFactorySupport;
}

@Bean
public TcpInboundGateway TcpInboundGateway(AbstractServerConnectionFactory connectionFactory) {
TcpInboundGateway inGate = new TcpInboundGateway();
inGate.setConnectionFactory(connectionFactory);
inGate.setRequestChannel(getMessageChannel());
return inGate;
}

@Bean
public MessageChannel getMessageChannel() {
return new DirectChannel();
}

@MessageEndpoint
public class Echo {

@Transformer(inputChannel = "getMessageChannel")
public String convert(byte[] bytes) throws Exception {
return new String(bytes);
}

}

private static ConcurrentHashMap<String, TcpConnection> tcpConnections = new ConcurrentHashMap<>();

@Override
public void onApplicationEvent(TcpConnectionEvent tcpEvent) {
TcpConnection source = (TcpConnection) tcpEvent.getSource();
if (tcpEvent instanceof TcpConnectionOpenEvent) {

log.info("Socket Opened " + source.getConnectionId());
tcpConnections.put(tcpEvent.getConnectionId(), source);

if (!authorizeIncomingConnection(source.getSocketInfo())) {
log.warn("Socket Rejected " + source.getConnectionId());
source.close();
}

} else if (tcpEvent instanceof TcpConnectionCloseEvent) {
log.info("Socket Closed " + source.getConnectionId());
tcpConnections.remove(source.getConnectionId());
}
}

private boolean authorizeIncomingConnection(SocketInfo socketInfo) {
//Authorization Logic , Like Ip,Mac Address WhiteList or anyThing else !
return (System.currentTimeMillis() / 1000) % 2 == 0;
}

我认为套接字已成功创建,因为在我的 windows 机器上运行 netstat 显示端口 40003 被 java 进程占用(当我终止进程时不是)。

现在唯一的问题是设备仍然无法连接到我的 socket 。不幸的是,这是一个封闭的设备,我对它的信息为零,无法对其进行调试,也无法了解正在发生的事情以及为什么无法连接(也无法从中获取任何日志)。我唯一的引用是——当我在运行 java 代码的同一台机器上运行附加的 Python 代码时,同一台设备能够连接到套接字(显然不是一起)。

你能指出我的 java 代码与 python 代码的不同之处吗?或我可以使用的任何其他方向。

谢谢!

最佳答案

原来问题出在我的盒子防火墙上。python 在防火墙中有异常(我的假设是这些异常是在安装过程中插入的但不太确定)而 java 没有这些异常所以 java 进程无法将这个套接字“暴露”给外界

关于Java SSL 套接字无法从客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909511/

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