簡體   English   中英

如何在Web服務器中安全地從PHP進行TLS連接

[英]How to make TLS connection from PHP in web server, and safely

假設我在Web服務器中運行了一些PHP代碼,例如,運行一個簡單的CakePHP應用程序。 從這個應用程序,我想偶爾與一些服務器建立TLS連接以交換一些數據。 這通常是怎么做的? (我對PHP沒什么經​​驗。)

建議使用哪些PHP插件或庫或其他方法來完成TLS連接? 哪些地方可以開始尋找? (我最初的谷歌搜索給了我很大比例的噪音信號。)

將X509私鑰放在Web服務器上涉及哪些安全問題? 要建立TLS連接,我將需要X509證書和相應的私鑰,可能需要PEM文件,或DER文件,或Java密鑰庫,或其他任何東西。 這個私鑰是否會位於Web根目錄下易受攻擊的位置? 這通常如何處理? 有什么安全問題,特別是保護用於建立TLS連接的私鑰的安全問題? 什么是最佳做法?

編輯:我忘了提到PHP應用程序連接的服務器需要提供客戶端證書。 客戶端確實需要私鑰才能連接。 此外,我連接的服務器不是 HTTP服務器 - 我只需要在與服務器的普通套接字連接上讀取/寫入(通過SSL / TLS連接)。

TLS是正確的名稱,但大多數人仍將其稱為SSL。 在PHP中,您可以使用CURL建立此連接。

使用TLS / SSL客戶端,您只需要公鑰即可驗證遠程主機。 這個公鑰只是公開的,如果泄露給攻擊者則無關緊要。 在服務器端,Apache可以訪問公鑰和私鑰。 使用普通文件訪問權限保護這些密鑰。 在* nix系統下,這些密鑰通常存儲在/etc/某個地方,由Apache進程擁有,而chmod 400最好。

客戶端最簡單的身份驗證方法是簡單的用戶名/密碼。 您可以使用SSL對客戶端和服務器進行身份驗證。 這將要求您將私鑰存儲在您的PHP應用程序可以訪問的地方,理想情況下,在具有chmod 400的webroot之外,但您可以輕松地將其重命名為.php或將其放在包含deny from all的.htaccess的文件夾中deny from all 在服務器端,您可以使用這些環境變量驗證客戶端證書。

如果您只想要一個TLS連接而不是HTTP。 然后,您可以通過設置上下文選項來使用stream_context_set_option:

<?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); 
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM