2010-06-30 5 views
4

Supposons que je dispose d'un code PHP exécuté à l'intérieur d'un serveur Web, par exemple, en exécutant une simple application CakePHP. A partir de cette application, je veux occasionnellement faire une connexion TLS sur un serveur pour échanger des données. Comment cela est-il typiquement fait? (J'ai peu d'expérience avec PHP.)Comment faire une connexion TLS à partir de PHP sur un serveur web, et en toute sécurité

Quels plugins ou bibliothèques PHP ou autre, sont recommandés pour accomplir les connexions TLS? Où sont les bons endroits pour commencer à chercher? (Mes premières recherches Google me donnent un énorme rapport entre le bruit et le signal.)

Quels sont les problèmes de sécurité liés à l'installation de la clé privée X509 sur le serveur Web? Pour faire une connexion TLS, je vais avoir besoin à la fois du certificat X509 et de la clé privée correspondante, comme peut-être des fichiers PEM, ou des fichiers DER, ou dans un keystore Java, ou autre. Cette clé privée va-t-elle rester vulnérable sous la racine web? Comment cela est-il généralement géré? Quels sont les problèmes de sécurité, en particulier, de la sécurisation de la clé privée à utiliser pour établir une connexion TLS? Quelles sont les meilleures pratiques? Edit: J'ai oublié de mentionner que le serveur auquel l'application PHP se connecte nécessite un certificat client pour être présenté. Le client a besoin de la clé privée pour se connecter. En outre, le serveur auquel je me connecte est et non un serveur HTTP - J'ai juste besoin de lire/écrire sur une connexion socket simple au serveur (via la connexion SSL/TLS).

Répondre

7

TLS est le nom correct, mais la plupart des gens l'appellent encore SSL. En PHP, vous pouvez faire cette connexion using CURL.

Avec un client TLS/SSL, vous n'avez besoin que de la clé publique pour vérifier un hôte distant. Cette clé publique est juste publique, peu importe qu'elle soit divulguée à un attaquant. Du côté serveur, Apache a accès à la fois aux clés publique et privée. Ces clés sont protégées en utilisant les privilèges d'accès aux fichiers normaux. Sous les systèmes * nix, ces clés sont généralement stockées quelque part dans /etc/, appartenant au processus Apache et chmod 400 est le meilleur.

La méthode d'authentification la plus simple pour les clients serait un simple nom d'utilisateur/mot de passe. Vous pouvez utiliser SSL pour authentifier le client et le serveur. Cela vous obligerait à stocker la clé privée quelque part où votre application PHP a accès, idéalement en dehors de la racine Web avec un chmod 400, mais vous pouvez facilement le renommer en .php ou le placer dans un dossier avec un .htaccess qui contient deny from all. Du côté du serveur, vous pouvez vérifier le certificat des clients à l'aide de these environmental variables.

Si vous voulez juste une connexion TLS et non un HTTPs. Ensuite, vous pouvez utiliser stream_context_set_option en réglant le Context Options:

<?php 
$context = stream_context_create(); 
$result = stream_context_set_option($context, 'ssl', 'local_cert', '/path/to/keys.pem'); 
// This line is needed if your cert has a passphrase 
$result = stream_context_set_option($context, 'ssl', 'passphrase', 'pass_to_access_keys'); 

$socket = stream_socket_client('tls://'.$host.':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context); 
?> 
+1

Mon client * ne * besoin d'une clé privée, car il doit présenter un certificat de client au serveur. Dans ce cas, n'est-il pas préférable de le garder entièrement hors de la racine web, et puis, un script PHP peut y accéder mais il ne sera pas compromis par le serveur web (sous lequel le script PHP s'exécute)? En outre, CURL ne me laisse pas envoyer un flux de données arbitraires, n'est-ce pas? Il semblerait que CURL ne soit utile que si je me connecte à un serveur HTTP ou à un serveur FTP, ce que je ne suis pas. Existe-t-il une bibliothèque similaire couramment utilisée pour les flux de données simples? –

+0

@Jim Flood PHP doit avoir accès au certificat, si votre application PHP est la propriété de votre certificat, il n'y a aucun moyen de contourner cela. CURL devrait être utilisé pour HTTPs, si vous voulez juste la connexion de la couche 4, alors vous pouvez utiliser fsockopen(), vérifiez mes mises à jour. – rook

+1

Rook Je vois ce que vous voulez dire au sujet du risque pour la clé privée puisque PHP doit avoir accès.En ce qui concerne fsockopen, mon installation LAMP a PHP5 et fsockopen n'a plus "le sixième paramètre", mais j'ai trouvé stream_socket_client qui fonctionne bien avec local_cert, cafile, et verify_peer dans les options 'ssl' (pas 'tls'). Pourriez-vous le noter dans votre réponse? Merci. –

Questions connexes