'Java TLS Socket certificate_unknown error

I'm writing a simple test case where I create a SSL context (from Bouncey Castle with CA certificate, client certificate, and private key) and from the context, I create a server socket and client socket.

I'm trying to send a simple message from client to server and get the following error.

"Received fatal alert: certificate_unknown"

I suspect it has to do with the way the environment is setup, but I'm not sure.

SSL Context is generated with the code below

  public static SSLContext getSSLContext(final String caCrtFile,
                                                   final String crtFile,
                                                   final String keyFile,
                                                   final String password)
   {
      try
      {

         /**
          * Add BouncyCastle as a Security Provider
          */
         Security.addProvider(new BouncyCastleProvider());

         JcaX509CertificateConverter certificateConverter =
               new JcaX509CertificateConverter().setProvider("BC");

         /**
          * Load Certificate Authority (CA) certificate
          */
         PEMParser reader = new PEMParser(new FileReader(caCrtFile));
         X509CertificateHolder caCertHolder =
               (X509CertificateHolder) reader.readObject();
         reader.close();

         X509Certificate caCert =
               certificateConverter.getCertificate(caCertHolder);

         /**
          * Load client certificate
          */
         reader = new PEMParser(new FileReader(crtFile));
         X509CertificateHolder certHolder =
               (X509CertificateHolder) reader.readObject();
         reader.close();

         X509Certificate cert = certificateConverter.getCertificate(certHolder);

         /**
          * Load client private key
          */
         reader = new PEMParser(new FileReader(keyFile));
         Object keyObject = reader.readObject();
         reader.close();

         PrivateKeyInfo key = (PrivateKeyInfo) keyObject;
         
         JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
         

         /**
          * CA certificate is used to authenticate server
          */
         KeyStore caKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
         caKeyStore.load(null, null);
         caKeyStore.setCertificateEntry("ca-certificate", caCert);

         TrustManagerFactory trustManagerFactory =
               TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
         trustManagerFactory.init(caKeyStore);

         /**
          * Client key and certificates are sent to server so it can
          * authenticate the client
          */
         KeyStore clientKeyStore =
               KeyStore.getInstance(KeyStore.getDefaultType());
         clientKeyStore.load(null, null);
         clientKeyStore.setCertificateEntry("certificate", cert);
         clientKeyStore.setKeyEntry("private-key",
                                    converter.getPrivateKey(key),
                                    password.toCharArray(),
                                    new Certificate[]
                                    { cert });

         KeyManagerFactory keyManagerFactory =
               KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
         keyManagerFactory.init(clientKeyStore, password.toCharArray());

         /**
          * Create SSL socket factory
          */
         SSLContext context = SSLContext.getInstance("TLSv1.2");
         context.init(keyManagerFactory.getKeyManagers(),
                      trustManagerFactory.getTrustManagers(),
                      new SecureRandom());

         
         /**
          * Return the newly created socket factory object
          */
         return context;

      }
      catch (Exception e)
      {
         e.printStackTrace();
      }

      return null;
   }

Client Socket

public TLSClient(InetAddress serverHost,
                    int serverPort,
                    String tlsVersion,
                    String trustStoreName,
                    char[] trustStorePassword,
                    String keyStoreName,
                    char[] keyStorePassword) throws Exception
   {
      serverHost_ = serverHost;
      serverPort_ = serverPort;

      ctx_ = TLSServer.getSSLContext("root.crt.pem", trustStoreName, keyStoreName, "");
   }
   
   public void requestSend(String message) throws IOException
   {
      SocketFactory factory = ctx_.getSocketFactory();

      Socket connection = factory.createSocket(serverHost_, serverPort_);
      SSLParameters sslParams = new SSLParameters();
      sslParams.setEndpointIdentificationAlgorithm("HTTPS");
      ((SSLSocket) connection).setSSLParameters(sslParams);

      // NIO to be implemented
      while (true)
      {
         try
         {
            PrintWriter out =
                  new PrintWriter(connection.getOutputStream(), true);
            out.println(message);
         }
         catch (Exception e)
         {
            e.printStackTrace();
         }
      }

   }
   
   private InetAddress serverHost_;
   private int serverPort_;
   private SSLContext ctx_;

Server Socket

