3

これは私の最初のPerlスクリプトです。CPANを使用してSOAP::Liteをインストールしましたが、問題がないようです。

単純なHelloWorld.NETWebサービスにアクセスしようとしています。PerlまたはSOAP::LiteがSSL証明書を検証できないことに関連していると思われるエラーが発生します。

500のコードを返しているように見えますが、Webメソッドを正常に呼び出すことができるJavaクライアントを作成したので、問題はWebサービス側にあるとは思いません。

誰かが私がこれをどのように機能させることができるかについて正しい方向に私を向けることができますか?

脚本:

#!/usr/bin/perl

use SOAP::Lite 'trace', 'debug';

$api_ns = "https://www.mydomain.com/edgedev/";
$api_url = "https://www.mydomain.com/edgedev/ws.asmx";
$action = "HelloWorld";

my $soap = SOAP::Lite
                -> readable(1)
                -> ns($api_ns, 'tns')
                -> proxy($api_url)
                -> on_action(sub { return "\"$action\""});

print $soap->HelloWorld()->result;

結果

<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="https://www.mydomain.com/edgedev/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <tns:HelloWorld xsi:nil="true" />
      </soap:Body>
</soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: 500 Can't connect to www.mydomain.com:443 (certificate verify failed)
Content-Type: text/plain
Client-Date: Tue, 12 Feb 2013 16:40:28 GMT
Client-Warning: Internal response

Can't connect to www.mydomain.com:443 (certificate verify failed)

You can disable hostname check by setting environment variable PERL_LWP_SSL_VERIFY_HOSTNAME=0

LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/lib/perl5/vendor_perl/5.10.0/LWP/Protocol/http.pm line 57.
500 Can't connect to www.mydomain.com:443 (certificate verify failed) at ./soaptest.pl line 15
4

8 に答える 8

7

SSL ホスト名チェックを無効にすることなく、これを安全に機能させる方法を次に示します。

CA 署名付き証明書を使用してパブリック システムと通信している場合は、LWP をディストリビューションのルート証明書コレクションにポイントする必要があります。Debian ベースのシステム (Ubuntu など) では、これは の下に保持され/etc/ssl/certs/ます。

BEGIN {
    $ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}

自己署名証明書を使用して独自のサーバーと通信している場合は、その証明書のコピーをクライアントに保存し、スクリプトでその特定のファイルを指すことができます。

BEGIN {
    $ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}

代わりに、スクリプトを実行する前に環境でこれらを設定する (シェルからエクスポートするなど) か、設定を UserAgent オブジェクトに直接適用することができます。詳細については、LWP::UserAgent のドキュメントを参照してください。を検索しssl_optsます。

于 2015-01-09T20:51:20.073 に答える
3

$soap->{_transport}->{_proxy}->{ssl_opts}->{verify_hostname} = 0;

于 2013-12-17T13:23:29.333 に答える
2

このスレッドを見つけたばかりで、すべてが私にとって非常に役に立ちました。ありがとう!

他の人に役立つ場合に備えて、以前のもののバリエーションである「ソリューション」を追加したかったのです。

追加する

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

は間違いなく重要です。ただし、これにより、次の大きな警告が表示されますIO::Socket::SLL

*******************************************************************
 Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
 is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
 together with SSL_ca_file|SSL_ca_path for verification.
 If you really don't want to verify the certificate and keep the
 connection open to Man-In-The-Middle attacks please set
 SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************

その警告を取り除く方法は、次の行を追加することでした:

use IO::Socket::SSL;
IO::Socket::SSL::set_defaults(SSL_verify_mode => "SSL_VERIFY_NONE");

元の に加えて、使用しているクライアント ( 、、など)に$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}関係なく動作するはずです。LWP::UserAgentRPC::XML::ClientSOAP::Lite

それが他の誰かを助けることを願っています!

于 2016-04-01T19:15:07.437 に答える
1

perl v5.20.2 では、ssl 証明書の検証を無効にするために 2 つのことが必要でした。

SOAP オブジェクトの作成前 (私はそれを一番上に置きました)

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

次に、SOAP プロキシを変更します。

my $soap = SOAP::Lite
            -> readable(1)
            -> ns($api_ns, 'tns')
            -> proxy($api_url, ssl_opts => [ SSL_verify_mode => 0 ] )
            -> on_action(sub { return "\"$action\""});
于 2015-07-08T09:16:24.037 に答える