example python sockets ssl https sslcontext

example - ssl en python



Contexto SSL para la versiĆ³n anterior de python (2)

Debe especificar el archivo ca_certs (que debe apuntar a la tienda de confianza)

Tengo un código como a continuación:

headers = {''content-type'': ''ContentType.APPLICATION_XML''} uri = "www.client.url.com/hit-here/" clientCert = "path/to/cert/abc.crt" clientKey = "path/to/key/abc.key" PROTOCOL = ssl.PROTOCOL_TLSv1 context = ssl.SSLContext(PROTOCOL) context.load_default_certs() context.load_cert_chain(clientCert, clientKey) conn = httplib.HTTPSConnection(uri, some_port, context=context)

Realmente no soy un programador de redes, así que busqué en Google la conexión de handshake y encontré ssl.SSLContext(PROTOCOL) como la función necesaria, el código funciona bien.

Luego toco la publicación roadblock, mi local tiene la versión 2.7.10 pero todas las cajas de producción tienen 2.7.3 con ellas, por lo que SSLContext no es compatible y la actualización de la versión de python no es una opción / está bajo control.

Intenté leer ssl - Contenedor SSL para objetos socket pero no podía entenderlo.

lo que probé ( en vano ):

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED) new_conn = s.connect((uri, some_port))

pero regresa:

SSLError(1, u''[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)'')

Pregunta : ¿cómo generar Contexto SSL en una versión anterior para tener una conexión https segura?


Tengo la solución perfecta usando la biblioteca de solicitudes . La biblioteca de solicitudes tiene que ser mi biblioteca favorita que he usado, porque lleva algo en Python que es intrínsecamente difícil de hacer, solicitudes SSL y REST, y lo hace increíblemente simple. Revisé su soporte de versión y Python 2.6+ es compatible.

Aquí hay un ejemplo de cómo usar su biblioteca.

>>> requests.get(uri)

Y eso es todo lo que tienes que hacer. La biblioteca de solicitudes se encarga de establecer una conexión SSL.

Tomando esto un paso más allá. Si necesita conservar las cookies entre las solicitudes, puede hacerlo así.

>>> sess = requests.Session() >>> credentials = {"username": "user", "password": "pass"} >>> sess.post("https://some-website/login", params=credentials) <Response [200]> >>> sess.get("https://some-website/a-backend-page").text <html> the backend page... </html>

Editar: si es necesario, también puede pasar la ruta al certificado y la clave como requests.get(uri, cert=(''path/to/cert/abc.crt'', ''path/to/key/abc.key''))

Ahora, con suerte, puede convencerlos de que instalen la biblioteca de solicitudes en los cuadros de producción, ya que valdría la pena. Déjame saber si esto funciona para ti.