openssl_pkey_new () throwing errors – Правильная настройка openssl.cnf для php

** Хорошо, стало ясно, что эта проблема связана с настройкой openssl на сервере Linux и как правильно настроить пользовательский файл openssl.cnf. Я не ищу ничего сложного, но мне нужен интерфейс, чтобы иметь возможность создавать самоподписанные клиентские сертификаты для проверки подлинности в моем веб-сервисе. Поэтому мне нужно иметь возможность использовать мой ЦС для создания промежуточных центров сертификации для компаний-клиентов, а затем предоставить им безопасный интерфейс для выдачи клиентских сертификатов для своих сотрудников. Логины основаны на том, принадлежите ли вы к определенному промежуточному ЦС и что ваш сертификат или промежуточный ЦС не отменяется.

Для кого-то интересно, мы можем использовать самозаверяющие сертификаты, потому что они используются только для нашего сервера для аутентификации пользователей, и поскольку мы их выдали, мы им доверяем. Также было бы слишком дорого для запуска, чтобы зарекомендовать себя в качестве промежуточного центра сертификации через коммерческие предложения AFAIK. Microsoft может это сделать, мы не можем. Наш веб-сервер сам использует сертификат, подписанный CA.

Я знаю, что php-код для настройки такого рода прямолинейный, но не то, как правильно настроить openssl. Я попробовал несколько разных примеров в сети, и никто из них, похоже, не работает для моей установки, и все они кажутся разными. Одна коробка была новой установкой Centos 6.2, и я все еще получаю ошибки.

Может ли кто-нибудь указать мне в правильном направлении для настройки openssl, apache2 и php, чтобы я мог использовать эти библиотеки php без ошибок? Наш виртуальный сервер использует debian squeeze, и у меня есть полный контроль над установленным программным обеспечением.

Благодарю.

open_pkey_new () возвращает ошибки, такие как ошибка: 0E06D06C: файлы конфигурационных файлов: NCONF_get_string: нет значения. Тем не менее, я передаю путь к файлу openssl.cnf, поэтому я не знаю, почему я все еще получаю эту проблему. Вот мой уместный код

<?php $cwd=getcwd(); $distname= array( "countryName" => "CA", "stateOrProvinceName" => "Ontario", "localityName" => "Toronto", "organizationName" => "G4 Apps", "organizationalUnitName" => "Development", "commonName" => "Mark Lane", "emailAddress" => "nobody at gmail.com" ); $password = 'seanix'; $cacert_location=$cwd."/certs/CA/g4CA.crt"; $cakey_location=$cwd."/certs/CA/g4CA.key"; $cnf=$cwd.'/certs/myopenssl.cnf'; $configArgs = array( 'config' =>$cnf ); ?> 

