Я использую PHP для создания файлов CSR, используя следующий фрагмент:
$dn = array(
"countryName" => 'AU',
"stateOrProvinceName" => 'State',
"localityName" => 'Local',
"organizationName" => 'Name',
"commonName" => 'org.com',
"organizationalUnitName" => 'unitName'
);
$keyAlg = OPENSSL_KEYTYPE_RSA;
$arrayPrivKey = array(
'private_key_bits' => 2048,
'private_key_type' => $keyAlg,
'digest_alg' => 'SHA256'
);
$privkey = openssl_pkey_new($arrayPrivKey);
$san = "DNS.1=SAN\n";
$cnf = "[ req ]\ndistinguished_name = req_distinguished_name\nreq_extensions = req_ext\n\n[ req_distinguished_name ]\ncountryName = Country Name (2 letter code)\n\n[ req_ext ]\nsubjectAltName = @alt_names\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\n\n[ alt_names ]\n". $san;
file_put_contents('/myPath/openssl.cnf', $cnf);
$csr = openssl_csr_new(
$dn, $privkey,
array(
'digest_alg' => 'SHA256',
'req_extensions' => "req_ext",
'config' => '/myPath/openssl.cnf'
)
);
openssl_csr_export_to_file($csr, '/myPath/test.csr');
Он отлично работает, но теперь я пытаюсь создать эти файлы с более чем одним OU (organizationalUnitName), но мне это не удается.
Я уже пробовал некоторые варианты, как показано ниже:
//using array
$dn = array(
//other prop
"organizationalUnitName" => array('unitName', 'unit2')
);
//using commas (and other separators)
$dn = array(
//other prop
"organizationalUnitName" => "'unitName', 'unit2'"
);
//using the openssl command line syntax
$dn = array(
//other prop
"organizationalUnitName" => 'OU=organizationname/OU=organizationname2'
);
Я также пытался использовать дополнительные атрибуты из функции openssl_csr_new
и это лучший вариант на данный момент, но используя его, я ограничен в 4 OU.
//THIS ONE WORKS - LIMITED IN 4 OUS
$dn = array(
//other prop
"organizationalUnitName" => 'Unit1',
"OU" => 'Unit2',
);
//code, code,code
$csr = openssl_csr_new(
$dn, $privkey,
array(
'digest_alg' => 'SHA256',
'req_extensions' => "req_ext",
'config' => '/myPath/openssl.cnf'
),
array(
"organizationalUnitName" => 'Unit3',
"OU" => 'Unit4',
)
);
Повтор ключа OU
или organizationalUnitName
не работает, даже с такими индексами, как 1.organizationalUnitName
или organizationalUnitName1
(последние два не распознаются PHP).
В моем предыдущем исследовании я нашел этот отчет об ошибке PHP с похожей проблемой, но он относится к очень старой версии PHP, поэтому он должен нормально работать с массивным подходом в моей среде, но это не так.
В качестве конечного результата мне нужен файл CSR, аналогичный файлу, созданному с помощью следующей командной строки (Источник):
openssl req -new -newkey rsa:2048 -nodes -subj "/CN=somedomain.com/O=My Corporation/OU=Org Unit 1/OU=Org Unit 2/OU=UNIT3/OU=UNITUNIT/OU=MYUNit/OU=FinalUNit" > test.csr
Есть ли способ добиться этого с помощью PHP?
Идеальное решение должно работать с PHP 5.6, но я провел все тесты на PHP7.3, и оно тоже не работает. Решение PHP 7 не идеально для меня, но может помочь кому-то с похожей проблемой.