Allow CN as option when generating the self-signed certs
diff --git a/net/src/main/java/org/apache/tuweni/net/tls/TLS.java b/net/src/main/java/org/apache/tuweni/net/tls/TLS.java
index b90fadf..5ecc20f 100644
--- a/net/src/main/java/org/apache/tuweni/net/tls/TLS.java
+++ b/net/src/main/java/org/apache/tuweni/net/tls/TLS.java
@@ -16,6 +16,7 @@
 import static java.nio.file.Files.createDirectories;
 import static org.apache.tuweni.crypto.Hash.sha2_256;
 
+import jdk.internal.joptsimple.internal.Strings;
 import org.apache.tuweni.bytes.Bytes;
 
 import java.io.BufferedReader;
@@ -35,6 +36,7 @@
 import java.security.cert.X509Certificate;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.UUID;
 
 import org.bouncycastle.asn1.x500.X500Name;
 import org.bouncycastle.cert.X509v3CertificateBuilder;
@@ -73,6 +75,22 @@
    * @throws IOException If an IO error occurs creating the certificate.
    */
   public static boolean createSelfSignedCertificateIfMissing(Path key, Path certificate) throws IOException {
+    return createSelfSignedCertificateIfMissing(key, certificate, null);
+  }
+
+  /**
+   * Create a self-signed certificate, if it is not already present.
+   *
+   * <p>
+   * If both the key or the certificate file are missing, they will be re-created as a self-signed certificate.
+   *
+   * @param key The key path.
+   * @param certificate The certificate path.
+   * @param commonName the name to use for the CN attribute of the certificate. If null or empty, a random value is used.
+   * @return {@code true} if a self-signed certificate was created.
+   * @throws IOException If an IO error occurs creating the certificate.
+   */
+  public static boolean createSelfSignedCertificateIfMissing(Path key, Path certificate, String commonName) throws IOException {
     if (Files.exists(certificate) || Files.exists(key)) {
       return false;
     }
@@ -84,7 +102,7 @@
     Path certFile = Files.createTempFile(certificate.getParent(), "client-cert", ".tmp");
 
     try {
-      createSelfSignedCertificate(new Date(), keyFile, certFile);
+      createSelfSignedCertificate(new Date(), keyFile, certFile, commonName);
     } catch (CertificateException | NoSuchAlgorithmException | OperatorCreationException e) {
       throw new TLSEnvironmentException("Could not generate certificate: " + e.getMessage(), e);
     }
@@ -94,7 +112,7 @@
     return true;
   }
 
-  private static void createSelfSignedCertificate(Date now, Path key, Path certificate) throws NoSuchAlgorithmException,
+  private static void createSelfSignedCertificate(Date now, Path key, Path certificate, String commonName) throws NoSuchAlgorithmException,
       IOException,
       OperatorCreationException,
       CertificateException {
@@ -108,7 +126,11 @@
     cal.add(Calendar.YEAR, 1);
     Date yearFromNow = cal.getTime();
 
-    X500Name dn = new X500Name("CN=example.com");
+    if (Strings.isNullOrEmpty(commonName)) {
+      commonName = UUID.randomUUID().toString() + ".com";
+    }
+
+    X500Name dn = new X500Name("CN=" + commonName);
 
     X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
         dn,