3

IO::Socket::INETTCP:110 で開いているソケットの読み取りと書き込みに使用する POP3 ログイン テスト スクリプトがあります。これは私が慣れているものです: -

my $sock = IO::Socket::INET->new(
    PeerAddr    =>  "$h:$port",
    Proto       =>  "tcp",
) or die "$!\n";

ただし、SSL で保護された POP3S (TCP:995) を介して同じ POP3 会話をテストする必要もあります。

コマンドラインで次を使用できることがわかりました。これにより、「telnet hostname 110」と同様の状態になりますが、暗号化されます。

openssl s_client -crlf -connect hostname:995

私はopensslコマンドである種の読み取り/書き込みFileHandleまたはソケットを設定できる方法を見つけたいと思っています。これは空になるまで読み取ることができ、必要なPOP3コマンドを書き込み、応答を読み取ることができます。の上...

画面に表示されているので、つかむには十分近いように感じますが、「取得」して先に進むには、perl の使い方がよくわかりません!

残念ながら、このスクリプトが実行されるサーバーには、それ以上の perl モジュールをインストールすることができません。これは明らかな解決策であった可能性があります。

アップデート

インスピレーションをくれた @ventatsu のおかげで、私は今、次のIPC::Open2ように使用しています: -

my ($sslread,$sslwrite);
my $ssl_fh = open2(
    $sslread,
    $sslwrite,
    "openssl s_client -crlf -connect mail.example.com:995"
) or die "$!\n";

while (<$sslread>) {
    print;
    if (/^\+OK.*$/) {
        ## Try to log in
        print $sslwrite "USER $u\r\n";
        print "USER $u\n";
        while (<$sslread>) {
            print;
            if (/^\+OK.*$/) {
                ## Keep going
                print $sslwrite "PASS $p\r\n";
                print "PASS $p\n";
                while (<$sslread>) {
                    print;
                }       
            }       
        }       
        print $sslwrite "QUIT"; 
        print "QUIT\n";
    }       
}       

waitpid( $ssl_fh, 0 );
my $child_exit_status = $? >> 8;

私の非SSLテストスクリプトは次のように機能します: -

Testing pop3 on mail.example.com:110
+OK The Microsoft Exchange POP3 service is ready.
USER mailtest@example.com
+OK
PASS Abcd3fGh
+OK User successfully logged on.

次のように、CLI のインタラクティブ SSL セッションで POP3 コマンドを実行すると、資格情報は正常に機能します。

openssl s_client -crlf -connect mail.example.com:995
<snip out the SSL bumph />
+OK The Microsoft Exchange POP3 service is ready.
USER mailtest@example.com
+OK
PASS Abcd3fGh
+OK User successfully logged on.

しかし、私の SSL テスト スクリプトは次のようにしか機能しません。

Testing pop3s on mail.example.com:995
<snip out the SSL bumph />
+OK The Microsoft Exchange POP3 service is ready.
USER mailtest@example.com
+OK
PASS Abcd3fGh
-ERR Logon failure: unknown user name or bad password.

私は何を間違っていますか?

4

1 に答える 1

1

を使用IPC::Open2して、2 つのファイル ハンドル (1 つはプログラムの入力に、もう 1 つは出力に) をアタッチできます。本当に使いたいものに近いかもしれませんが、暗号化されIO::Socket::SSLているように機能します。IO::Socket::INET

更新: 私の推測では、\rキャラクターを 2 倍にすることです。s_client -crlf改行をキャリッジリターン+改行に変換するためのmanページによると。$sslwrite送信するハンドルに印刷するとき"\r\n"。その結果、サーバーは各コマンドの最後に「\r\r\n」を受け取ることになると思います。おそらく、プログラムのコマンド-crlfからを削除したいと思うでしょう。openssl

于 2012-05-25T18:44:25.340 に答える