본문 바로가기
개발자 전향 프로젝트

SSL 실행 에러: AttributeError: module 'ssl' has no attribute 'wrap_socket'

by 샘오리 2024. 5. 28.

 

쉽게 말해 파이썬 버전이 바뀌면서 생기는 문제이다.

 

파이썬 3.7부터 ssl.wrap_socket() 함수는 deprecated가 되었으며 

ssl.SSLContext object 를 만들고 ssl.SSLContext.wrap_socket 함수를 호출하는 것이 권고되었다.


아직  ssl.wrap_socket() 함수를 쓰고 있다면 이는 보안에 취약하고 해당 함수는 서버의 호스트네임을 검증하지 않는다고 한다. CWE-295: Improper Certificate Validation에 위배되기 때문에 바꿔줘야 한다.

 

그럼 원래 어떻게 되어있었고 어떻게 바꿔야 하나?

 

runsslserver.py 를 열고 (보통 에러메세지에 어느 파일에서 에러가 발생했는지 나오기 때문에 클릭하면 들어가진다)

 

대충 아래처럼 되어있던 코드

class SecureHTTPServer(ThreadedWSGIServer):
    def __init__(self, address, handler_cls, certificate, key, ipv6=False):
        super(SecureHTTPServer, self).__init__(address, handler_cls, ipv6=ipv6)
        self.socket = ssl.wrap_socket(self.socket, certfile=certificate,
                                      keyfile=key, server_side=True,
                                      ssl_version=_ssl_version,
                                      cert_reqs=ssl.CERT_NONE)

 

 

아래 처럼 바꿔주면 된다.

class SecureHTTPServer(ThreadedWSGIServer):
    def __init__(self, address, handler_cls, certificate, key, ipv6=False):
        super(SecureHTTPServer, self).__init__(address, handler_cls, ipv6=ipv6)
        context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        context.load_cert_chain(certfile=certificate, keyfile=key)
        self.socket = context.wrap_socket(self.socket, server_side=True)

 

그리고 ssl을 실행하게 되면? 실행이 되는 마법을 볼 수 있다.

 

위 내용은 깃헙 커뮤니티에서 참고한 내용이다.

원문을 보고 싶다면 아래로 들어가면 된다. (다 영어이긴 하지만)

https://github.com/eventlet/eventlet/issues/795