Re: Problem using FIPS with PKI
David Hook <dgh-rTAZ0PM/[email protected]> Wed, 3 Apr 2019 13:40:55 +1100
| Newsgroups | gmane.comp.encryption.bouncy-castle.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Chris, Early access to the ongoing FIPS work is available to people who have a BC support contract Bronze level or above (at this point you can probably work out how we pay for this). If you would like further information about support, drop us a line at info-rTAZ0PM/[email protected] Regards, David On 2/4/19 11:59 pm, Christophe Webb wrote: > > I would be interested in trying out 1.0.2 if that allows me to use the > JKS files I was using previously. How would I go about getting early > access to it? > > > v/r > > > Chris Webb > >> On March 30, 2019 at 7:52 PM David Hook <dgh-rTAZ0PM/[email protected]> wrote: >> >> >> 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]> >>>> <mailto:arshad.noor-NeRrhQ6gTz/qlBn2x/[email protected]> >>>> *Sent:* Friday, March 29, 2019 8:09 AM >>>> *To:* Christophe Webb <[email protected]> <mailto:[email protected]>; >>>> [email protected] <mailto:[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> >>>> >>>> >>>> >>>> >> > > >