IO :: Socket :: SSL verifica se o nome no certificado corresponde ao nome ao qual você se conecta, mas o Crypt :: SSLeay não. O LWP mais recente também verifica a cadeia de certificados por padrão, mas talvez isso também tenha sido feito com a versão antiga do LWP que você usou.
Eu recomendo que você chame seu programa com depuração SSL para ver a causa real do problema:
perl -MIO::Socket::SSL=debug4 program.pl
Então você pode controlar com ssl_opts
quais verificações devem ser feitas, veja perldoc IO::Socket::SSL
para mais detalhes sobre as opções:
- Use
SSL_ca_file
se você estiver usando um certificado autoassinado ou se o certificado não for emitido por nenhuma das CAs raiz comumente confiáveis. - Use
SSL_verifycn_name
para definir o nome esperado no certificado. Isto é, se você tiver um nome parawww.example.com
no certificado, mas se conectar ao host comlocalhost
, você deve definirSSL_verifycn_name => 'www.example.com'
- Como alternativa, você pode usar
SSL_fingerprint
para verificar apenas a impressão digital do certificado e desativar outras verificações. - E, finalmente, você pode desativar qualquer tipo de verificação com
SSL_verify_mode
. Mas isso é apenas uma solução alternativa e você nunca deve fazer isso no código de produção, porque isso faz com que você abra para ataques man-in-the-middle.
Como você não pode definir ssl_opts diretamente com lwp-request
, em vez disso, recomendo usar um programa pequeno, por exemplo:
use LWP::UserAgent;
my $ua = LWP::UserAgent->new( ssl_opts => {
SSL_ca_file => 'myca.pem',
SSL_verifycn_name => 'www.example.com',
});
print $ua->get('https://...')->as_string;