private function doPut(array $certificates)
 {
     if (empty($certificates)) {
         throw new InvalidArgumentException("Empty array not allowed");
     }
     $cert = new Certificate($certificates[0]);
     $commonName = $cert->getSubject()->getCommonName();
     if (!$commonName) {
         throw new CertificateStoreException("Certificate doesn't have a common name.");
     }
     // See https://github.com/amphp/dns/blob/4c4d450d4af26fc55dc56dcf45ec7977373a38bf/lib/functions.php#L83
     if (isset($commonName[253]) || !preg_match("~^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9]){0,1})(?:\\.[a-z0-9][a-z0-9-]{0,61}[a-z0-9])*\$~i", $commonName)) {
         throw new CertificateStoreException("Invalid common name: '{$commonName}'");
     }
     try {
         $chain = array_slice($certificates, 1);
         $path = $this->root . "/" . $commonName;
         $realpath = realpath($path);
         if (!$realpath && !mkdir($path, 0775, true)) {
             throw new FilesystemException("Couldn't create certificate directory: '{$path}'");
         }
         (yield \Amp\File\put($path . "/cert.pem", $certificates[0]));
         (yield \Amp\File\chmod($path . "/cert.pem", 0644));
         (yield \Amp\File\put($path . "/fullchain.pem", implode("\n", $certificates)));
         (yield \Amp\File\chmod($path . "/fullchain.pem", 0644));
         (yield \Amp\File\put($path . "/chain.pem", implode("\n", $chain)));
         (yield \Amp\File\chmod($path . "/chain.pem", 0644));
     } catch (FilesystemException $e) {
         throw new CertificateStoreException("Couldn't save certificates for '{$commonName}'", 0, $e);
     }
 }
Beispiel #2
0
 private function doPut($token, $payload, $user = null)
 {
     Assert::string($token, "Token must be a string. Got: %s");
     Assert::string($payload, "Payload must be a string. Got: %s");
     Assert::nullOrString($user, "User must be a string or null. Got: %s");
     $path = $this->docroot . "/.well-known/acme-challenge";
     $realpath = realpath($path);
     if (!realpath($this->docroot)) {
         throw new ChallengeStoreException("Document root doesn't exist: '{$this->docroot}'");
     }
     if (!$realpath && !@mkdir($path, 0755, true)) {
         throw new ChallengeStoreException("Couldn't create public directory to serve the challenges: '{$path}'");
     }
     if ($user) {
         if (!($userInfo = posix_getpwnam($user))) {
             throw new ChallengeStoreException("Unknown user: '******'");
         }
     }
     if (isset($userInfo)) {
         (yield \Amp\File\chown($this->docroot . "/.well-known", $userInfo["uid"], -1));
         (yield \Amp\File\chown($this->docroot . "/.well-known/acme-challenge", $userInfo["uid"], -1));
     }
     (yield \Amp\File\put("{$path}/{$token}", $payload));
     if (isset($userInfo)) {
         (yield \Amp\File\chown("{$path}/{$token}", $userInfo["uid"], -1));
     }
     (yield \Amp\File\chmod("{$path}/{$token}", 0644));
 }
Beispiel #3
0
 private function doPut($path, KeyPair $keyPair)
 {
     if (!is_string($path)) {
         throw new InvalidArgumentException(sprintf("\$root must be of type string, %s given.", gettype($path)));
     }
     $file = $this->root . "/" . $path;
     try {
         // TODO: Replace with async version once available
         if (!file_exists(dirname($file))) {
             $success = mkdir(dirname($file), 0755, true);
             if (!$success) {
                 throw new KeyStoreException("Could not create key store directory.");
             }
         }
         (yield \Amp\File\put($file, $keyPair->getPrivate()));
         (yield \Amp\File\chmod($file, 0600));
     } catch (FilesystemException $e) {
         throw new KeyStoreException("Could not save key.", 0, $e);
     }
     (yield new CoroutineResult($keyPair));
 }