У меня возникли проблемы с подключением ssl socket, где java-клиент просто отправляет сообщение на прослушивание сервера python. Когда я запускаю код как localhost для сервера и клиента, он работает отлично. Если я использую сервер python на моей встроенной плате, поэтому клиент java может отправлять данные, есть соединение, отказавшееся от java. Я создал самостоятельно назначены сертификаты с IP встраиваемой платыСоединение с SSL SSL отказано
openssl req -x509 -nodes -days 730 -newkey rsa:2048 -keyout privKey.key -out server.pem -subj /CN=XXX.XX.XX.XXX
Я создал сертификат клиента с помощью:
keytool -keystore clientCert -importcert -alias tS -file client.pem
Но до сих пор она не работает.
Я не думаю, что это проблема с моим кодом, поскольку, когда я пытаюсь использовать тот же самый точный код с именем сервера (HOST) как localhost, соединение происходит просто отлично.
Вот код сервера Python:
import time , glob, os, sys
def deal_with_client(connstream):
timestr = time.strftime("%Y-%m-%d_%H-%M-%S")
outfile = open((timestr) + ".wav", 'ab')
data = connstream.recv(1024)
print data
sys.exit(1)
outfile.write(data)
# null data means the client is finished with us
while data:
if not data:
print 'no more data being sent'
break
data = connstream.recv(1024)
outfile.write(data)
# finished with client
def get_IP_Edison(value=basestring):
IP = os.popen(value).read()
tag1 , tag2= IP.find(":") , IP.find("n")
return IP[tag1+1:tag2]
def start_Server():
import ssl,socket
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) # calling the client context to loaded with
# configs
key , cert = "/home/root/Coding/certificates/server/privKey.key", \
"/home/root/Coding/certificates/server/server.pem" # Key and cert created with OPENSSL
context.load_cert_chain(certfile=cert, keyfile=key) # Load the certifications
value = '''ifconfig | grep "inet " | grep -v 127.0.0.1 | grep -v 192.* | awk '{print $2}' '''
HOST, PORT = get_IP_Edison(value), 50007 # calling the port and host/needs to be of the edison
print "IP of the Edison : " + HOST
bindsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create a normal socket
bindsocket.bind((HOST, PORT)) # Bind the socket or create it
bindsocket.listen(5) # make the socket listen on five connections
print 'Listening..'
while True:
newsocket, fromaddr = bindsocket.accept() # accept the connection
print 'accepted connection from' + str(fromaddr)
connstream = context.wrap_socket(newsocket, server_side=True,do_handshake_on_connect=True) # wrap it in socket but make sure keys match
try:
deal_with_client(connstream) # call the receive function to receive file (more details above)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
print 'socket was closed'
def wavFinder():
newest = max(glob.iglob('*.[Ww][Aa][Vv]'), key=os.path.getctime)
return newest
if __name__=='__main__':
start_Server()
wavFileNew = wavFinder()
print wavFileNew
Вот мой Java-код:
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
/**
* Created by admirmonteiro on 2/18/16.
*/
public class testCertEdison {
/** TrustStores which is for the client use**/
final String theServerName = "XXX.XX.XX.XXX";
final int theServerPort = 50007;
// final static String pathToStores = "../../Desktop/SSL_KEY/x509_Java/keyStore/ex/";
final static String pathToStores = "/Users/admirmonteiro/Desktop/SSL_KEY/x509_Java/client/tS";
final static String trustStoreFile = "clientCert" ; // filename
final static String passwd = "admir2006";
public static void main(String args[]) throws Exception {
String trustFileName = pathToStores + "/" + trustStoreFile;
System.setProperty("javax.net.ssl.trustStore",trustFileName);
System.setProperty("javax.net.ssl.trustStorePassword",passwd);
new test_certificate().doClient();
}
void doClient() throws Exception{
SSLSocketFactory sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) sslsf.createSocket(theServerName,theServerPort);
OutputStream sslOS = sslSocket.getOutputStream();
sslOS.write("Connected to the stupid thing".getBytes());
sslOS.flush();
sslSocket.close();
}
}
Пожалуйста, помогите, я был на этом какое-то время.
Что такое "client.pem" в вашем импорте keytool? Чтобы это работало так, как будто вы пытаетесь, это значение должно быть «server.pem» - то есть тот же самый файл сертификата, который запускается сервером. –
да, это именно то, что sever.pem, я скопировал и вставил его. – Aboogie
Код, который вы опубликовали, работает для меня (после настройки имен файлов, путей и хостов), когда client.pem и server.pem совпадают. Они соединяются друг с другом, когда вы запускаете их в одном окне? Если они выполняются, когда они размещаются, но не иначе, то где-то вы блокируетесь брандмауэром. –