Finally I got Tomcat working with Machine Certificate Storage.

Finally, I got a configuration that works with Certificate Storage. It is very 
specific, and I couldn't find any other until date.
It works, but in our environment there is a required manual step yet. I think 
it should be configured in Windows and is common for all programs requesting 
private key not special for Tomcat.
A dialog of Windows Security is shown asking to allow access, similar to UAC 
but for certificates.
[cid:7f0b2dfc-8c60-492c-8c42-24d84e6c7917]
The server.xml configuration used is

<Connector port="8443"
           scheme="https" secure="true" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate
          certificateKeystoreType="Windows-MY-LOCALMACHINE"
             certificateKeystoreFile=""
             certificateKeyAlias="tomcat"/>
    </SSLHostConfig>
</Connector>


I continue my research trying to use different ciphers and properties, because 
I won't be able to use the standard without the . It is clear for me, that 
different internals libraries are used in Tomcat, so when I use the only the it 
doesn't work and it won't find the key in the storage.
For the purpose of the initial question, I consider this solutions as valid, as 
Tomcat is able to work with the Windows Local Machine Certificate Storage.
Solution versions:

  *   JDK 11.0.20+ or JDK version with fixed bug 
https://bugs.openjdk.org/browse/JDK-8286790
  *   Tested with Tomcat 9.0.63
  *   Tested in Windows 2019

Thank you for your support. Hope this information is useful to crate a Use Case 
in the wiki.

Some doubts are in the air yet, but it is essentially possible for Tomcat to 
work with this.

Two questions thats remaining for the future:

  *
How to disable or bypass the Windows Security dialog? Is it possible to disable 
for specific Users/Services?
  *
Why if I use keyStoreType="windows-my-localmachine" directly in <connector> it 
doesn't find the certificate?

________________________________
De: Gavioto πŸ•΅ <gaviot...@hotmail.com>
Enviado: martes, 25 de junio de 2024 15:27
Para: users@tomcat.apache.org <users@tomcat.apache.org>
Asunto: RE: How to configure Tomcat with a Managed Service Account when using 
LocalMachine certificates for TLS

- how are are starting Tomcat?
      Tomcat is starting as a service with "Domain\account1$" (Managed Service 
Account)

- is Tomcat installed as a Windows service?
      Yes

- which account is Tomcat running under?
      "Domain\account1$" (Managed Service Account) It is not a normal domain 
account used for the service.  Secure group managed service accounts - 
Microsoft Entra | Microsoft 
Learn<https://learn.microsoft.com/en-us/entra/architecture/service-accounts-group-managed#assess-gmsa-security-posture>

Regarding the mean of "user" I'm referring to the user who is running the 
Tomcat Service. In this case, the Managed Service Account.

________________________________
De: Mark Thomas <ma...@apache.org>
Enviado: martes, 25 de junio de 2024 12:51
Para: users@tomcat.apache.org <users@tomcat.apache.org>
Asunto: Re: How to configure Tomcat with a Managed Service Account when using 
LocalMachine certificates for TLS

A few questions:

- how are are starting Tomcat?

- is Tomcat installed as a Windows service?

- which account is Tomcat running under?

There are a few references to "user" in your question. It is not clear
if this is:
- the user administering a Tomcat service
- a user that is starting Tomcat from the command line
- the user that the Tomcat service is running as
- something else

Mark


