4444 * @method string getLocality()
4545 * @method IEngineHandler setOrganization(string $organization)
4646 * @method string getOrganization()
47- * @method IEngineHandler setOrganizationalUnit(string $organizationalUnit)
48- * @method string getOrganizationalUnit()
47+ * @method IEngineHandler setOrganizationalUnit(array $organizationalUnit)
48+ * @method array getOrganizationalUnit()
4949 * @method IEngineHandler setUID(string $UID)
5050 * @method string getName()
5151 */
@@ -60,7 +60,7 @@ abstract class AEngineHandler implements IEngineHandler {
6060 protected string $ state = '' ;
6161 protected string $ locality = '' ;
6262 protected string $ organization = '' ;
63- protected string $ organizationalUnit = '' ;
63+ protected array $ organizationalUnit = [] ;
6464 protected string $ UID = '' ;
6565 protected string $ password = '' ;
6666 protected string $ configPath = '' ;
@@ -140,6 +140,16 @@ private function parseX509(string $x509): array {
140140
141141 $ return = self ::convertArrayToUtf8 ($ parsed );
142142
143+ foreach (['subject ' , 'issuer ' ] as $ actor ) {
144+ foreach ($ return [$ actor ] as $ part => $ value ) {
145+ if (is_string ($ value ) && str_contains ($ value , ', ' )) {
146+ $ return [$ actor ][$ part ] = explode (', ' , $ value );
147+ } else {
148+ $ return [$ actor ][$ part ] = $ value ;
149+ }
150+ }
151+ }
152+
143153 $ return ['valid_from ' ] = $ this ->dateTimeFormatter ->formatDateTime ($ parsed ['validFrom_time_t ' ]);
144154 $ return ['valid_to ' ] = $ this ->dateTimeFormatter ->formatDateTime ($ parsed ['validTo_time_t ' ]);
145155 return $ return ;
@@ -464,6 +474,11 @@ protected function checkRootCertificateModernFeatures(): ?ConfigureCheckHelper {
464474 $ minorIssues [] = "Missing modern extensions: {$ extensionsList }" ;
465475 }
466476
477+ $ hasLibresignCaUuid = $ this ->validateLibresignCaUuidInCertificate ($ parsed );
478+ if (!$ hasLibresignCaUuid ) {
479+ $ minorIssues [] = 'LibreSign CA UUID not found in Organizational Unit ' ;
480+ }
481+
467482 if (!empty ($ criticalIssues )) {
468483 $ issuesList = implode (', ' , $ criticalIssues );
469484 return (new ConfigureCheckHelper ())
@@ -490,6 +505,45 @@ protected function checkRootCertificateModernFeatures(): ?ConfigureCheckHelper {
490505 }
491506 }
492507
508+ private function validateLibresignCaUuidInCertificate (array $ parsed ): bool {
509+ if (!isset ($ parsed ['subject ' ]['OU ' ])) {
510+ return false ;
511+ }
512+
513+ $ instanceId = $ this ->getInstanceId ();
514+ if (empty ($ instanceId )) {
515+ return false ;
516+ }
517+
518+ $ organizationalUnits = $ parsed ['subject ' ]['OU ' ];
519+
520+ if (is_string ($ organizationalUnits )) {
521+ if (str_contains ($ organizationalUnits , ', ' )) {
522+ $ organizationalUnits = explode (', ' , $ organizationalUnits );
523+ } else {
524+ $ organizationalUnits = [$ organizationalUnits ];
525+ }
526+ }
527+
528+ $ expectedCaUuid = 'libresign-ca-id: ' . $ instanceId ;
529+
530+ foreach ($ organizationalUnits as $ ou ) {
531+ if (trim ($ ou ) === $ expectedCaUuid ) {
532+ return true ;
533+ }
534+ }
535+
536+ return false ;
537+ }
538+
539+ private function getInstanceId (): string {
540+ $ instanceId = $ this ->appConfig ->getValueString (Application::APP_ID , 'instance_id ' , '' );
541+ if (strlen ($ instanceId ) === 10 ) {
542+ return $ instanceId ;
543+ }
544+ return '' ;
545+ }
546+
493547 #[\Override]
494548 public function toArray (): array {
495549 $ return = [
0 commit comments