Re: Problem using FIPS with PKI
Arshad Noor <arshad.noor-NeRrhQ6gTz/qlBn2x/[email protected]> Fri, 29 Mar 2019 06:13:00 -0700
| Newsgroups | gmane.comp.encryption.bouncy-castle.devel |
|---|---|
| Organization | StrongKey |
| Message-ID | <[email protected]> |
If you did not get an error with the /keytool/ command, then the files
were created correctly.
There are usually three problems with /keytool/ many people stumble on:
* The keystore and truststore are two different files. You've shown
the command to import the keys into the keystore in your e-mail, but
not the corresponding command to create the truststore. The trusted
certificate the logs are complaining about, is in the truststore. I
trust (sorry for the pun) you created the truststore similarly;
* /keytool/ silently creates a new keystore/truststore in the _local
directory _without complaining, as long as the command parameters
are correct. Application servers use their keystores/truststores
only from certain configuration folders. If the BCFKS file you
created is not in the folder your application server expects, its
most likely using the original truststore - which probably does not
have the trusted CA certificate you needed to import for TLS
ClientAuth to work. confirm that the truststore your application
server is using has a timestamp equivalent to the time you created
the truststore; to be absolutely certain, list the certificates from
your truststore to confirm that your trusted self-signed CA's
certificate is in there;
* The last problem is that the truststore does not have the precise
self-signed CA certificate, or intermediate CA certificates, for the
specific Client certificate you're using to perform client
authentication. Verify that you have the chain in the _keystore_
(at least up to the self-signed Root CA certificate) and the
self-signed Root CA certificate in the _truststore_.
Arshad Noor
StrongKey
On 3/27/19 12:06 PM, Christophe Webb wrote:
>
> I am running keycloak in a docker container. We are using PKI as one
> of the authentication methods for our applications. I followed the
> instructions for keycloak(X.509 Client Certificate User
> Authentication) to set this up, and everything seems to work. Next, we
> needed to update keycloak to be FIPS compliant. For this, we are using
> the bouncy castle FIPS provider(bc-fips-1.0.1.jar). I have set up the
> java.security file to make the bouncy castle fips provider the
> default. This all works correctly as well.
>
> However, once I update the java.security file to use
> "com.sun.net.ssl.internal.ssl.Provider BCFIPS", PKI no longer works.
> Regular SSL with out a client certificate provided works just fine,
> and we can log in with username and password, but we need PKI.
> I have updated the keycloak standalone.xml with the following:
> <server-identities>
> <ssl>
> <keystore provider="BCFKS" path="keystore.bcfks"
> relative-to="jboss.server.config.dir" keystore-password="<password>"
> alias="keycloak" key-password="<password>"/>
> </ssl>
> </server-identities>
> <authentication>
> <truststore provider="BCFKS" *path="truststore.bcfks"
> *relative-to="jboss.server.config.dir" keystore-password="<password>"/>
> <local default-user="$local" allowed-users="*" skip-group-loading="true"/>
> <properties path="application-users.properties"
> relative-to="jboss.server.config.dir"/>
> </authentication>
>
> I took the JKS files for the keystore and truststore that I was using
> before and imported them to BCFKS files using this basic command:
> keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS
> -srcstorepass <password> -destkeystore keystore.bcfks -deststoretype
> BCFKS -deststorepass <password> -provider
> org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
> -providerpath /path/to/jar/bc-fips-1.0.1.jar
>
> I also updated the JAVA_OPTS to include -Djavax.net.debug=ssl. In the
> output, I can see that my certificate is provided, and it looks correct.
>
> In the log output after the client certificate is logged, I see the
> the following log statements.
>
> 14:38:30,927 INFO [stdout] (default task-1) default task-1, fatal
> error: 46: General SSLEngine problem
> 14:38:30,927 INFO [stdout] (default task-1)
> sun.security.validator.ValidatorException: *No trusted certificate found*
> 14:38:30,927 INFO [stdout] (default task-1) %% Invalidated:
> [Session-2, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
> 14:38:30,927 INFO [stdout] (default task-1) default task-1, SEND
> TLSv1.2 ALERT: fatal, description = certificate_unknown
> 14:38:30,927 INFO [stdout] (default task-1) default task-1, WRITE:
> TLSv1.2 Alert, length = 2
> 14:38:30,928 INFO [stdout] (default I/O-2) default I/O-2, fatal:
> engine already closed. Rethrowing javax.net.ssl.SSLHandshakeException:
> General SSLEngine problem
> 14:38:30,928 INFO [stdout] (default I/O-2) default I/O-2, called
> closeInbound()
> 14:38:30,928 INFO [stdout] (default I/O-2) default I/O-2, fatal:
> engine already closed. Rethrowing javax.net.ssl.SSLException: Inbound
> closed before receiving peer's close_notify: possible truncation attack?
> 14:38:30,928 INFO [stdout] (default I/O-2) default I/O-2, called
> closeOutbound()
> 14:38:30,928 INFO [stdout] (default I/O-2) default I/O-2,
> closeOutboundInternal()
>
>
> Is it possible that I created the BCFKS keystore and truststore
> incorrectly? If I switch back to the jks files, PKI works without issue.
>