Jump to content

Socket SSL


SilvJ
 Share

Recommended Posts

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.  :wallbash:

Obrigado e Cumprimentos

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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!  😄😞 :( :wallbash:

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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  :wallbash:

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!!  😄

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.