2012-03-05 39 views
14

我想在PHP 5.x中創建一個自簽名證書。與我自己的(替代)openssl配置應該由我的PHP代碼定義。 PHP腳本將運行在不同的環境中(共享託管Web服務器)。OpenSSL真的需要一個openssl.conf的路徑嗎?

官方PHP Manual說:

默認情況下,在你的系統openssl.conf的信息被用來初始化請求;您可以通過設置configargs的config_section_section項來指定配置文件部分。您還可以通過將config密鑰的值設置爲您要使用的文件的路徑來指定替代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

.conf文件用於指定默認值,所以你不必在輸入相同的事情,爲您創建的每個證書創建。沒有默認設置就沒有問題,只是更乏味。 – 2012-03-05 16:42:47

+3

我不是PHP/OpenSSL專家,但似乎某些配置設置無法通過PHP腳本進行定義/更改。有人可以確認/解僱這個嗎? – Mike 2012-03-05 17:27:48

回答

10

有OpenSSL中的許多配置設置不能在PHP中的$ configargs(PHP的參數傳遞給OpenSSL的功能)來定義。

如果你沒有指定一個替代openssl配置文件,它會自動採用默認的openssl.cnf。

建議:由於您的腳本將運行在不同的服務器上,因此您應該始終使用您自己的openssl.cnf。

只需創建一個簡單的文本文件,並在其中放入以下4行。然後將路徑傳遞給您正在使用的OpenSSL函數(查看上面的第二個示例)。

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

看來,這4條線是最低openssl.cnf中必須包含。

6

答案與SSL的作用有關。它是客戶端和服務器之間的html/http對話的「殼」。 Apache運行它。這不是真的「在」PHP的土地。當您選擇重新創建密鑰對時,您真正在做的就是在小腿上踢阿帕奇,以強制客戶端/服務器使用一對新的SSL密鑰對重新啓動對話。

在某種意義上,這可能被看作是一個有點像重製SESSION_ID

我的問題:是否有一個原因,我必須指定路徑,明確openssl.conf,因爲它似乎好工作沒有它:

自簽名證書的創建沒有在這裏完成,重新創建它。因此,當你不提供路徑時,它可以使用它,因爲它已經有了來自Apache的路徑。

+2

如果我指定一個不包含所有配置值的配置文件,該怎麼辦:它是否採用默認配置文件的默認值? – HomeCoder 2012-03-22 16:05:33

+0

很坦白的說,我不確定這將如何影響PHP OpenSSL,理論上不可能正確地繼承這些屬性。但是PHP可能夠聰明。然而,我會避開它,並保持自己的參數 - 你可以很容易地結束在瀏覽器中的一個入侵證書警告 – conners 2012-03-26 09:49:05

2

PHP創建一個自簽名的證書沒有OpenSSL的(需要phpseclib, a pure PHP X.509 implementation)...

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