Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python requests gives SSL unknown protocol

I am trying to send a request to an API I have set up on an AWS machine.

The code I use is as follows:

import requests
import json

report_dict = {
        "client_name": "Wayne Enterprises",
        "client_id": 123,
        "report_type": "api_testing",
        "timestamp_generated": "2015-07-29T11:00:00Z",
        "report_data": {"revenue": 9000.00}
    }
report_json = json.dumps(report_dict)
resp = requests.post("https://my-url.com:8080/my-api/reports", data=report_json,verify=False)

Doing this, I get:

Traceback (most recent call last):
  File "art2_java_test.py", line 124, in <module>
    main()
  File "art2_java_test.py", line 9, in main
    test_post_good_data()
  File "art2_java_test.py", line 29, in test_post_good_data
    resp = requests.post("https://my-url.com:8080/my-api/reports", data=report_json,verify=Fal
se)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\api.py",
 line 109, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\api.py",
 line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\sessions
.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\sessions
.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests-2.7.0-py2.7.egg\requests\adapters
.py", line 428, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:5
90)

But when I send the request as http instead of https, it (usually) works fine. I've found some evidence that this can have to do with proxy servers, but I am not using one. Are there any other potential reasons for this error? This is a website only available on my company's local network, if that's relevant.

like image 598
pyg Avatar asked Aug 19 '15 15:08

pyg


People also ask

Does requests use https?

Requests verifies SSL certificates for HTTPS requests, just like a web browser. SSL Certificates are small data files that digitally bind a cryptographic key to an organization's details.


1 Answers

.... https://my-url.com:8080/my-api/reports

...But when I send the request as http instead of https, it (usually) works fine.

My guess is that you are trying the same port 8080 for http and https. But, servers usually listen on a single port either for http or https and not both. This means that if your client is trying to start the TLS handshake needed for https against this port it will get a plain error message back. The client then tries to interpret this error message as TLS and returns some weird error messages, because the response is not TLS at all.

like image 86
Steffen Ullrich Avatar answered Oct 05 '22 09:10

Steffen Ullrich