Find SSL Version after Handshake in OpenSSL...
Si je suis analyse ce que vous voulez bien ... vous voulez la version du protocole comme imprimé par openssl s_client
:
$ openssl version
OpenSSL 1.1.0b 26 Sep 2016
$ openssl s_client -connect www.google.com:443 -servername www.google.com
CONNECTED(00000005)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
Server did acknowledge servername extension.
---
...
---
New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305
Server public key is 2048 bit
Secure Renegotiation IS supported
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
...
Le premier message de "Nouveau TLSv1.2" vous parle du chiffre. C'est-à-dire, quand ECDHE-RSA-CHACHA20-POLY1305
est arrivé le premier dans TLS. Dans le cas de ECDHE-RSA-CHACHA20-POLY1305
, la suite de chiffrement a été vue pour la première fois dans TLS 1.2. Le code source de s_client
est situé au <openssl src>/apps/s_client.c
. Le code responsable dans OpenSSL 1.0.2 est autour de la ligne 2210:
/* line 2210 */
c = SSL_get_current_cipher(s);
BIO_printf(bio, "%s, Cipher is %s\n",
SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
...
Le deuxième message de « Protocole: TLSv1.2 » vous indique la version du protocole utilisé lors de l'échange de clés et la sélection de chiffrement et le transfert ultérieur en vrac.
Le code responsable OpenSSL 1.0.2 est <openssl src>/ssl/ssl_txt.c
autour de la ligne 105:
/* line 105 */
int SSL_SESSION_print(BIO *bp, const SSL_SESSION *x)
{
unsigned int i;
const char *s;
if (x == NULL)
goto err;
if (BIO_puts(bp, "SSL-Session:\n") <= 0)
goto err;
if (x->ssl_version == SSL2_VERSION)
s = "SSLv2";
else if (x->ssl_version == SSL3_VERSION)
s = "SSLv3";
else if (x->ssl_version == TLS1_2_VERSION)
s = "TLSv1.2";
else if (x->ssl_version == TLS1_1_VERSION)
s = "TLSv1.1";
else if (x->ssl_version == TLS1_VERSION)
s = "TLSv1";
else if (x->ssl_version == DTLS1_VERSION)
s = "DTLSv1";
else if (x->ssl_version == DTLS1_2_VERSION)
s = "DTLSv1.2";
else if (x->ssl_version == DTLS1_BAD_VER)
s = "DTLSv1-bad";
else
s = "unknown";
if (BIO_printf(bp, " Protocol : %s\n", s) <= 0)
goto err;
...
}
I want to find out the protocols supported by a target but the problem is that their are quite a number websites which are not supporting a particular version but when i performed handshake ...
C'est un autre problème. Vous devriez regarder le code source pour sslscan
à SSLScan - Fast SSL Scanner pour voir comment cela fonctionne. Le Sourceforge semble abandonné. Il manque SNI et d'autres nouvelles fonctionnalités, comme la négociation sécurisée et ALPN.
Vous pouvez essayer ce sslscan
de GitHub: rbsec/sslscan. Le GitHub est activement maintenu et semble être plus à jour.
example : i passed a version :TLSVersion.TLS_1_2 but the handshake is performed using TLSv1_0 becz it is not supporting TLSVersion.TLS_1_2
Cela ne se produira pas. TLS spécifie une seule version de protocole. L'idée est votre essai TLS 1.2. Si cela échoue, vous revenez à TLS 1.1. Si cela échoue, vous revenez à TLS 1.0. Ad infinitum.
L'approche try-and-fallback est la raison de RFC 7504, TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks. C'était un affreux groupe-aide de la foule du navigateur. Voir, par exemple, Last Call: (TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks) to Proposed Standard.
TLS ne pas accepter une gamme de versions de protocole comme beaucoup de gens pensent. Nous avons essayé de le changer plusieurs fois. Voir, par exemple, A new TLS version negotiation mechanism.
Je n'ai pas cette fonction dans ma version. --python-openssl est déjà la version la plus récente (0.15.1-2build1) –
@hassan_anwer: pour me citer: * "ces fonctions ne sont disponibles que depuis pyOpenSSL 0.16.0" *. Et puisque la [version actuelle est 0.16.2] (https://pypi.python.org/pypi/pyOpenSSL/16.2.0) votre version 0.15.1 n'est évidemment pas la plus récente. Il pourrait être le plus récent livré avec votre système mais c'est une chose différente. –
@hassan_anwer: dans le cas où votre système ne fournit pas la version nécessaire de pyOpenSSL et que vous ne savez pas comment l'installer, vous pouvez installer [anaconda python] (https://www.continuum.io/downloads) qui inclut pyOpenSSL 0.16 . Cela peut être installé séparément de votre python existant. –