perl - Las secuencias de comandos se rompieron después de actualizar LWP "error de verificación de certificado"
www-mechanize (4)
Tengo muchas secuencias de comandos, la mayoría de ellas basadas en WWW::Mechanize
que raspa los datos de hardware misceláneos a los que se puede acceder a través de HTTP. Después de actualizar la mayor parte de mi instalación de Perl y sus módulos, todos los scripts que usan HTTPS: // se rompieron debido a un "certificate verify failed"
Esto es el resultado del hecho de que las versiones más recientes de LWP realizan una verificación adecuada del certificado y dies
si algo no coincide.
En mi caso, la autenticación de certificado fallida se espera debido a las circunstancias, por lo que tuve que encontrar una manera de eludir limpiamente esta comprobación.
@ikegami es un buen argumento para explicar por qué no desea deshabilitar la verificación del nombre de host SSL, pero no menciona directamente cómo evitarlo.
Si está hablando con un sistema público con un certificado firmado por una CA, debe apuntar a LWP a la colección de certificados raíz de su distribución. Bajo un sistema basado en Debian (Ubuntu, etc.), esto se mantiene bajo /etc/ssl/certs/
.
BEGIN {
$ENV{HTTPS_CA_DIR} = ''/etc/ssl/certs''
}
Si está hablando con su propio servidor con un certificado autofirmado, puede guardar una copia de ese certificado en el cliente y apuntar su script a ese archivo en particular.
BEGIN {
$ENV{HTTPS_CA_FILE} = ''/path/to/my/server-certificate.crt''
}
En su lugar, puede establecerlos en el entorno antes de ejecutar su script (por ejemplo, exportarlos desde su shell), o puede aplicar la configuración directamente a su objeto UserAgent. Vea la documentación de LWP :: UserAgent para más detalles; busque ssl_opts
(alrededor de la mitad de la página).
Di que quiero decirte algo, y no quiero que nadie más lo sepa. Organizaríamos una contraseña, y la usaría para cifrar el mensaje, luego le enviaría el mensaje.
¿Qué pasaría si no me asegurara de que la persona a quien le di la contraseña y el mensaje cifrado era usted? Entonces, cualquier número de personas podría simplemente hacerse pasar por usted y el cifrado sería en vano. Ese fue el estado del soporte HTTPS de LWP hasta hace poco.
Ahora, LWP realmente verifica con quién está hablando, a menos que le pida a LWP que se comporte como antes. Puedes hacerlo usando:
my $ua = LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
);
Si desea afectar a todas las instancias de LWP :: UserAgent en su script sin especificar la opción en todo el lugar, puede agregar lo siguiente a su script
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
O puede iniciar su script de la siguiente manera:
PERL_LWP_SSL_VERIFY_HOSTNAME=0 script.pl
Finalmente, si desea que LWP siempre sea inseguro, puede agregar lo siguiente a su secuencia de comandos de inicio de sesión:
export PERL_LWP_SSL_VERIFY_HOSTNAME=0
Sin embargo, no recomiendo ninguno de los anteriores . La opción mucho mejor sería proporcionar el certificado para el host con el que se está comunicando. (Esto equivale a agregar una excepción en Firefox, si sabe a qué me refiero). Consulte la documentation para $ua->ssl_opts
.
Incluí mi código con:
$ENV{''PERL_LWP_SSL_VERIFY_HOSTNAME''} = 0;
Esto causó que el script eludiera el cheque de una manera limpia y simple.
Para mi, usando:
my $ua = LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
);
Rendido
¡El uso predeterminado de SSL_verify_mode de SSL_VERIFY_NONE para el cliente está en desuso! Configure SSL_verify_mode en SSL_VERIFY_PEER junto con SSL_ca_file | SSL_ca_path para su verificación. Si realmente no desea verificar el certificado y mantener la conexión abierta a los ataques Man-In-The-Middle, configure SSL_verify_mode explícitamente en SSL_VERIFY_NONE en su aplicación.
El uso de esto no dio ninguna advertencia:
my $ua = LWP::UserAgent->new(
ssl_opts => { SSL_verify_mode => ''SSL_VERIFY_NONE''},
);