public TLSServer(int    port,
                    String tlsVersion,
                    String trustStoreName,
                    char[] trustStorePassword,
                    String keyStoreName,
                    char[] keyStorePassword)
         throws Exception
   {

      port_ = port;
      ctx_ = getSSLContext("root.crt.pem", trustStoreName, keyStoreName, "");

   }

   public String serveReceive() throws IOException
   {
      SSLServerSocketFactory factory = ctx_.getServerSocketFactory();
      try (ServerSocket listener = factory.createServerSocket(port_))
      {
         SSLServerSocket sslListener = (SSLServerSocket) listener;

         sslListener.setNeedClientAuth(true);

         // NIO to be implemented
         while (true)
         {
            try (Socket socket = sslListener.accept())
            {
               BufferedReader input =
                     new BufferedReader(new InputStreamReader(socket.getInputStream()));
               return input.readLine();
            }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }
      }

   }

   private int port_;
   private SSLContext ctx_;

Test Main

TLSServer server = new TLSServer(SERVER_PORT,
                                       TLS_VERSION,
                                       TRUST_STORE_NAME,
                                       TRUST_STORE_PWD,
                                       KEY_STORE_NAME,
                                       KEY_STORE_PWD);
      TLSClient client = new TLSClient(InetAddress.getByName(SERVER_HOST_NAME),
                                       SERVER_PORT,
                                       TLS_VERSION,
                                       TRUST_STORE_NAME,
                                       TRUST_STORE_PWD,
                                       KEY_STORE_NAME,
                                       KEY_STORE_PWD);

      Thread serverThread = new Thread(new Runnable()
      {

         @Override
         public void run()
         {
            try
            {
               String output = server.serveReceive();
               
               System.out.println("Received: " + output);
            }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }
      });
      serverThread.start();

      try
      {
         client.requestSend("Test1");
      }
      catch (Exception e)
      {
         e.printStackTrace();
         throw e;
      }

Root Certificate:

-----BEGIN CERTIFICATE-----
MIIFCzCCAvOgAwIBAgIJAKhHDvvSBZHvMA0GCSqGSIb3DQEBCwUAMBwxCzAJBgNV
BAYTAkNBMQ0wCwYDVQQDDARyb290MB4XDTIyMDExMjIzMzE1MloXDTIzMDExMjIz
MzE1MlowHDELMAkGA1UEBhMCQ0ExDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3
DQEBAQUAA4ICDwAwggIKAoICAQCZFexdEkFsc3mLB6cbCLxfLbkAv+ZnBAHrkDeE
i+xd9TvHm5Po6DF/+C/qCAC8cqj/RcpIr7VJS1nfxF2bWlXhJM4jVbDhuybweJ+8
IOh1gxeYRhMXCCGvJmL22KQ+Of8ixKx9GdM+HyAPFd13JkrboEwnjBomale6N4X7
F29rd7WrD5o806OejKvzgepCb0zuDtKEWB/0MAFE/9fcfaVkD0LJ7N8A8/gfHP4Q
ndCc6w2ixG1qmFnecdg806qZwtzzKKQTk/qCHngtwN8R/C7/ERvpe0Gi6Zu0Z1wz
A1OQbe+SlVMrA4wz5bMKp9wJbQn+AbG9bk6WCObrR65KxYZPi5w0zpVYrTHmdyCS
5emPX7h2cu3TQ0nf6klbHvn7mvpUmyE/aI1eXXNaa710R1u+04S9NvCwP4sq99Nn
w2KEs5WPAtf5FT2xXLuaM2OumVvCoRSK3PT47IMPizO+6kQR4v1iGtHVgRfBaiD+
fCpgsIRhTz/dE4WS5chopW8zUDmsneypW2J97YHszbSOSM4pQMl1dP/Y1+Vo6mjN
CMJxhn/GzrcjlJAk0vE0urXpOf2JmZmyYzMrYv+rPE3TYugK6+aB/BhhyzbQ/+h6
ZMmVQt5C5QRI2iYTsND2zfoWrffJLcOIoq0+gBPL4p/yTWcRCCN1XR3/dSiZyqYF
ZoviZwIDAQABo1AwTjAdBgNVHQ4EFgQUc8LLD+VqpjpiHBN9NtrnW3kjRVAwHwYD
VR0jBBgwFoAUc8LLD+VqpjpiHBN9NtrnW3kjRVAwDAYDVR0TBAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAeIV7VHcdjoGKpIFhW8G5CuTX2qbG/91wXa5aIRca/lEX
LUSli3ztBJLBtkgQB2xJWB2lZxGP7ANbg7fasGna+3WIfBfMbDYadGuu93AGmC/M
3L8/PmKkHUFx7ai8VFKkuZyLymv8FJos5WTheBRLSUXkXZHuh9OAavH2cP7iAV4l
fzXEmmwS0KiDuNPdSM4R/3qiDPy5jvMix3GH3ZqJURvJRv9KWbq+Y78mr9RT2HqH
RWE28PyUylgekpeiRVEZpf8OsSI7oHZil1VIX8oR/SbKx4mv48Y/2bGGFwSo8zhm
z0azUFWldUfkFc0hiGq1AnnbBRFHaa8x8IEHXxDurQ0AY0MZ1Hms/Rq649aSUXBY
8dzOv0CgB17HsVV3SriK4xOWWIHo/L2qkV7meELRMtc9YSpLfiThujdum6UvHUBo
4aj+Gl5/kNPuWwKFl+kE2hBSrua2z0vxBi67eevTsur6j0eAoStcVbfH/11VKWPZ
r0LXnyBmHJIbuNWMNLfEhRwE70xAADT7uDNmDmXfKKGfzBekQK5m06DAMfR+YQFd
3MGBg4d/wQyBKuLBT+fsFUghhkWZqI5vY1BfeFrsZ6VHlCdU0rtPj1OylM4fVGMF
4JZxK0il0c3ZjHTx0SMLjw4fBwHnck7NccdDqgx5QACPZYefWi0Qe5OTvYT4PKc=
-----END CERTIFICATE-----

