Re: Problem using FIPS with PKI

David Hook <dgh-rTAZ0PM/[email protected]> Sun, 31 Mar 2019 10:52:08 +1100
Newsgroups gmane.comp.encryption.bouncy-castle.devel
Message-ID <[email protected]>
I'd run through Arshad's list first, but one other thing to check as
well - it may be assuming that the certs keystore can have it's
certificates loaded without a password (true in JKS, not true in BCFKS).
I haven't heard of this before in connection with JBoss before but you
may need to specify a password where you did not originally. We ran into
something like this a while ago in another application, although it
turned out the certs keystore had to be JKS - BC-FJA 1.0.2 has a new
FIPS type key store which will read both BCFKS and JKS for this reason.

Regards,

David

On 31/3/19 3:57 am, Arshad Noor wrote:
>
> Have you verified that the truststore.bcfks file not only contains the
> self-signed Root CA certificate of the chain you need to verify the
> client certificate, and that the truststore.bcfks file is in the
> precise directory JBoss needs to establish the TLS session?
>
> I would troubleshoot this as follows:
>
>  1.  Move the keystore.jks/truststore.jks and
>     keystore.bcfks/truststore.bcfks files to other names temporarily
>     from the folder you _think_ is being used by JBoss to start TLS;
>  2. Start JBoss.  If it complains of starting TLS because it cannot
>     find the JKS and BCFKS files, then you're in the right directory;
>  3. Rename the keystore.bcfks and truststore.bcfks files to their
>     original names;
>  4. Restart JBoss.  If TLS starts and you're still failing ClientAuth
>     (because of a missing trusted certificate, then you're missing
>     either the self-signed or an intermediate certificate of the chain
>     in your truststore.bcfks;
>  5. Add them and confirm that they do exist by listing out the certs
>     using /keytool/;
>  6. Restart JBoss.  At this point TLS ClientAuth should work.  If it
>     doesn't then you may need to turn on JBoss debugging at more
>     granular levels to see what the TLS library is doing, as it
>     performs certificate validation, to learn what it is complaining
>     about. I'm assuming, at this point, that all the CA certs you have
>     in the truststore are the correct ones that are part of the
>     chain.  Be careful with assuming that the certificates are correct
>     based on the Subject DN/IssuerDN - _unless_ the
>     /SubjectKeyIdentifier//(SKI)/ of the Issuer and the
>     /AuthorityKeyIdenfier (AKI)/ of the subject match (along with
>     Subject DN of the issuer the Issuer DN of the subject), the chain
>     will not be identical.  This problem can arise if you've issued
>     multiple certificates with the same DNs, or if there are expired
>     certificates in the chain.
>
> Arshad Noor
> StrongKey
>
>
> On 3/29/19 10:07 AM, Chris Webb wrote:
>>
>> Sorry, I should have been more clear with my initial question.
>>
>> I did create both a keystore and a truststore. If I reference a
>> truststore file that doesn’t exist keycloak presents a different
>> error. The only difference between the command used to create the
>> truststore vs the keystore is the “-srckeystore” and “-destkeystore”
>> arguments in the keytool command from my initial post. So, I did the
>> following (minus the paths and passwords):
>>
>> 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
>>
>> keytool -importkeystore -srckeystore truststore.jks -srcstoretype JKS
>> -srcstorepass <password> -destkeystore truststore.bcfks
>> -deststoretype BCFKS -deststorepass <password> -provider
>> org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
>> -providerpath /path/to/jar/bc-fips-1.0.1.jar
>>
>>  
>>
>> As I mentioned before, if I switch it back to using the original
>> keystore.jks and truststore.jks files I had created before, and
>> update the java.security file to remove “BCFIPS”, PKI will work as
>> expected.
>>
>>  
>>
>> v/r
>>
>>  
>>
>> Chris Webb
>>
>>  
>>
>> *From:*Arshad Noor <arshad.noor-NeRrhQ6gTz/qlBn2x/[email protected]>
>> *Sent:* Friday, March 29, 2019 8:09 AM
>> *To:* Christophe Webb <[email protected]>; [email protected]
>> *Subject:* Re: [dev-crypto] Problem using FIPS with PKI
>>
>>  
>>
>> 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.
>>
>>  
>>
>> Image removed by sender.
>> <http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>
>> 	
>>
>> Virus-free. www.avg.com
>> <http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>
>>
>>  
>>