22 private $signCertificate;
23 private $signPrivateKey;
30 private $privateKeyPassphrase;
39 public function __construct(
string $certificate,
string $privateKey,
string $privateKeyPassphrase =
null,
string $extraCerts =
null,
int $signOptions =
null)
41 if (!\extension_loaded(
'openssl')) {
42 throw new \LogicException(
'PHP extension "openssl" is required to use SMime.');
47 if (
null !== $privateKeyPassphrase) {
48 $this->signPrivateKey = [$this->
normalizeFilePath($privateKey), $privateKeyPassphrase];
53 $this->signOptions = $signOptions ?? PKCS7_DETACHED;
54 $this->extraCerts = $extraCerts ? realpath($extraCerts) : null;
55 $this->privateKeyPassphrase = $privateKeyPassphrase;
58 public function sign(Message $message): Message
60 $bufferFile = tmpfile();
61 $outputFile = tmpfile();
63 $this->
iteratorToFile($message->getBody()->toIterable(), $bufferFile);
65 if (!@openssl_pkcs7_sign(stream_get_meta_data($bufferFile)[
'uri'], stream_get_meta_data($outputFile)[
'uri'], $this->signCertificate, $this->signPrivateKey, [], $this->signOptions, $this->extraCerts)) {
66 throw new RuntimeException(sprintf(
'Failed to sign S/Mime message. Error: "%s".', openssl_error_string()));
69 return new Message($message->getHeaders(), $this->convertMessageToSMimePart($outputFile,
'multipart',
'signed'));