Сгенерируйте CSR с несколькими OU, используя PHP

Я использую 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 не идеально для меня, но может помочь кому-то с похожей проблемой.


person James    schedule 04.09.2019    source источник