Certificate

-----BEGIN CERTIFICATE-----
MIIEtDCCApwCCQDtNnRW/81VbTANBgkqhkiG9w0BAQsFADAcMQswCQYDVQQGEwJD
QTENMAsGA1UEAwwEcm9vdDAeFw0yMjAxMTIyMzMxNTNaFw0yMzAxMTIyMzMxNTNa
MBwxCzAJBgNVBAYTAkNBMQ0wCwYDVQQDDAR6ZXJvMIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEA22rWs9pKWxyd7BxQQKSMoKOks22RZGuzyvLo9qt+UDqC
ABsttV5nJ2/E6ZtyEPrU9CGbgQZiVpNN68pE61KsCp3dnjGtduUgxUWw9xQKmvmQ
nbrdD4J0HLwm9MV+mM/FSQ2yFriYEZ73ULVRUvjsqBzNrfG2XMWEZ1EkqgncV2cX
vG5Wp48S3JJzyLkZr8VGKp2UnMDBqQaYhl91yMCfg790cIqJdfWkb84iotIJ+scx
yc3d4kDOb/7bBxkUPsTZZNeY7EeFLh1KjWSldzQQFl9YMqRTixbAPrkL+Z9HS7kX
qrVqcxXyBs+Jr7QiV856aQKVsANRwVac7mA5pygCIoiES3nDdBvrCy2If3FTbhcC
bXG6v2kX7Ia/SgNr4OqzUqUgXEM2jmBarlQOWatAS9YK6iyXi2rwOlsztacfqPYb
UKqfpFPGsWwp7Kp5U9SRoFCAyJ9miTO8t6QZzqO5vwEoHev7SCvAptuxRPJQYhtH
NEesKXB/+HhL9yvtoBMR4BkYxXkh2tHJ0CMDmD91ce+OWultSJzuFaM2uE0NQjT5
Ct7PwSofhFyadKfTPITmxfKez5OW5f+pG74eQ5yR1NopJo+hzyqDii6kNnruJauP
xwJax36bCZGMY6ctdNnTTRLsU5VpKUrJMt/hfKiDN5kbYuz46F6aFcaCdUSN+6EC
AwEAATANBgkqhkiG9w0BAQsFAAOCAgEAcBW2aeLg5Bg3hBcrzeeN8UxenhisVkWL
VDdPbtDCjUSZ9QJis4c4Zlk6c40sYFkU2ZF25/Mt3GABUuHTTIkC0pnrv4eJ/aZ8
XwsFWV1GOqDb2mcTozGPTWTjTMT0EL/I5CexlJvFlKQeawZySkwhdZCAxsz3f+r+
47VoltcLKwOFwCwlJLq/qvusItLyxAcpeS8VRCvVbz2bGpRXuloC9o0znJVllXJX
J2swgZcRdMItfEkGYRSp7M8yk2E4zYKvL8Qv3Df7ZzN/sjyQVKwEdiwRSF3c1Vzv
EnZ7VqjAaqPwhlJPY/cIGrFRpXz8P13A5YkZQ5Z1M/mzRiCH4J+kUug4HbWz/G6q
Bsl+1+Iz9oFjywz47KFLx7Mn004QNHSbxvIBtNmHDOU67/M7o0Eze+8M6eY6hwcz
tRKk62dQlvwb+Tatx0n+h/eWxUrCUuNwc5dWhon3QjNIHjlnlUBRDo2HXppbdOx8
9MZUmkiaQWN/YmVOi+mmVKpNDG9DWamzYrNLLOycftoRlSx49j4Lmf2Heu+befTJ
2hV+CipVkAyce9BubPoagPJm5q3p/Ab0lkETt5ES6xz6kQuGwvMnisCLeb0y9hxZ
RrrQU1xw5HDHRv9aQYL5ikZbbtWkBpBLu4+u96II9oHEtsGmVi8dRm+RcPrSmkFF
n+kWt+Hzxgc=
-----END CERTIFICATE-----

