Networking in Python: guida pratica

Argomenti:
Pubblicato il: 13-04-2021 08:51

Check HTTPS in Python

Con un semplice script python è possibile verificare la validità del certificato SSL per uno specifico host. La lista del materiale occorrente comprende una versione di Python aggiornata, in questa guida si farà riferimento alla 3.8 e i seguenti moduli, installabili via pip:

  • pyopenssl
  • idna
  • cryptography

Per prima cosa bisogna creare un socket che si connetta all’host da esaminare:


socket = socket()

SMSHosting Usa il codice PROMO per uno sconto sul primo acquisto: PRT96919

socket.connect(('esempio.com', 443))

si crea ora il context SSL passando come parametro la versione SSL, utilizzeremo la versione SSLv3 che è una delle più comuni, se ciò non dovesse funzionare a questo link troverete una lista dei parametri da poter dare in ingresso.

cntx = SSL.Context(SSL.SSLv23_METHOD)

diamo istruzioni per stabilire una secure socket connection


sock_ssl = SSL.Connection(ctx, sock)
sock_ssl.set_connect_state()
sock_ssl.set_tlsext_host_name(idna.encode('esempio.com'))
sock_ssl.do_handshake()

idna.encode('esempio.com') codifica in Punycode l’argomento che gli si passa, in questo caso esempio.com.
do_handshake()
esegue l’SSL handshake.

Si deve ora recuperare il certificato crtf = sock_ssl.get_peer_certificate() e accedere alle informazione di questo, decrittografandolo e rendendolo human readible: dcrpt_crtf =crtf.to_cryptography()

Si possono estrapolare tutte le informazioni dal certificato:

  • Subject Alternate Name (SAN) : dcrpt.extensions.get_extension_for_class(x509.SubjectAlternativeName)
  • Common Name (CN) : dcrpt.subject.get_attributes_for_oid(NameOID.COMMON_NAME)
  • Issuer : dcrpt.issuer.get_attributes_for_oid(NameOID.COMMON_NAME)

Gli issuer sono le autorità dalle quali si possono ottenere certificati x509, Let’s Encrypt ad esempio è un issuer.

Un altro metodo per verificare un certificato SSL è quello di usare urllib3, per installarlo:

pip install urllib3

e poi:

import urllib3
http = urllib3.PoolManager()
http.request('GET', 'https://dominio_da_verificare')

se il certificato è valido si otterrà un output del genere <urllib3.response.HTTPResponse object at 0x7fd3ca5da580>, simile all’output di  sock_ssl.get_peer_certificate().

Se non è valido otterremo un’eccezione del tipo urllib3.exceptions.SSLError.

Geolocalizzare un IP in Python

La localizzazione geografica di un indirizzo IP in python è alquanto semplice, è necessaria l’installazione del solo modulo requests.

Utilizzeremo l’API

https://geolocation-db.com/json/

e quindi:

response = requests.get("https://geolocation-db.com/json/indirizzoIP&position=true").json()

Ovviamente al posto di indirizzoIP, va inserito un indirizzo. Si otterrà un json con le informazioni richieste
{‘country_code’: ‘IT’, ‘country_name’: ‘Italy’, ‘city’: ‘Roma’, ‘postal’: ‘ 00118‘, ‘latitude’: 41.9028, ‘longitude’: 12.4964, ‘IPv4’: ‘indirizzoIP’, ‘state’: ‘Provincia di Roma’}

Pingare un sito in python

il modo più veloce per effettuare un ping usando il linguaggio python è installare pythonping.

Fatto ciò, non rimane che importarlo e lanciarlo, pingando un sito:

from pythonping import ping
ping('sito.com')

questo restituirà una liste con le risposte, contenti il pacchetto ricevuto e altre meta informazioni.

SMSHosting Usa il codice PROMO per uno sconto sul primo acquisto: PRT96919

Un altro modo è quello di usare i comandi del sistema operativo da uno script python:

import os
os.system(f"ping -c 1 -w2 'sito_da_pingare.com' > /dev/null 2>&1 ") se usate Linux
os.system(f"ping -n 1 -w2 'sito_da_pingare.com' > /dev/null 2>&1 ") se usate Windows

5/5 (2)

Che te ne pare?

Grazie per aver letto Networking in Python: guida pratica di Carmelo Marasco su Trovalost.it
Networking in Python: guida pratica (Guide, Assistenza Tecnica)

Articoli più letti su questi argomenti:

Seguici su Telegram: @trovalost