2010-06-30 3 views
4

웹 서버에서 PHP 코드를 실행한다고 가정합니다. 예를 들어 간단한 CakePHP 앱을 실행하는 경우를 가정 해 봅니다. 이 응용 프로그램에서 일부 데이터를 교환하기 위해 때때로 일부 서버에 TLS 연결을 설정하려고합니다. 어떻게 이런 일이 일반적으로 이루어 집니까? (필자는 PHP에 대한 경험이 거의 없습니다.)웹 서버에서 PHP로 TLS 연결을 안전하게하는 방법

TLS 연결을 수행하기 위해 어떤 PHP 플러그인이나 라이브러리가 권장 되나요? 찾고자하는 좋은 곳은 어디입니까? (초기 Google 검색어를 사용하면 신호에 대한 잡음이 매우 커집니다.)

X509 개인 키를 웹 서버에 두는 것과 관련된 보안 문제는 무엇입니까? TLS 연결을 해제하려면 X509 인증서와 해당 개인 키가 필요합니다. PEM 파일이나 DER 파일 또는 Java 키 저장소 등이 필요합니다. 개인 키가 웹 루트 아래에서 취약한 곳에 앉아있을 것입니까? 어떻게 처리 되는가? TLS 연결을 설정하는 데 사용되는 개인 키의 보안 문제는 무엇입니까? 모범 사례는 무엇입니까?

편집 : PHP 앱이 연결되는 서버에 클라이언트 인증서가 필요하다는 점을 잊어 버렸습니다. 클라이언트는에 연결할 개인 키가 필요합니다. 또한 연결하려는 서버가 이 아니고 HTTP 서버가입니다. SSL/TLS 연결을 통해 서버에 일반 소켓 연결을 읽고 쓰면됩니다.

답변

7

TLS가 적절한 이름이지만 대부분의 사람들은 여전히 ​​SSL이라고합니다. PHP에서는이 연결을 using CURL으로 만들 수 있습니다.

TLS/SSL 클라이언트를 사용하면 원격 호스트를 확인하기 위해 공개 키 만 있으면됩니다. 이 공개 키는 공개 일 뿐이며 공격자에게 유출되었는지는 중요하지 않습니다. 서버 측에서 Apache는 공개 키와 개인 키 모두에 액세스합니다. 이러한 키는 일반 파일 액세스 권한을 사용하여 보호됩니다. * nix 시스템에서이 키는 일반적으로 Apache 프로세스가 소유 한 /etc/ 어딘가에 저장되며 chmod 400이 가장 좋습니다.

클라이언트를위한 가장 쉬운 인증 방법은 간단한 사용자 이름/암호입니다. SSL을 사용하여 클라이언트와 서버를 모두 인증 할 수 있습니다. 이렇게하려면 PHP 응용 프로그램이 액세스 할 수있는 곳에 개인 키를 저장해야합니다. 웹 루트 외부에 이상적으로 chmod 400이 있어야하지만, 쉽게 .php로 이름을 바꿀 수 있습니다. deny from all을 포함하는 .htaccess 폴더에 넣을 수 있습니다. 서버 측에서 these environmental variables을 사용하여 클라이언트 인증서를 확인할 수 있습니다.

HTTPS가 아닌 TLS 연결 만 있으면됩니다. 그런 다음 Context Options를 설정하여 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); 
?> 
+1

내 클라이언트 *하지 *는 서버에 클라이언트 인증서를 제시해야하기 때문에 개인 키가 필요합니다. 이 경우 웹 루트에서 완전히 빼내고 PHP 스크립트가 액세스 할 수 있지만 웹 서버가 손상되지는 않습니다 (PHP 스크립트가 실행 됨)? 또한 CURL을 사용하여 임의의 데이터 스트림을 보낼 수 있습니까? 그것은 CURL과 같아 보입니다. HTTP 서버 나 FTP 서버에 연결하는 경우에만 유용합니다. 간단한 데이터 스트림에 일반적으로 사용되는 유사한 라이브러리가 있습니까? –

+0

@Jim Flood PHP가 인증서에 액세스 할 수 있어야합니다. PHP 응용 프로그램이 소유되고 인증서도 마찬가지라면이 문제를 해결할 방법이 없습니다. HTTP에 CURL을 사용해야합니다. 계층 4 연결 만 원하는 경우 fsockopen()을 사용하여 내 업데이트를 확인할 수 있습니다. – rook

+1

루크 나는 PHP가 액세스 할 수 있어야하므로 개인 키에 대한 위험에 대해 무슨 뜻인지 알고 있습니다.멀리 fsockopen, 내 램프 설치 php5 있고 fsockopen 더 이상 "여섯 번째 매개 변수가"있지만 local_cert, cafile 및 verify_peer 'ssl'옵션 (않습니다 'tls') 위대한 작품 stream_socket_client 찾았습니다. 당신은 당신의 대답에 그것을 적어 주시겠습니까? 감사. –

관련 문제