Private Key

-----BEGIN PRIVATE KEY-----
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
bgJOW/mLELMWrodrV0+1NlwRkG3uYkCn
-----END PRIVATE KEY-----


Solution 1:[1]

The answer is super simple, on the client side, I have to call startHandshake

Solution 2:[2]

I'm not shure if your answer is really the solutution. I ran your code with your certificates I get a completely different - but more expected No subject alternative names present exception.

Your root certificate looks O.K. (only the Basic Constraints CA:TRUE should be taged as critical) but the server certificate does not. The CN zero is invalid in this case.

$ openssl x509 -inform PEM -in root.crt.pem -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            a8:47:0e:fb:d2:05:91:ef
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CA, CN=root
        Validity
            Not Before: Jan 12 23:31:52 2022 GMT
            Not After : Jan 12 23:31:52 2023 GMT
        Subject: C=CA, CN=root
        Subject Public Key Info:
            ...
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                ...
            X509v3 Authority Key Identifier:
                ...
            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
        ...

$ openssl x509 -text -inform PEM -in test_0.crt.pem

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            ed:36:74:56:ff:cd:55:6d
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CA, CN=root
        Validity
            Not Before: Jan 12 23:31:53 2022 GMT
            Not After : Jan 12 23:31:53 2023 GMT
        Subject: C=CA, CN=zero
        Subject Public Key Info:
            ...
    Signature Algorithm: sha256WithRSAEncryption
        ...

A certificate without SAN extention must have the parameter CN (in the subject field) set to the DNS name of the (physical/virtual) host where it is installed on. I.e. in your testcase the CN should be localhost, on a server with the DNS name example.com the CN must be example.com. You can also set the IP address as CN parameter but be aware of the fact tha official Certification Authorities accept only CSR with domain names and reject those with IP addresses.

With SAN extention the CN parameter in the subject fiels can be uset more liberately as long as one SAN field has set DNS parameter with a value according to that said above. In this case you are also free to set one DNS parameter to servers DNS name and a second to it's IP address.

Which one (DNS name / IP address) to use depends on the URL you use to conect to your server. If the certificate has no enty which correlates to the URL the client uses to connect the server a hostname verification error occures.

Also the X509v3 Extended Key Usage: TLS Web Server Authentication should be set without critical tag to indicate/restrict the certificate usage.

Comming back to the initial reason of your question, the certificate_unknown error.

This error occures if the provided end entity (client/server) certificate is unknown and/or no valid trust path back to a root certificate can be build. In practise this means that the required root certificate is not available in the truststore of the complaining party (server/client).

With the given code, certificates and information I can't see any reason for that exception and wouldn't expect it either. Maybe it was a temporary misconfiguration while trying to get it running.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Jack Zhang
Solution 2