Understanding the SSL InsecurePlatform Error
When you face the SSL InsecurePlatform error while using the Requests module in Python, it’s typically a sign that your environment doesn’t have the necessary packages or system capabilities to provide a secure connection over SSL. This error often occurs when using older versions of Python or when certain dependencies are not up to date.
Update Python and pip
Ensuring you have the latest versions of Python and pip can often resolve SSL errors.
- Download the latest version of Python from the official website.
- Upgrade pip to its latest version using the command
pip install --upgrade pip
.
Example:
import requests
# Make sure to update to Python 2.7.9 or greater
response = requests.get('https://example.com')
print(response.text)
Pros: Updating Python and pip can enhance security and performance, and provide support for newer TLS standards.
Cons: Updating might introduce incompatibilities with existing code, especially if you’re making a major version change.
Install Security Packages
To improve the Requests module’s ability to handle SSL connections, you can install a set of recommended security packages.
Run pip install requests[security]
to install the extra packages:
- pyOpenSSL
- cryptography
- idna
Code implementation:
import requests
# After installing requests[security], you can now establish a secure SSL connection
response = requests.get('https://example.com')
print(response.text)
Pros: Installing security packages often solves SSL issues without major changes to your environment.
Cons: Additional dependencies may need to be managed, and it could add overhead to your project.
Use PyOpenSSL Explicitly
If updating Python and installing security packages don’t work, you can use PyOpenSSL directly for a more controlled SSL environment.
- Install PyOpenSSL using
pip install pyopenssl
. - Use urllib3’s PyOpenSSL support (which Requests uses internally).
A tiny code example:
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()
import requests
# Now, your SSL connections use PyOpenSSL
response = requests.get('https://example.com')
print(response.text)
Pros: Direct use of PyOpenSSL can enable support for modern SSL and TLS features in environments where the standard library is limited.
Cons: It adds complexity to your project and requires understanding of both the Requests library internals and PyOpenSSL.
Troubleshoot Using Environment Variables
Sometimes, Python’s environment variables can affect SSL connections. By altering or updating these, you may resolve connection issues.
What to do here is just set environment variables like REQUESTS_CA_BUNDLE
or CURL_CA_BUNDLE
to the path of your cert file, as shown below:
# This is a shell command and needs to be run in your terminal
export REQUESTS_CA_BUNDLE=/path/to/certfile.pem
# In Python, after setting the environment variable
import requests
response = requests.get('https://example.com')
print(response.text)
Pros: Setting the environment variable is quick and might be necessary if your certificate bundle is in a non-standard location.
Cons: It’s a less generalized solution and you’ll need to manage these settings across different environments.
Switch to a Higher-Level Library
Using a higher-level HTTP client that wraps around Requests might abstract away the SSL issues by handling them internally:
- Explore alternatives like
http.client
in Python 3 or third-party libraries likehttpx
. - Install with
pip install httpx
and change your client-side code accordingly.
Example:
import httpx
# Using httpx, which handles SSL issues internally
response = httpx.get('https://example.com')
print(response.text)
Pros: A higher-level library may provide a more robust handling of SSL, especially if designed with updated practices.
Cons: This might require rewriting portions of your existing code to conform to the new library’s API.