diff --git a/README.md b/README.md index f416e83..7b563b9 100755 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ para as chamadas de callback via Webhooks. ## Requisitos e instalação -Testado com Python 3.7. Para dependências, ver _requirements.txt_. +Testado com Python 3.12. Para dependências, ver _requirements.txt_. Para instalação automática do SDK e dependências via `pip`, execute a linha abaixo: ```shell -$ pip install git+https://github.com/CPqD/trd-sdk-python.git@v1.1.0 +$ pip install git+https://github.com/CPqD/trd-sdk-python.git@v1.2.0 ``` #### Servidor WSGI para _callbacks_ via Webhooks @@ -171,7 +171,9 @@ client = TranscriptionClient( sl_username="", sl_password="", sl_host="", - sl_port="" + sl_port="", + sl_protocol="https", # Opcional: Padrão é "https" + sl_token=None # Opcional: Insira um token válido caso não queira utilizar as credenciais acima para gerar um novo ) ``` diff --git a/cpqdtrd/cert.py b/cpqdtrd/cert.py index 08d7256..74d8c7c 100755 --- a/cpqdtrd/cert.py +++ b/cpqdtrd/cert.py @@ -1,40 +1,56 @@ # -*- coding: utf-8 -*- -from OpenSSL import crypto +from cryptography import x509 +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import rsa +from cryptography.x509.oid import NameOID +import ipaddress +from datetime import datetime, timedelta, timezone import re def create_self_signed_cert(hostname, cert_path, pkey_path): """Generate a certificate and private key, and returns the public key as str.""" - # create a key pair - k = crypto.PKey() - k.generate_key(crypto.TYPE_RSA, 2048) - - # create a self-signed cert - cert = crypto.X509() - cert.get_subject().C = "BR" - cert.get_subject().ST = "Sao Paulo" - cert.get_subject().L = "Campinas" - cert.get_subject().O = hostname - cert.get_subject().OU = hostname - cert.set_serial_number(1000) - cert.gmtime_adj_notBefore(0) - cert.gmtime_adj_notAfter(10 * 365 * 24 * 60 * 60) - cert.set_issuer(cert.get_subject()) + key = rsa.generate_private_key(public_exponent=65537, key_size=2048) + now = datetime.now(timezone.utc) + subject = issuer = x509.Name( + [ + x509.NameAttribute(NameOID.COUNTRY_NAME, "BR"), + x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Sao Paulo"), + x509.NameAttribute(NameOID.LOCALITY_NAME, "Campinas"), + x509.NameAttribute(NameOID.ORGANIZATION_NAME, hostname), + x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, hostname), + ] + ) if re.compile(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}").match(hostname): - alt_name = "IP:" + hostname + subject_alt_name = x509.IPAddress(ipaddress.ip_address(hostname)) else: - alt_name = "DNS:" + hostname - cert.add_extensions( - [crypto.X509Extension(b"subjectAltName", False, alt_name.encode())] - ) + subject_alt_name = x509.DNSName(hostname) - cert.set_pubkey(k) - cert.sign(k, "sha512") + cert = ( + x509.CertificateBuilder() + .subject_name(subject) + .issuer_name(issuer) + .public_key(key.public_key()) + .serial_number(1000) + .not_valid_before(now) + .not_valid_after(now + timedelta(days=3650)) + .add_extension( + x509.SubjectAlternativeName([subject_alt_name]), + critical=False, + ) + .sign(private_key=key, algorithm=hashes.SHA512()) + ) with open(cert_path, "wb") as f: - f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + f.write(cert.public_bytes(serialization.Encoding.PEM)) with open(pkey_path, "wb") as f: - f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k)) + f.write( + key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption(), + ) + ) return diff --git a/requirements.txt b/requirements.txt index 32d6b61..c4ae51b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,5 +3,6 @@ pymongo>=3.7.2 tqdm requests flask -gevent -pyopenssl +gevent>= 23.9.1 +cryptography +soundfile \ No newline at end of file diff --git a/setup.py b/setup.py index 43fa261..93ce327 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setup( name="cpqdtrd", - version="1.1.0", + version="1.2.0", description="CPqD Dialog Transcription Client", install_requires=install_requires, author="Akira Miasato",