Вот моя функция, которая делает ключи.

 <?php function makekey($password,$configArgs) { $key= openssl_pkey_new($configArgs); //print_r($configArgs); openssl_pkey_export($key, $pkeyout,$password); if (($e=openssl_error_string()) ==false) return $pkeyout; else { do { echo $e . "<BR>"; } while($e=openssl_error_string()); return -1; } } ?> 

Я также пробовал относительные пути к файлу конфигурации, и он все равно не сработает. Похоже, это может быть установка хост-провайдеров ssl. Я переключился на локальную виртуальную машину, и я получил ключ для генерации, но теперь я получаю ту же ошибку при создании csr.

error: 0E06D06C: файлы конфигурационных файлов: NCONF_get_string: нет значения

 <?php function newcsr($distname,$key,$configArgs) { $csr=openssl_csr_new($distname,$key,$configArgs); openssl_csr_export($csr, $csrout); if (($e=openssl_error_string()) ==false) return $csrout; else { do { echo $e . "<BR>"; } while($e=openssl_error_string()); return -1; } } ?> 

openssl.conf Это выглядит как ошибка в openssl.cnf, поэтому я включил файл.

 HOME = . RANDFILE = $ENV::HOME/.rnd oid_section = new_oids [ new_oids ] tsa_policy1 = 1.2.3.4.1 tsa_policy2 = 1.2.3.4.5.6 tsa_policy3 = 1.2.3.4.5.7 #################################################################### [ ca ] default_ca = g4CA #################################################################### [ g4CA ] dir = /home/g4apps/secure.g4apps.com/generator/certs certs = $dir/ crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/CA/g4CA.crt serial = $dir/serial crlnumber = $dir/crlnumber crl = $dir/CA/g4CA.crl private_key = $dir/CA/g4CA.key RANDFILE = $dir/private/.rand x509_extensions = usr_cert name_opt = ca_default cert_opt = ca_default default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = default # use public key default MD preserve = no # keep passed DN ordering policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ req ] default_bits = 2048 default_md = md5 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = CA countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = ON localityName = Locality Name (eg, city) localityName_default = Toronto 0.organizationName = Organization Name (eg, company) 0.organizationName_default = G4 Apps organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, your name or your server\'s hostname) commonName_max = 64 emailAddress = Email Address emailAddress_default = lmlane@gmail.com emailAddress_max = 64 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = CA:true [ crl_ext ] authorityKeyIdentifier=keyid:always [ proxy_cert_ext ] basicConstraints=CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo #################################################################### [ tsa ] default_tsa = tsa_config1 [ tsa_config1 ] dir = ./demoCA serial = $dir/tsaserial crypto_device = builtin signer_cert = $dir/tsacert.pem certs = $dir/cacert.pem signer_key = $dir/private/tsakey.pem default_policy = tsa_policy1 other_policies = tsa_policy2, tsa_policy3 digests = md5, sha1 accuracy = secs:1, millisecs:500, microsecs:100 clock_precision_digits = 0 ordering = yes tsa_name = yes ess_cert_id_chain = no 

Stack trace strace php getkeystore.php &> stack.trace

http://secure.g4apps.com/generator/stack.trace

Related of "openssl_pkey_new () throwing errors – Правильная настройка openssl.cnf для php"

Я попробовал это на своем Mac и новую установку CentOS 6.3, и я получаю ту же ошибку. Я получаю свои пакеты CentOS от IUS. Это странно, хотя, хотя я получаю это сообщение, ключ фактически генерируется.

Следующий код:

 $res = openssl_pkey_new(); openssl_pkey_export($res, $privkey); var_dump(openssl_error_string()); var_dump($privkey); 

Дает мне следующий результат:

 string(68) "error:0E06D06C:configuration file routines:NCONF_get_string:no value" string(887) "-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDdh4FiOEtUZzvTSnlb/pJHjmsS9rOHQ7PU2WOO6ZHxYRIgK1NR ReY7bBwEsT2ziUpx0b8K2Fx4m+XovzysB/lVrKbrdbHoVtGuJGZjYSXgFlCRTBu+ +TnAPUBF0LGJfxfVzjOkHzsh02lH3fvzFpFgRZRWs4za+vVzIweeOweYTwIDAQAB AoGANZD5iS2BkZQw1COS+tqwtlrKq1g6CwAk8NfsCfeSkaJeRqcTS3iydjXrBHtz JwGQnbsRDedJXOSdkE0Ft7dp44lijOAp1ngMDCKbabxVN2Go6b1d743HE0oIhFCC Dv2B9kf9vzeYy+0/BVCs5i4iPoKXJJTSJrWoDxrFEJWSJIkCQQDwe39bOFHmQlxz pbfT3DZ8Q311xFo6PewcAf7DTsikoPZANx0GQ41WdZj6/n4QVP4k+TnhZLiJzsH+ p3RUrx8tAkEA69LsgPrQMZ0YjsE2vjRLdJmp1916G1xqSLIVWDUPd9Ns+MA8YKTx AQxC3dl3n+w24m7UlCThANlU/+2r0eoi6wJBAKIxGOdEJ/Cdp08UYNRR/Kl4t2A7 SwNnChylt9awByEJsqwCv9+epe+/Jqt6AzouqK31LXV4AgJn4W1IMWyAJA0CQCp0 6/2AqnD0PpKc+JUf5yHT9H8Xsb8xUTVLUopx6xoAp5LVUUl5CKbOpU85ss7JAUyc 9YrCZPv5JNN6379ILwcCQQDDcjtNnhQHukQQQ8iVL9YCrWzyCgplTz3uktueT+Dd SDK1bCM4xDehfG3RKu1ZNx80Q0nzmi7FSPJ2md7qSIHc -----END RSA PRIVATE KEY----- " 

Я подозреваю, что это ошибка в PHP. Некоторая конфигурация openssl PHP получает зависание. Я нашел сообщение об ошибке об этом на php.net, но он «начал беспокоиться» для пользователя, поэтому ошибка была закрыта.

В качестве альтернативы вы можете проверить phpseclib , библиотеку, написанную на PHP.

Проверьте, есть ли у вашего openssl.cnf

 default_md = md5 

в нем добавьте его в файл cnf и повторите попытку, если это поможет.

Основываясь на ошибке @Luke , мой вывод:

openssl_pkey_new () не возвращает значение и, следовательно, является «FALSE» .

var_dump () просто говорит, что возвращает ключ OpenSSL.

«Так оно и работает -« NCONF_get_string: no value »- это только своего рода уведомление».vrana@php.net

openssl_csr_new () (и, возможно, больше) имеют аналогичное поведение.