Les subtilités de la validation des certificats SSL avec LWP <guillomovitch@gmail.com> mercredi 18 janvier 2012
Sommaire Le problème 1 Le problème 2 3
Avancement Le problème 1 Le problème 2 3
HTTPS Le problème Protocole SSLv2 SSLv3 TLS v1.0 (RFC 2246, 1999) TLS v1.1 (RFC 4346, 2006) TLS v1.2 (RFC 5246, 2008) Intérêts confidentialité authentification
HTTPS Le problème Protocole SSLv2 SSLv3 TLS v1.0 (RFC 2246, 1999) TLS v1.1 (RFC 4346, 2006) TLS v1.2 (RFC 5246, 2008) Intérêts confidentialité authentification
Authentification du serveur Deux éléments nom de l hôte origine du certificat Validation du nom de l hôte identité du nom avec le sujet (cn) possibilité de joker possibilité de noms alternatifs (subjaltname) Validation de l origine du certificat autorité de certification
Authentification du serveur Deux éléments nom de l hôte origine du certificat Validation du nom de l hôte identité du nom avec le sujet (cn) possibilité de joker possibilité de noms alternatifs (subjaltname) Validation de l origine du certificat autorité de certification
Authentification du serveur Deux éléments nom de l hôte origine du certificat Validation du nom de l hôte identité du nom avec le sujet (cn) possibilité de joker possibilité de noms alternatifs (subjaltname) Validation de l origine du certificat autorité de certification
Support dans LWP Deux implémentations alternatives Net::SSL IO::Socket::SSL Net::SSL distribué dans Crypt-SSLeay dépend de Crypt::SSLeay, distribué conjointement IO::Socket::SSL distribué dans IO-Socket-SSL dépend de Net::SSLeay, distribué séparemment
Support dans LWP Deux implémentations alternatives Net::SSL IO::Socket::SSL Net::SSL distribué dans Crypt-SSLeay dépend de Crypt::SSLeay, distribué conjointement IO::Socket::SSL distribué dans IO-Socket-SSL dépend de Net::SSLeay, distribué séparemment
Support dans LWP Deux implémentations alternatives Net::SSL IO::Socket::SSL Net::SSL distribué dans Crypt-SSLeay dépend de Crypt::SSLeay, distribué conjointement IO::Socket::SSL distribué dans IO-Socket-SSL dépend de Net::SSLeay, distribué séparemment
LWP 5.x Le problème Comportement pas de validation par défaut Net::SSL est la classe prioritaire Configuration validation de l origine du certificat par la classe sous-jacente : variable d environnement HTTPS_CA_FILE pour Net::SSL appel à IO::Socket::SSL::set_ctx_defaults pour IO::Socket::SSL validation du nom du serveur par LWP : entête If-SSL-Cert-Subject
LWP 6.x Le problème Comportement validation par défaut IO::Socket::SSL est la classe prioritaire Configuration abstraction du mécanisme de contrôle de la classe sous-jacente : méthode ssl_opts mais la validation du nom de serveur ne fonctionne qu avec IO::Socket::SSL validation native toujours possible
Choix de la classe Détermination automatique utiliser la classe prioritaire si elle est déjà chargée utiliser l autre classe si elle est déjà chargée tenter de charger la classe prioritaire tenter de charger l autre classe Détermination manuelle variable Net::HTTPS::SSL_SOCKET_CLASS variable d environnement PERL_NET_HTTPS_SSL_SOCKET_CLASS
Choix de la classe Détermination automatique utiliser la classe prioritaire si elle est déjà chargée utiliser l autre classe si elle est déjà chargée tenter de charger la classe prioritaire tenter de charger l autre classe Détermination manuelle variable Net::HTTPS::SSL_SOCKET_CLASS variable d environnement PERL_NET_HTTPS_SSL_SOCKET_CLASS
Avancement Le problème 1 Le problème 2 3
Agent FusionInventory Capacités dépendantes l environnement présence de IO::Socket::SSL : support https complet présence de Net::SSL : support https, sans validation de certificat aucun des deux : pas de support https
LWP6 Le problème FusionInventory::Agent::HTTP::Client $ua->ssl_opts(ssl_ca_file => $self->{ca_cert_file}) if $self->{ca_cert_file}; $ua->ssl_opts(ssl_ca_path => $self->{ca_cert_dir}) if $self->{ca_cert_dir};
LWP5 Le problème FusionInventory::Agent::HTTP::Client # use a custom HTTPS handler to workaround # default LWP5 behaviour FusionInventory::Agent::HTTP::Protocol::https->require(); FusionInventory::Agent::HTTP::Protocol::https->import( ca_cert_file => $self->{ca_cert_file}, ca_cert_dir => $self->{ca_cert_dir}, ); LWP::Protocol::implementor( https, FusionInventory::Agent::HTTP::Protocol::https );
LWP5 Le problème FusionInventory::Agent::HTTP::Protocol::https sub import { my ($class, %params) = @_; IO::Socket::SSL::set_ctx_defaults( ca_file => $params{ca_cert_file} ) if $params{ca_cert_file}; IO::Socket::SSL::set_ctx_defaults( ca_path => $params{ca_cert_dir} ) if $params{ca_cert_dir}; } sub _extra_sock_opts { my ($self, $host, $port) = @_; return ( SSL_verify_mode => SSL_VERIFY_PEER, SSL_verifycn_scheme => http, SSL_verifycn_name => $host ); }
Avancement Le problème 1 Le problème 2 3
Nouveau problème Échec de la validation warning: TLS library problem: 14710:error:0D0C50A1:asn1 encodin routines:asn1_item_verify:unknown message digest algorithm:a_ve Examen du certificat Signature Algorithm: sha256withrsaencryption
Nouveau problème Échec de la validation warning: TLS library problem: 14710:error:0D0C50A1:asn1 encodin routines:asn1_item_verify:unknown message digest algorithm:a_ve Examen du certificat Signature Algorithm: sha256withrsaencryption
Support des algorithmes sha256 TLS v1.1 openssl 0.9.8o