package de.mlessmann.certassist.openssl; import de.mlessmann.certassist.ExecutableResolver; import de.mlessmann.certassist.except.UnresolvableCLIDependency; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import static org.slf4j.LoggerFactory.getLogger; @Service public class OpenSSLCertificateCreator { private static final Logger LOGGER = getLogger(OpenSSLCertificateCreator.class); private final ExecutableResolver executableResolver; @Autowired public OpenSSLCertificateCreator(ExecutableResolver executableResolver) { this.executableResolver = executableResolver; } public void createCertificate(CertificateRequest request) { Path tmpDir; try { tmpDir = Files.createTempDirectory("certassist"); } catch (IOException e) { LOGGER.atError() .log("Could not create temp directory for openssl generator!", e); return; } try { createKeyfile(request, tmpDir); } catch (IOException | InterruptedException e) { LOGGER.atError() .log(e.getMessage()); } catch (UnresolvableCLIDependency e) { LOGGER.atError() .log(e.getMessage()); } } private Path createKeyfile(CertificateRequest request, Path tmpDir) throws UnresolvableCLIDependency, IOException, InterruptedException { Path keyFile = tmpDir.resolve("root.key").toAbsolutePath(); LOGGER.atDebug().log("Creating root certificate key at: {}", keyFile); String openSSLPath = executableResolver.getOpenSSLPath(); Process createRootKeyProc = new ProcessBuilder() .command(openSSLPath, "req", "genrsa", "-des3", "-out", keyFile.toString(), Integer.toString(request.getRequestedKeyLength())) .inheritIO() .start(); createRootKeyProc.waitFor(); return keyFile; } }