Ho un'applicazione client / server in cui il server utilizza il protocollo HTTPS e ha indirizzo e porta localhost:44301
.
L'applicazione client utilizza Python 2.7.13 sulla piattaforma Windows per connettersi al server. Questo è il codice snippet:
import platform, os
import requests, json, certifi, urllib3
def main():
my_c_folder = os.path.dirname('C:\Users\Admin\Desktop\cert')
my_pem = os.path.join('C:\Users\Admin\Desktop\cert', 'ce-lh.pem')
my_crt = os.path.join('C:\Users\Admin\Desktop\cert', 'ce-lh.crt')
my_key = os.path.join('C:\Users\Admin\Desktop\cert', 'ce.key')
http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',ca_certs=my_crt)
h = http.request('GET','https://localhost:44301/api/myData',auth=('myUser', 'myPass'))
print h
r = requests.get('https://localhost:44301/api/myData',auth=('myUser', 'myPass'), verify=my_crt)
print r
if __name__ == "__main__":
main()
Entrambi i link e richieste falliscono la chiamata restituendo questo errore
raise SSLError(e)
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)
Con OpenSSL (versione 1.0.2k) ho precedentemente creato il certificato in questo modo:
- Genera RSA:
openssl genrsa -aes256 -out ce.key 2048 -config c:\Program Files\OpenSSL-Win 64\bin\openssl.cfg
- Crea la richiesta di firma del certificato:
openssl req -new -key ce.key -out ce.csr
Utilizzando questo parametro: Nome comune (ad esempio nome FQDN del server o TUO) []: localhost * - Crea il certificato:
openssl x509 -req -days 365 -in ce.csr -signkey ce.key -out ce.crt
- Esporta in formato pem:
openssl x509 -in ce.crt -out ce.pem -outform PEM
Dove mi sbaglio? Come superare l'errore del certificato? (So che posso disabilitare per verificare il certificato ma non è il bersaglio.)
Si tratta di un errore di implementazione Python? O ho usato OpenSSL con comandi errati? O che altro? Grazie in anticipo