- PR -

HTTPSのWEBサーバにあるコンテンツをPerlのコマンドで取得したい

1
投稿者投稿内容
ゆいな
ベテラン
会議室デビュー日: 2006/01/19
投稿数: 89
投稿日時: 2007-11-19 10:37
Linux+OpenSSL+Perlで
HTTPSのWEBサーバにあるコンテンツをPerlのコマンドで
取得したいのですが、うまくいきません。
どうやら、標準入力をOpenSSLのコマンドに引き渡せてないようです。
下記のコードにおかしなところはありますか?
週末からずっと悩んでいますが、解決できませんので
書き込みさせていただきました。

-----
#!/usr/bin/perl

$data = "GET /index.html HTTP/1.1\\r\\n";
$cmd = "openssl s_client -connect webmail.hs.kddi.ne.jp:443";
open(CMD, "echo -e $data | $cmd |");
@cmd=<CMD>;
print @cmd;

./test.pl
depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
verify error:num=20:unable to get local issuer certificate
verify return:0
DONE
CONNECTED(00000003)
---
Certificate chain
.....

.....
CE4484A32C75C257DCAE55
Key-Arg : None
Krb5 Principal: None
Start Time: 1195436246
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
#
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2007-11-19 12:30
SSLの認証は,信頼するCA が発行した証明書は信頼できるというものです.
どのCA を信頼するかは,クライアント側で情報を与えてやる必要があります.
その情報が足りない為に
> verify error:num=20:unable to get local issuer certificate
というエラーが出ています。

openssl s_clientコマンドのオプション(-CAfile)で
CAの証明書を与えてやればこのエラーは出なくなると思います。
ゆいな
ベテラン
会議室デビュー日: 2006/01/19
投稿数: 89
投稿日時: 2007-11-19 13:58
お世話になります。

ご回答ありがとうございました。
早速、CAの証明書
(ブラウザーからベリサインという事がわかりましたので
 エクスポートしてサーバにUpしました)
を指定しました。

"Verify return code: 0 (ok)"
となりましたので、証明書系では問題はないかと思いましたが
/index.htmlの結果が取得できません。
シェルでなく、コマンドプロンプトから
 1.opensslコマンド実行⇒入力待ち、
 2.GET /index.html HTTP/1.1
を入力すると結果が取得できます。

よろしくお願いします。

---
#!/bin/sh

data="GET /index.html HTTP/1.1\\r\\n\\r\\n\\r\\n";
cmd="openssl s_client -connect webmail.hs.kddi.ne.jp:443 -CAfile /root/synclock/certs/ca.c
er";
echo -e $data | $cmd



# ./test.sh
CONNECTED(00000003)
depth=2 /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
verify return:1
depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
verify return:1
depth=0 /C=JP/ST=Tokyo/L=Shinjuku-ku/O=KDDI CORPORATION/OU=Network Operations Center -01/CN=webmail.hs.kddi.ne.jp
verify return:1
---
Certificate chain
0 s:/C=JP/ST=Tokyo/L=Shinjuku-ku/O=KDDI CORPORATION/OU=Network Operations Center -01/CN=webmail.hs.kddi.ne.jp
i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
1 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----

.....

.....

-----END CERTIFICATE-----
subject=/C=JP/ST=Tokyo/L=Shinjuku-ku/O=KDDI CORPORATION/OU=Network Operations Center -01/CN=webmail.hs.kddi.ne.jp
issuer=/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
---
No client certificate CA names sent
---
SSL handshake has read 3061 bytes and written 332 bytes
---
New, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA
Server public key is 1024 bit
SSL-Session:
Protocol : TLSv1
Cipher : EDH-RSA-DES-CBC3-SHA
Session-ID: FB014F22D1EFCEC5FF8D74675D721BA360B2362A4B9038F9607962E390ADBC84
Session-ID-ctx:
Master-Key: 2AFF7962092F9BC884027B6CE6721952266B8B1FD5E6488F148BD09938AC267771429FC3D59B6F85509AA597FBE80B27
Key-Arg : None
Krb5 Principal: None
Start Time: 1195448276
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE
#

blunder
ベテラン
会議室デビュー日: 2003/09/11
投稿数: 65
投稿日時: 2007-11-19 14:26
opensslに-ign_eofオプションをつけるとよいです。
他にも問題ありそうですが、とりあえず。
覚えたて
会議室デビュー日: 2004/10/27
投稿数: 2
投稿日時: 2007-11-19 16:06
OpenSSLのコマンドではないのですが、
IO::Socket::SSLが使えるなら
コード:
#!/usr/bin/perl

use IO::Socket::SSL;

$client = IO::Socket::SSL->new("www.example.com:https");
if ($client) {
        print $client "GET / HTTP/1.1¥r¥n";
        print $client "Host: www.example.com¥r¥n¥r¥n";
        print <$client>;
        close $client;
} else {
        warn "I encountered a problem: ",
        IO::Socket::SSL::errstr();
}


¥は半角です
でいけると思いますが、これじゃだめですか?
1

スキルアップ/キャリアアップ(JOB@IT)