2012-03-13 28 views
10

Khi tôi tạo ra chuỗi private key với mã PHP sau (và cùng config-tham số), họ được bao bọc giữa các chuỗi khác nhau:Tại sao các chuỗi khóa riêng tư khác nhau trong Linux hoặc Windows?

$configs = array('config' => 'OpenSSL.cnf', 
       'digest_alg' => 'sha1', 
       'x509_extensions' => 'v3_ca', 
       'req_extensions' => 'v3_req', 
       'private_key_bits' => 2048, 
       'private_key_type' => OPENSSL_KEYTYPE_RSA, 
       'encrypt_key' => false, 
       'encrypt_key_cipher' => OPENSSL_CIPHER_3DES); 

$privateKeyResourceId = openssl_pkey_new($this->configs);      
openssl_pkey_export($privateKeyResourceId, $privateKeyString); 

Trên Linux các $ privateKeyString trông như thế này:

----- BEGIN PRIVATE KEY ----- NBgkqhkiG9w0BAQE .... ASDFasjkfa ----- END PRIVATE KEY -----

Trên Windows các $ privateKeyString trông như thế này:

----- BEGIN RSA PRIVATE KEY ----- NBgkqhkiG9E .... ASDFasjkfa ----- END RSA PRIVATE KEY -----

Khi tôi sao chép Windows chuỗi khóa riêng cho Linux nó hoạt động cho đến khi tôi xóa 'RSA' từ đầu/cuối (cùng một hành vi ngược lại). Tại sao điều này?

+2

OpenSSL hỗ trợ nhiều định dạng khóa riêng. Mã định danh tiêu đề PEM có định dạng đang được sử dụng. Mẫu đầu tiên có định dạng PKCS chuẩn và bao gồm mã định danh cho biết đó là khóa RSA. Định dạng thứ hai có định dạng RSA cụ thể và do đó không cần định danh đó. Định dạng mặc định thay đổi giữa PHP 5.2.9 và 5.3.3. –

+1

Cảm ơn nhận xét. Điều này có nghĩa rằng nó không phải là một vấn đề hệ điều hành. Phải kiểm tra xem nó ra. – Mike

+0

Nó chắc chắn không phải là một vấn đề hệ điều hành. Đó là một vấn đề về PHP. (Không bị hỏng, nó chỉ là nếu mã của bạn mong đợi một và nhận khác, ...) –

Trả lời

4

Theo một user note php.net đây là một vấn đề được biết:

Xin hãy lưu ý rằng phiên bản cũ của PHP/OpenSSL xuất khẩu khóa riêng RSA với '----- BEGIN RSA PRIVATE KEY ---- - 'Thẻ PEM, chỉ bao gồm trường privateKey, do đó bỏ qua trường phiên bản và khóa privateKeyAlgorithm.

Tác động của điều đó sẽ là nếu bạn chuyển đổi thành DER và sau đó quay lại PEM, nhưng sử dụng thẻ '----- BEGIN PRIVATE KEY -----' PEM, rằng Hàm openssl_pkey_get_privatekey() sẽ thất bại! Mã số của Senthryl có thể được sử dụng để tiền tố dữ liệu được mã hóa PEM với phiên bản và các trường privateKeyAlgorithm một lần nữa.

Phiên bản PHP/OpenSSL mới hơn xuất khóa riêng RSA với '----- BEGIN PRIVATE KEY -----' Thẻ PEM, bao gồm các trường phiên bản và privateKeyAlgorithm.

tôi nhận thấy những khác biệt giữa hai máy chủ của tôi:

PHP Version 5.3.3 (OpenSSL 1.0.0a-fips ngày 01 tháng 6 năm 2010) trên Fedora Core 12 x64

PHP Version 5.2.9 (OpenSSL 0.9 .8g ngày 19 tháng 10 năm 2007) trên Fedora Core 10 x64

11

Đây là sự khác biệt giữa các phiên bản openssl không phải PHP. Lệnh openssl sau tạo tiêu đề quan trọng khác nhau/footers giữa các phiên bản 0.9.x openssl và 1.0.0x:

openssl req -new -keyout mykey.key out mycertreq.csr -nodes -sha1 -newkey rsa : 2048

Đối với phiên bản 0.9.x, tiêu đề then chốt/chân trang là:

----- BEGIN RSA PRIVATE KEY ----- ----- END RSA PRIVATE KEY -----

Đối với phiên bản 1.0.0x, tiêu đề then chốt/chân trang là:

----- BEGIN PRIVATE kEY ----- ----- END PRIVATE kEY --- -

Đối với phiên bản sau này của openssl, tôi phải chạy các tập tin quan trọng thông qua các lệnh sau đây để làm cho nó phù hợp với mặc định cũ:

openssl rsa -in mykey.key -văn bản> mykey.pem

các "mykey.pem" tập tin sau đó đã header/footer (và định dạng) mà là tương thích với AWS và thích các dịch vụ.

+0

Cảm ơn bạn! Điều đó giải quyết được vấn đề của tôi khi cố gắng tải khóa lên Amazon AWS! – powtac

Các vấn đề liên quan