2011-07-15 45 views
2

私は新しくインストールしたUbuntuサーバーのfsockopen()を使ってPHPでSMTPサーバーとのTLS接続を確立しようとしています。私はほとんどすべてを試して、何時間もグーグルで探検したが、それでも私はそれを働かせなかった。次のようにfsockopen経由でPHPにTLS接続を確立できません

PHPコードが見えます:

$fp = fsockopen("tls://smtp.xxxx.com", 25, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
// some other stuff 
} 

出力はちょうど(0)​​、すなわち、$ errstrは=ヌルと$ errnoに= 0

のOpenSSLがインストールされ、有効化されている。

OpenSSL support: enabled 
OpenSSL Library Version: OpenSSL 0.9.8o 01 Jun 2010 
OpenSSL Header Version: OpenSSL 0.9.8o 01 Jun 2010 

以下のストリームソケットトランスポートが登録されています。 tcp、udp、unix、udg、ssl、sslv3、sslv2、tls。

ポートはコンソールからのtelnetとして動作します。

何が間違っているか、少なくとも私はいくつかのデバッグ出力を得ることができますか?

おかげで、 マルクス

+0

エラーログは、 '/ etc/php/apache2/php.ini'で有効になっていますか?エラーログには何が表示されますか? – Femi

+0

はい、有効です。 Apacheのエラーログのエラーは次のとおりです。 [Fri Jul 15 15:50:07 2011] [エラー] [クライアント95.233.109.135] PHPの警告:fsockopen():tls://smtp.gmailに接続できません。 com:587(不明なエラー)/var/www/test.php 3行目 私はそれをテストしました。コマンドラインから "php test.php"を介してスクリプトを実行すると動作します。 –

答えて

4

は、あなたの接続にはあまり意味がありません。 TLSハンドラを使用すると、データが送信される前にTLSを設定する必要があります。しかし、ポート25は標準SMTPであり、最初に暗号化されていない通常の接続で接続したTLS AFTERしか確立できません。最初の接続が確立されたら、STARTTLSコマンドでTLSを有効にして、SMTPサーバーに切り替えを指示できます。

get-goからTLSを使用する場合は、最初からssl/tlsであるポート465を使用します。

+0

ポート465または587で動作しませんが、静的なパブリックIP btwを持つApache経由でコマンドラインから直接スクリプトを呼び出すと動作します。 –

+0

'fsockopen( 'smtp .xxx.com '、25) 'プロトコルを指定しません。それが接続しても、tlsのバージョンはそうでないなら、それはSSLのものでうんざりです。 –

+0

これはうまくいきますが、最初にtls://を追加するとすぐにApacheからは動作しなくなりますが、コマンドラインから引き続き動作します。 –

0

コマンドラインからは動作しますが、Apache内では動作しない場合、PHPの設定には多少の違いがあります:/etc/php/apache2/php.ini/etc/php/cli/php.iniの間にdiffがあり、何が変更されたかを確認してください。

+0

良いチップ。しかし、それほど大きな違いはありません。私はdiffをしましたが、唯一の違いはApacheの短いタグとメモリの制限が違うことです。 –

2

gmailの場合、ssl接続ポートはget-goのsslを持っていましたが、tlsポートはplainで接続されていて、STARTTLSコマンドで手動で起動する必要がありました。私はこれが同じであると推測しています。ここで、Gmailの例を見れば、何が起こっているのかを見ることができます。 EHLOコマンドはSTARTTLSコマンドを表示しますが、最初からsslで起動すると、AUTH XOAUTHコマンドリストに行きます。

<?php 
function get($socket,$length=1024){ 
    $send = ''; 
    $sr = fgets($socket,$length); 
    while($sr){ 
     $send .= $sr; 
     if($sr[3] != '-'){ break; } 
     $sr = fgets($socket,$length); 
    } 
    return $send; 
} 
function put($socket,$cmd,$length=1024){ 
    fputs($socket,$cmd."\r\n",$length); 
} 
if (!($smtp = fsockopen("smtp.gmail.com", 587, $errno, $errstr, 15))) { 
    die("Unable to connect"); 
} 
echo "<pre>\n"; 
echo get($smtp); // should return a 220 if you want to check 

$cmd = "EHLO ${_SERVER['HTTP_HOST']}"; 
echo $cmd."\r\n"; 
put($smtp,$cmd); 
echo get($smtp); // 250 

$cmd = "STARTTLS"; 
echo $cmd."\r\n"; 
put($smtp,$cmd); 
echo get($smtp); // 220 
if(false == stream_socket_enable_crypto($smtp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)){ 
    // fclose($smtp); // unsure if you need to close as I haven't run into a security fail at this point 
    die("unable to start tls encryption"); 
} 

$cmd = "EHLO ".$_SERVER['HTTP_HOST']; 
echo $cmd; 
put($smtp,$cmd); 
echo get($smtp); // 250 

$cmd = "QUIT"; 
echo $cmd."\r\n"; 
put($smtp,$cmd); 
echo get($smtp); 

echo "</pre>"; 

fclose($smtp); 
関連する問題