2012-03-05 12 views
14

PHP 5.xで自己署名証明書を作成したいと思います。私のPHPコードで定義されるはずの私自身の(別の)openssl設定を使用します。 PHPスクリプトは異なる環境(共有ホスティングWebサーバ)で実行されます。OpenSSLには本当にopenssl.confへのパスが必要ですか?

公式PHP Manualは言う:デフォルトで

、お使いのシステムopenssl.confの情報は、要求を初期化するために使用されます。 configargsのconfig_section_sectionキーを設定して、構成ファイルセクションを指定することができます。 代替openssl設定ファイルを指定するには、設定キーの値を使用するファイルのパスに設定します。以下のキー、以下の表のようにconfigargsに存在するが、openssl.confにそれらの同等物のように動作している場合.....

私の質問:私はパスを指定する必要があります理由はありますそれなしで正常に動作するようですので、明示的に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); 

を編集:ユーザーで

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

をPHPでの自己署名証明書を作成するので、あなたは以上同じことを入力する必要はありませんし、作成するすべての証明書についてデフォルトなしでうまくいくのはちょっと面倒です。 –

+3

私はPHP/OpenSSLエキスパートではありませんが、一部の設定はPHPスクリプトで定義/変更できないようです。誰かがこれを確認/却下できますか? – Mike

答えて

10

$ configargs(PHPパラメータを使用すると、OpenSSLの関数に渡す)ことにより、PHPで定義することができないのOpenSSLには多くの設定があります。

代替のopenssl構成ファイルを指定しないと、自動的にデフォルトのopenssl.cnfが使用されます。

おすすめ:あなたのスクリプトは異なるサーバーで実行されるため、常に独自のopenssl.cnfを使用する必要があります。

単純なテキストファイルを作成し、次の4行を入力するだけです。次に、使用しているOpenSSL関数にそのパスを渡します(上記の2番目の例を見てください)。

distinguished_name = req_distinguished_name 
[req_distinguished_name] 
[v3_req] 
[v3_ca] 

openssl.cnfには、これらの4行が含まれている必要があります。

6

これに対する答えは、SSLの役割に関連しています。これは、クライアントとサーバーの間のhtml/http会話を囲む "シェル"です。 Apacheが実行します。実際にはPHPの土地ではありません。キーペアを再作成することを選択すると、本当にやっているすべてのことが、クライアント/サーバーがSSLキーペアの新しいペアを使って会話を再開するようにするために、Apacheを起動します。ある意味で

これは

私の質問をSESSION_IDを作り直すようなビットとして見られるかもしれません:正常に動作するようですので、私は明示的にopenssl.confへのパスを指定する必要があります理由は、あります

ここでは自己署名証明書の作成が行われていないため、再作成されます。したがって、パスを指定しないと、既にApacheからのパスがあるため、パスは正常です。

+2

すべての設定値を保持していない設定ファイルを指定するとどうなりますか?デフォルトの設定ファイルからデフォルト値を受け取りますか? – HomeCoder

+0

正直言って、これがPHP OpenSSLにどのように影響するのかわかりませんが、理論上はこれらのプロパティを適切に継承することは不可能です。しかし、PHPは十分に賢いかもしれません。しかし、私はそれを恥ずかしがり、あなた自身のパラメータに保つでしょう - あなたは簡単に証明書の警告をブラウザで終わらせることができます – conners

2

は.confファイルは、デフォルト値を指定するために使用されています...(phpseclib, a pure PHP X.509 implementationが必要です)OpenSSLをせずに

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