chore: Add version logging for OpenSSL

This commit is contained in:
Magnus Leßmann (@MarkL4YG) 2024-11-22 20:27:50 +01:00
parent f2ed523285
commit d271be988f
4 changed files with 58 additions and 33 deletions

View file

@ -3,7 +3,6 @@ package de.mlessmann.certassist.openssl;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Stream; import java.util.stream.Stream;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
@ -17,7 +16,9 @@ public class CertificateRequestExtension {
public CertificateRequestExtensionBuilder alternativeNames(String... altNames) { public CertificateRequestExtensionBuilder alternativeNames(String... altNames) {
Objects.requireNonNull(altNames, "Alternative names must not be null (but can be empty)"); Objects.requireNonNull(altNames, "Alternative names must not be null (but can be empty)");
this.alternativeNames = Stream.of(altNames) this.alternativeNames =
Stream
.of(altNames)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(String::trim) .map(String::trim)
.map(name -> name.replaceAll("^DNS:", "")) .map(name -> name.replaceAll("^DNS:", ""))

View file

@ -16,6 +16,7 @@ import java.nio.file.StandardOpenOption;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -49,6 +50,7 @@ public class OpenSSLCertificateCreator {
private static final Pattern FINGERPRINT_EXTRACTOR = Pattern.compile( private static final Pattern FINGERPRINT_EXTRACTOR = Pattern.compile(
"^(?<algo>[0-9a-zA-Z]+) (?i)Fingerprint(?-i)=(?<finger>[a-z:A-Z0-9]+)" "^(?<algo>[0-9a-zA-Z]+) (?i)Fingerprint(?-i)=(?<finger>[a-z:A-Z0-9]+)"
); );
private final AtomicBoolean versionLogged = new AtomicBoolean(false);
private final ExecutableResolver executableResolver; private final ExecutableResolver executableResolver;
private final CertificatePasswordProvider passwordProvider; private final CertificatePasswordProvider passwordProvider;
@ -437,7 +439,28 @@ public class OpenSSLCertificateCreator {
private String resolveOpenSSL() throws CommandLineOperationException { private String resolveOpenSSL() throws CommandLineOperationException {
try { try {
return executableResolver.getOpenSSLPath(); String path = executableResolver.getOpenSSLPath();
if (!versionLogged.get()) {
try {
StartedProcess versionProc = new ProcessExecutor()
.command(path, "version")
.readOutput(true)
.redirectError(Slf4jStream.ofCaller().asError())
.start();
var versionResult = versionProc.getFuture().get();
if (versionResult.getExitValue() != 0) {
throw new CommandLineOperationException(
"Failed to get OpenSSL version. Exit code: " + versionResult.getExitValue()
);
}
log.info("Using OpenSSL version: {}", versionResult.getOutput().getUTF8());
versionLogged.set(true);
} catch (IOException | InterruptedException | ExecutionException e) {
throw new CommandLineOperationException("Failed to get OpenSSL version", e);
}
}
return path;
} catch (UnresolvableCLIDependency e) { } catch (UnresolvableCLIDependency e) {
throw new CommandLineOperationException(e); throw new CommandLineOperationException(e);
} }

View file

@ -1,17 +1,16 @@
package de.mlessmann.certassist; package de.mlessmann.certassist;
import static org.assertj.core.api.Assertions.assertThat;
import de.mlessmann.certassist.openssl.CertificateRequest; import de.mlessmann.certassist.openssl.CertificateRequest;
import de.mlessmann.certassist.openssl.CertificateRequestExtension; import de.mlessmann.certassist.openssl.CertificateRequestExtension;
import de.mlessmann.certassist.openssl.CertificateSubject; import de.mlessmann.certassist.openssl.CertificateSubject;
import de.mlessmann.certassist.service.CertificateCreationService; import de.mlessmann.certassist.service.CertificateCreationService;
import java.nio.file.Path;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import java.nio.file.Path;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest @SpringBootTest
public class CertificateServiceTest { public class CertificateServiceTest {
@ -20,10 +19,12 @@ public class CertificateServiceTest {
@Test @Test
void testCanCreateCertificate() { void testCanCreateCertificate() {
var request = CertificateRequest.builder() var request = CertificateRequest
.builder()
.type(CertificateRequest.RequestType.STANDALONE_CERTIFICATE) .type(CertificateRequest.RequestType.STANDALONE_CERTIFICATE)
.subject( .subject(
CertificateSubject.builder() CertificateSubject
.builder()
.commonName("cert.creation") .commonName("cert.creation")
.country("DE") .country("DE")
.state("SH") .state("SH")
@ -40,8 +41,11 @@ public class CertificateServiceTest {
@Test @Test
void testCanImportCertificate() { void testCanImportCertificate() {
Path certDir = TestOpenSSLCertificateCreator.TEST_CERT_PATH; Path certDir = TestOpenSSLCertificateCreator.TEST_CERT_PATH;
var importedCert = certificateService.importCertificate(certDir.resolve("x509forImport.pem"), var importedCert = certificateService.importCertificate(
certDir.resolve("x509forImport.key.pem"), TestOpenSSLCertificateCreator.TEST_CERT_PASSPHRASE); certDir.resolve("x509forImport.pem"),
certDir.resolve("x509forImport.key.pem"),
TestOpenSSLCertificateCreator.TEST_CERT_PASSPHRASE
);
assertThat(importedCert).isNotNull(); assertThat(importedCert).isNotNull();
assertThat(importedCert.getId()).isGreaterThan("0"); assertThat(importedCert.getId()).isGreaterThan("0");
} }

View file

@ -66,10 +66,7 @@ class TestOpenSSLCertificateCreator {
.locality("HH") .locality("HH")
.organization("Crazy-Cats") .organization("Crazy-Cats")
) )
.extension( .extension(CertificateRequestExtension.builder().alternativeNames("test2.local", "test3.local"))
CertificateRequestExtension.builder()
.alternativeNames("test2.local", "test3.local")
)
.build(); .build();
var spiedCert = spy(cert); var spiedCert = spy(cert);