2013-04-22 29 views
5

現在、PHPでソケットストリームを使用してサーバーとクライアント間でデータを交換するためにtcpソケットを使用しています。私は各クライアントに私のサーバーにアクセスするための固有の証明書(私はそれらのために生成する)を持たせて、私が知っている人だけがそれを使用できるようにします。 SSLソケット接続を可能にするサーバー側で証明書を使用する方法のみを検索して見つけましたが、実際に必要なのはクライアントサーバー証明書を使用してサーバーに接続しているクライアントを識別することです。これはPHPを使って可能ですか?このクライアント側の証明書をPHP - SSLソケットクライアント証明書

$clientCert = './clientCert.pem'; 
$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $clientCert); 
$server = stream_socket_client('ssl://IP', $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 

をしかし、どのようにサーバー・ハンドルは(など、識別し)ん:

私はこのように接続するためのクライアントを想像するだろうか?

私は私の質問ではっきりしていました。

事前のおかげで、 ラファエル

答えて

1

あなたはtrueverify_peerを設定する​​を使用する必要があります。これには、クライアントの証明書が信頼されていることを相手側が検証する必要があります。検証は、証明書が信頼できる機関によって署名されていることを確認することによって行われます。したがって、機関の公開鍵が見つかる場所をcafileまたはcapathオプションで指定する必要があります。

クライアント側での両方がサーバー側(クライアントを認証できるようにする)であることにも注意してください。明示的に指定しない限り、サーバーも認証されません。

+0

さて、クライアントでは、verify_peerをtrueに設定し、_server_の鍵のパスにカフェする必要がありますか?サーバー上にstream_contextも作成する必要がありますか?はいの場合は、どのオプションを設定する必要がありますか? Btw、すばやい返信をありがとう! – user2308602

+0

@ user2308602:クライアントを実際に認証する場合は、サーバー上にストリームコンテキストを作成する必要があります。クライアント側と同じオプションですが、すべてが対称です。 – Jon

+0

サーバコードに何かがないことが必要です。現在、ソケットを開始した人は、証明書がなくても正常に接続できます。 サーバー側では、次のオプションを使用してコンテキストを作成します。 local_cert = myCert.pem; verify-peer = true; allow_self_signed = false; cafile = myKey.pem; その後、私はソケットを作成: '$サーバー= stream_socket_server( 'SSL://0.0.0.0:500'、$ errnoに、$ errstrは、STREAM_SERVER_BIND | STREAM_SERVER_LISTEN、$ streamContext);' との接続に耳を傾ける: ' while(真){ $クライアント=ストリーム_ソケット_($サーバー); echo 'client connected'; } ' アイデア? – user2308602