2012-03-05 2 views
14

PHP 5.x에서 자체 서명 인증서를 만들고 싶습니다. 내 자신의 (대안) openssl 구성 내 PHP 코드에 의해 정의되어야합니다. PHP 스크립트는 다른 환경 (공유 호스팅 웹 서버)에서 실행됩니다.openssl.conf에 실제로 OpenSSL에 경로가 필요합니까?

공식 PHP Manual는 말한다 :

기본적으로

, 시스템 openssl.conf의 정보가 요청을 초기화하는 데 사용됩니다; configargs의 config_section_section 키를 설정하여 구성 파일 섹션을 지정할 수 있습니다. config 키의 값을 사용하려는 파일의 경로로 설정하여 대체 openssl 구성 파일을 지정할 수도 있습니다. 아래 표에 나와있는 configargs에 존재에서, openssl.conf에서 그 등가물처럼 행동하는 경우 다음 키 .....

내 질문 : 나는 경로를 지정해야 할 이유가 있는가

$Configs = array(  
    'digest_alg' => 'sha1', 
    'x509_extensions' => 'v3_ca', 
    'req_extensions' => 'v3_req', 
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
    'encrypt_key' => true, 
    'encrypt_key_cipher' => OPENSSL_CIPHER_3DES 
); 

$privkey = openssl_pkey_new(); 
$csr = openssl_csr_new($dn, $privkey, $Configs); 
$sscert = openssl_csr_sign($csr, null, $privkey, 365, $Configs); 

편집 : 그것없이 잘 작동하는 것 같다 때문에, 명시 적으로 openssl.conf하기 위해 사용자에

공헌 노트를 PHP Manual에, 왜 그들은 항상 openssl.cnf하는 경로를 지정합니까 ? 예를 들면 :

$configargs = array(
    'config' => '/etc/ssl/openssl.cnf', 
    'digest_alg' => 'md5', 
    'x509_extensions' => 'v3_ca', 
    'req_extensions' => 'v3_req', 
    'private_key_bits' => 666, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
    'encrypt_key' => false, 
); 
+1

OpenSSL을하지 않고 PHP에서 자체 서명 인증서 (필요 phpseclib, a pure PHP X.509 implementation를) ... 만들기 귀하가 생성 한 모든 인증서에 대해 기본값없이 진행하는 것은 괜찮습니다. 그냥 지루한 일입니다. –

+3

저는 PHP/OpenSSL 전문가는 아니지만 일부 구성 설정은 PHP 스크립트에 의해 정의/변경 될 수없는 것으로 보입니다. 누군가가이를 확인/기각 할 수 있습니까? – Mike

답변

10

$ configargs합니다 (PHP 매개 변수는 OpenSSL이 함수에 전달)에 의해 PHP에서 정의 할 수 없습니다 OpenSSL이 많은 구성 설정이 있습니다.

대체 openssl 구성 파일을 지정하지 않으면 자동으로 기본 openssl.cnf가 사용됩니다.

권장 사항 : 스크립트가 다른 서버에서 실행되므로 항상 openssl.cnf 파일을 사용해야합니다.

간단한 텍스트 파일을 만들고 다음 4 줄을 입력하기 만하면됩니다. 그런 다음이 경로를 사용중인 OpenSSL 함수에 전달하십시오 (위의 두 번째 예제 참조).

이 4 줄은 openssl.cnf에 들어 있어야하는 것으로 보입니다.

6

이 답변은 SSL의 역할과 관련이 있습니다. 이것은 클라이언트와 서버 사이의 html/http 대화를 둘러싼 "쉘"입니다. 아파치가 실행합니다. 실제로 PHP 토지에있는 것은 아닙니다. 키 쌍을 다시 만들려면 아파치를 걷어차 고 클라이언트/서버가 새로운 쌍의 SSL 키 쌍으로 대화를 다시 시작하게해야합니다. 이것은 SESSION_ID에게

내 질문을 리메이크처럼 조금으로 볼 수있는 몇 가지 의미로

: 잘 작동하는 것 같다 때문에 명시 적으로 openssl.conf하는 경로를 지정해야 할 이유가 있나요 그것없이 :

여기에서 자체 서명 된 인증서 생성이 수행되고 있지 않습니다. 다시 작성해야합니다. 따라서 경로를 제공하지 않으면 이미 Apache에서 경로가 있기 때문에 경로가 올바로 제공됩니다.당신이 이상 같은 일을 입력해야하고하지 않도록

+2

모든 구성 값을 보유하지 않는 구성 파일을 지정하면 어떻게됩니까? 기본 구성 파일의 기본값을 사용합니까? – HomeCoder

+0

솔직히 말해서 이것이 PHP OpenSSL에 어떤 영향을 미칠지 모르겠다. 이론 상으로는 이러한 속성을 제대로 상속받을 수 없다. 그러나 PHP는 충분히 영리 할 수 ​​있습니다. 그러나 나는 그것에서 멀리 부끄러워하고 당신의 자신의 매개 변수에 유지할 것입니다 - 당신은 쉽게 브라우저에있는 invaild 증명서 경고로 끝날 수있었습니다 – conners

2

의의 .conf 파일에 기본값을 지정하는 데 사용됩니다

<?php 
include('File/X509.php'); 
include('Crypt/RSA.php'); 

// create private key/x.509 cert for stunnel/website 
$privKey = new Crypt_RSA(); 
extract($privKey->createKey()); 
$privKey->loadKey($privatekey); 

$pubKey = new Crypt_RSA(); 
$pubKey->loadKey($publickey); 
$pubKey->setPublicKey(); 

$subject = new File_X509(); 
$subject->setPublicKey($pubKey); 
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); 
$subject->setDomain('www.whatever.com'); 

$issuer = new File_X509(); 
$issuer->setPrivateKey($privKey); 
$issuer->setDN($subject->getDN()); 

$x509 = new File_X509(); 
$x509->setStartDate('-1 month'); 
$x509->setEndDate('+1 year'); 
$x509->setSerialNumber(chr(30)); 

$result = $x509->sign($issuer, $subject); 
echo "the stunnel.pem contents are as follows:\r\n\r\n"; 
echo $privKey->getPrivateKey(); 
echo "\r\n"; 
echo $x509->saveX509($result); 
echo "\r\n"; 
관련 문제