2017-11-20 6 views
-1

私はCLIのPHPスクリプトを作成しています。いくつかのデータをフェッチして処理します。それはそうなど、時々遅いインターネットを持っているので、私は、DNSルックアップを示すために、スクリプトにいくつかの冗長性を追加接続したかっにPHPでIP(既知のホスト名を使用)経由でHTTPSサイトに接続しようとしましたが、「ピア証明書...期待どおりのCNと一致しません...」

を実行しているシステムでは、私は無地file_get_contents()を使用してから切り替えてTCPを作成するために余分な努力をしてソケット、手動でHTTPデータなどを送信するので、これらの個別の操作にステータス更新を散在させることができます。

しかし、最初のDNSルックアップおよび接続には最大5秒かかることがあります。そのほとんどは、8.8.8.8からのランダムな低速のためです。だから、私はDNSルックアップと実際の接続コールの間に得ることができるかどうかを確認することにしました。

$ip = gethostbyname('google.com.'); 

$stream = stream_socket_client('tls://'.$ip.':443/'); 

まあ、残念ながら...

PHP Warning: stream_socket_client(): Peer certificate CN=`*.google.com' did not 
match expected CN=`216.58.196.142' in ... 

PHP Warning: stream_socket_client(): Failed to enable crypto in ... 

PHP Warning: stream_socket_client(): unable to connect to tls://216.58.196.142:443/ 
(Unknown error) in ... 

...これはPHPのTLSを引き起こしスタックがフリークアウトする。 これは完全に適切で正しく構成されており、ホスト名ではなくIPアドレスのみを表示するバグではなく、消化不良を起こす正当な理由があります。

(... PHPはない、その後に行くと、「不明なエラー」として「これはMITM攻撃することができ、」要約...手のひらを顔に当てるべきであるが;しかし、私は脱線)

私の根本的な問題カール、ソケット、ストリームのどちらも、「接続しようとしている」、「DNSルックアップを行っています」、「接続されました」などの通知などのイベントコールバックを提供していないことです。 :(

+0

このリモートサイトはこのような操作を許可していますか? – nogad

+0

@nogad:どういう意味ですか?これは標準のHTTPSサーバーです。テストでは、google.comを使用していますが、これは事実上同等です。 –

答えて

0

することは私たちは、これは悪い考えである理由を説明する必要はありません。PHPストリーム経由でHTTPSを再実装しようとしないでください。

  1. あなたがDNSルックアップをスキップしたい場合は、/etc/hostsを使用しています。[スーパー悪いアイデア]

  2. それは超悪いアイデアだ、DNSをスキップしないでください。

    PHPにも、ほとんどのLinuxディストリビューションのいずれもが、通常、あなたのPHPのアプリが尖っているものは何でもDNSサーバハンマリングにもたらされるローカルDNSリゾルバ/キャッシュを実装で、悪いもしあなたが虚偽のDNSサーバを指しているならば。

    をだから、どちらかの[あなたのケースで私が打っているので、あなたが絞られているばかり賭けるのに]:例えば、ローカルネットワーク内のどこかに

    1. ポイントキャッシュリゾルバ:プロバイダの。
    2. マシンに単純なキャッシングDNSリゾルバをインストールします(例:nscd、dnsmasq、またはbind)。

     

    てみませんか。この後、まともな事は、あなたのプロバイダにこの問題をエスカレートした後、あなたまだは、DNSの待ち時間の問題がある場合。

関連する問題