On 25/06/2024 11:30, Alberto Corral wrote:
> Hello!
>
> After some research, docs, and test, I didn't found an answer to my issue.
>
> I'm writing to the list  because I have to configure a probably not very 
> common Tomcat configuration and didn't found correct configuration of if it 
> is posible to do it.
> Also I didn't find previous information or examples on internet and the wiki.
>
> There is a similar question in Server Fault 
> https://serverfault.com/questions/1161457/can-i-use-certificates-in-the-local-machine-from-a-managed-service-account,
>  but not solved yet.
>
> The configuration has been also involved with a JDK recent bug-fix (but 10 
> years old), but this part is fixed using latest available JDK versions.
> So I think it would be valuable to document an Use Case based on real 
> experience that can be both, tested in future versions, and also useful for 
> future users, available in the wiki or official docs :-)
>
> May be what's I'm trying to do is not really possible, but need to know if 
> this is a Tomcat limitation or a Windows one.
>
> My actual configuration
>
> Server version name:   Apache Tomcat/9.0.65
> Server version number: 9.0.65.0
> Server built:          Jul 14 2022 12:28:53 UTC
> Architecture:          amd64
> OS Version:            10.0
> OS Name:               Windows Server 2019
> JVM Vendor:            Eclipse Adoptium
> JVM Version:           11.0.23+9
> Java Home:             
> C:\OpenJDK11U-jdk_x64_windows_hotspot_11.0.23_9\jdk-11.0.23+9
>
> Actual secure configuration used:
>
> <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
> server="Unknown"
> maxThreads="150" scheme="https" secure="true"
>   enableLookups="true"
>   KeystoreType="Windows-MY-LOCALMACHINE"
> clientAuth="false" sslProtocol="TLS"
> KeystoreFile=""
> KeyAlias="tomcat" />
>
>
> Configuration:
> - The certificate is in the LOCALMACHINE Windows Storage and allows read 
> access to the user "account1$" which is an AD Managed Service Account.
> -
>
> Facts:
> - If the user have read access but not local admin, then the previous stack 
> trace is generated.
> - If I give local Admin rights to the service account, it seems can access to 
> the Certificate Storage, in other case, the previous Stack Trace is generated.
> - Unless I gave local Admin rights, apache opens port 8443, but doesn't 
> respond to requests on 8443 when testing and no error in logs appears.
>
> What is the question is "How to configure Tomcat with a Managed Service 
> Account when using LocalMachine certificates for TLS"
>
> Notes:
> - JDK 11.0.20+ is required due a well known bug that has been backported from 
> JDK 21  [JDK-6782021] It is not possible to read local computer certificates 
> with the SunMSCAPI provider - Java Bug System 
> (openjdk.org<http://openjdk.org/>) 
> (https://bugs.openjdk.org/browse/JDK-6782021) and [JDK-8303520] It is not 
> possible to read local computer certificates with the SunMSCAPI provider - 
> Java Bug System (openjdk.org<http://openjdk.org/>) 
> (https://bugs.openjdk.org/browse/JDK-8303520)
>
> Next program can help to check different configurations, and it works when 
> the certificate has read permission for the user who is running it.
>
> // JDK8313367test.java - Simple test case to demonstrate OpenJDK defect 
> JDK-8313367
> // References:
> // * https://bugs.java.com/bugdatabase/view_bug?bug_id=JDK-8313367
> // * 
> https://stackoverflow.com/questions/75255985/java-keystore-type-windows-my-root-localmachine-requires-administrator-permissio
>
> /*
> Here is the command line to run the test using JDK 11.0.20+,  17.0.20+ or 
> 20.0.2+
> java --add-modules=jdk.crypto.mscapi 
> --add-exports=jdk.crypto.mscapi/sun.security.mscapi=ALL-UNNAMED 
> JDK8313367test.java
> */
>
> import java.io.*;
> import java.security.KeyStore;
> import java.security.Security;
> import java.util.Enumeration;
> import sun.security.mscapi.SunMSCAPI;
>
> public class JDK8313367test {
>      public static void main(String[] args) {
>          try {
>              Security.addProvider(new SunMSCAPI());
>              KeyStore keyStore = 
> KeyStore.getInstance("Windows-My-LOCALMACHINE");
>              // When running as non-elevated, the SunMSCAPI provider, 
> enhanced with JDK-6782021, incorrectly
>                    // triggers system error 5 "Access is denied" when 
> attempting to load the keystore when invoking the following method:
>                    keyStore.load(null, null);
>              Enumeration<String> aliases = keyStore.aliases();
>                    // Print Friendly Names, a.k.a. aliases, of each 
> certificate in the keystore
>              for (int i = 0 ; aliases.hasMoreElements() ; i++) {
>                          System.out.println( aliases.nextElement() );
>              }
>          } catch (Exception e) {
>              throw new RuntimeException(e);
>          }
>      }
> }
>
> Pending tests:
> - What I haven't tested, but it is an idea to test, is to launch this code 
> from Tomcat and validate if it works (It isn't possible to run a CLI program 
> using a Managed Service Account as per my knowledge). In case this test 
> succeeds, it would mean the program flow in tomcat side is doing something 
> different with ACL or something.
> Thank you in advance for your support.
> Please, send me back any question or clarification about the Use Case I could 
> miss.
> /Gavioto
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to