SilvJ Posted March 23, 2012 at 12:40 PM Report #445315 Posted March 23, 2012 at 12:40 PM Boa Tarde, Preciso de um serviço que envie uma imagem de um cliente para um servidor. Pela biblioteca socket em python já consigo fazer isso mas quero implementar na transmissão o ssl (secure socket layer) para que a transmissão seja segura. So que está-me sempre a aparecer este erro: "error: [Errno 10054] Uma ligação existente foi forçada a fechar pelo anfitrião remoto" O Codigo do Servidor é: import socket, ssl class ServerSocket: def socketConnect(self): print (">>Socket Criado a Aguardar Conexao") self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind(('localhost', 10006)) self.sock.listen(1) try: self.newsocket, self.clientSocket = self.sock.accept() print (">>Existe uma tentatica de Conexao") self.connssl = ssl.wrap_socket(self.newsocket, server_side=True, certfile = "server.csr", keyfile = "server.key", ssl_version=ssl.PROTOCOL_TLSv1) pass except: print (">>!!Este Utilizador nao tem permissao!!") print (">>Conexao Recebida") print ( ">>>IP Remoto: %s" % self.clientSocket[0] ) print ( ">>>Porta Remota: %d" % self.clientSocket[1] ) try: print (">>A Decorrer Transferencia") self.data = "" while (self.data[-4:] != "\n\r##"): self.data += self.connssl.recv(1024) pass self.data = self.data.replace("\n\r##", "") self.imageOut = open( "C:\\Users\\Documents\\Projecto\\demo_out.jpg", "wb" ) self.imageOut.write(self.data) self.imageOut.close() print (">>Transferencia Concluida") pass except: print (">>!!Falhou a Transferencia!!") pass finally: self.newsocket.close() self.sock.close() print (">>Socket finalizado") pass pass pass x = ServerSocket() x.socketConnect() E o do Client é: import socket, ssl sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM) ssl_sock = ssl.wrap_socket(sock, ca_certs="server.crt", cert_reqs=ssl.CERT_REQUIRED) try: sock.connect(("localhost", 10006)) print( ">> Conexão estabelecida!" ) pass except: print( ">> Conexão Perdida!" ) f = open( "C:\\Users\\Documents\\Projecto\\demo.jpg", "rb" ) data = "" data = f.readlines() for line in data: ssl_sock.send(line) EOF = "\n\r##" ssl_sock.send(EOF) f.close() ssl_sock.close() print( ">> Envio terminado!" ) Os certificados que utilizo são gerados a partir do openssl com os seguintes comandos: 1 - genrsa -out server.key 1024 2 - req -new -key server.key -out server.csr 3 - x509 -req -days 365 -in server.csr -signkey server.key -out server.crt Se alguem me conseguir ajudar agradecia, penso que isto seja um erro simples mas que eu até agora ainda nao consegui resolver por isso estou a pedir ajuda. Obrigado e Cumprimentos
NuGuN Posted March 23, 2012 at 11:44 PM Report #445425 Posted March 23, 2012 at 11:44 PM Boas! Bem, andei aqui às voltas e o problema era bem mais simples... Se tiveres os certificados correctos basta alterares a seguinte linha no cliente: sock.connect(("localhost", 10006)) para: ssl_sock.connect(("localhost", 10006)) deves-te ter trocado aí porque no servidor está correcto... EDIT Esses 'pass' que tens espalhados pelo código não estão a fazer nada. Isso utiliza-se quando por exemplo tens um ciclo if e dentro desse ciclo não queres fazer nada, ou quando estás a trabalhar com classes e queres definir métodos sem código. Ex.: def metodo_teste(): pass Outro pormenor, para teres mais informação sobre os erros, de uma forma generalista podes utilizar os excepts de outra forma: try: .... except Exception err: print err A variável 'err' contem informação que pode ser bastante util no debug de alguns problemas. Cumps!
SilvJ Posted March 24, 2012 at 11:11 PM Author Report #445537 Posted March 24, 2012 at 11:11 PM Boa Noite, Desde já quero agradecer a disponibilidade mas infelizmente nao consegui, alterei o que disse e realmente foi um lapso meu. Mas o erro continua igual: ---->"error: [Errno 10054] Uma ligação existente foi forçada a fechar pelo anfitrião remoto" E eu já pus o "except Exception" e o erro é mesmo esse, ja não sei o que fazer mas quase de certeza que é por causa dos certificados mas eu ja fiz tantos certificados de tantas maneiras diferentes, já não sei o que fazer! 😄😞 :(
NuGuN Posted March 25, 2012 at 12:51 AM Report #445545 Posted March 25, 2012 at 12:51 AM Estas a gerar os certificados como e com o quê? Eu utilizei o openSSL: openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout certkey.pem já agora... eu experimentei o código em Linux, mas não devia fazer diferença... Cumps!
SilvJ Posted March 26, 2012 at 03:41 PM Author Report #445736 Posted March 26, 2012 at 03:41 PM Boa Tarde, Eu tambem estou a gerar no openssl mas não gerei como me está ai a indicar... Então mas ai está a gerar logo o certificado e as chaves é? Ou seja, o "cert.pem" é para o client e o "certkey.pem" para o servidor? É que já estive a experimentar assim como me indica e tambem não consegui, fosse conseguiu? A mim continuaaa a dar-me o mesmo erro Eu estou a trabalhar em ambiente windows mas em principio o problema não é das plataformas mas se não conseguir vou ter de experimentar em linux. Cumps e muito obrigado está a ser uma grande ajuda!! 😄
NuGuN Posted March 26, 2012 at 10:36 PM Report #445810 Posted March 26, 2012 at 10:36 PM Bem, para o servidor utilizei 'cert.pem' para o 'certfile' e o 'certkey.pem' para o 'keyfile'. Para o cliente utilizei o 'cert.pem' para o 'ca_certs' Bem... na verdade eu não testei o teu código na totalidade... Do servidor utilizei o código na totalidade, mas do cliente só testei a parte da conexão e enviei alguma informação manualmente, portanto, se os certificados estiverem correctos, o problema estará no cliente. Em que ponta é que dá o erro? Servidor ou cliente? E quando dá erro, só dá numa ponta? O que aparece na outra? Esse directório que está no cliente existe? EDIT Pude agora testar o teu código na totalidade e funciona correctamente... Ou os certificados ou os directórios ou permissões... Cumps!
SilvJ Posted March 27, 2012 at 10:56 AM Author Report #445874 Posted March 27, 2012 at 10:56 AM Boas, Consoante o codigo que tenho e que você já experimentou os erros são os seguintes: Cliente: "error: [Errno 10054] Uma ligação existente foi forçada a fechar pelo anfitrião remoto" Servidor: "error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number" E estou a fazer exactamente como você porque já gerei os certificados como me indicou! Provavelmente é um erro mínimo que me está a escapar mas duvido que seja de código porque isso tenho igual como coloquei no forum excepto os erros que me indicou. EDIT Já consegui apenas acrescentei "ssl_version=ssl.PROTOCOL_TLSv1" tambem no contexto (wrap_socket) do client pois são estava no servidor e ele nao utilizava o mesmo protocolo apesar de eu pensar que ele reconhecia automaticamente por isso e que nem me lembrei. Mas pronto já estáa 😁 Muito Obrigado pela sua ajuda foi preciosa. Cumps
NuGuN Posted March 27, 2012 at 09:59 PM Report #446025 Posted March 27, 2012 at 09:59 PM Pois, esse debug do servidor também tinha ajudado... Segundo a documentação oficial do modulo 'ssl' o cliente deveria reconhecer a versão utilizada pelo servidor, o que parece que no teu caso não está a acontecer, daí teres de forçar... Sinceramente não estava à espera dessa... Mas ainda bem que já ficou resolvido. Cumps!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now