Sorry for the top post, I'm wring this on an iPad on a plane.

It's perfectly acceptable for a provider to prefer its version of stuff over 
even something early in the provider list.   Usually, that has more to do with 
key material ( for example pkcs11 instantiations), but there's no reason why it 
shouldn't apply to certificates.   

Mike



Sent from my iPad

> On Oct 14, 2015, at 18:35, Langer, Christoph <christoph.lan...@sap.com> wrote:
> 
> Hi Mike,
>  
> thanks for your comments on this.
>  
> I agree that the change is quite critical and my approach might not be good. 
> However, as for your suggestion to specify the sun provider for the 
> certificate factory, I’d say this is not quite right, too. Because, if you 
> have loaded a different provider on top of the providers list, you’ll intend 
> to use its facilities by default. Maybe the idea would be to use the sun 
> provider as fallback in case of an exception?
>  
> The other suggestion to check for certChain.length in KeyStore.getCertificate 
> and return null would be an improvement compared to throwing an 
> ArrayIndexOutOfBoundsException – however, it would still be difficult to find 
> the root cause why a certificate could not be loaded.
>  
> What do you think?
>  
> @all: Are there other opinions?
>  
> Thanks and best regards
> Christoph
>  
> From: security-dev [mailto:security-dev-boun...@openjdk.java.net] On Behalf 
> Of Mike StJohns
> Sent: Mittwoch, 14. Oktober 2015 02:17
> To: security-dev@openjdk.java.net
> Subject: Re: RFR 8139436: sun.security.mscapi.KeyStore might load incomplete 
> data
>  
> Hi - 
> 
> I took a look and this probably isn't the correct way to fix this. 
> 
> A simpler change might be to specify the sun provider when requesting the 
> certificate factory.    I hesitate to say that definitively as modularization 
> guidance may restrict that approach?
> 
> The belt and suspenders approach is to catch the bad certificate exception 
> and return null.  That appears to be the correct contract for 
> KeyStore.getCertificate(String alias).   (e.g. "if (certChain.length == 0) 
> return null;")
> 
> Mike
> 
> 
> On 10/12/2015 5:04 PM, Langer, Christoph wrote:
> Hi,
>  
> please review a change proposal regarding an issue in the Microsoft Security 
> API (mscapi).
>  
> Bug: https://bugs.openjdk.java.net/browse/JDK-8139436
> Webrev: http://cr.openjdk.java.net/~clanger/webrevs/8139436.0/
>  
> I stumbled over the issue when using an old IAIK security provider. It would 
> throw java.security.cert.CertificateException upon parsing ECC based 
> certificates when generating Certificate objects. The way it is right now, 
> such exceptions are silently caught and the Windows Keystore is created with 
> incomplete data. Upon accessing such ECC certificates from the Keystore 
> object, e.g. when iterating over it, you’ll get exceptions like:
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
>         at 
> sun.security.mscapi.KeyStore.engineGetCertificate(KeyStore.java:313)
>         at 
> sun.security.mscapi.KeyStore$ROOT.engineGetCertificate(KeyStore.java:60)
>         at java.security.KeyStore.getCertificate(KeyStore.java:1095)
> At that point it is not obvious what the real root cause for that is.
>  
> With my change, loading of the keystore would already throw like this:
> java.io.IOException: java.security.KeyStoreException: Exception occurred 
> generating certificate object for alias DigiCert Assured ID Root G3
>         at sun.security.mscapi.KeyStore.engineLoad(KeyStore.java:780)
>         at sun.security.mscapi.KeyStore$ROOT.engineLoad(KeyStore.java:60)
>         at java.security.KeyStore.load(KeyStore.java:1459)
>         at 
> WindowsCertificateReaderTest.main(WindowsCertificateReaderTest.java:18)
> Caused by: java.security.KeyStoreException: Exception occurred generating 
> certificate object for alias DigiCert Assured ID Root G3
>         at sun.security.mscapi.KeyStore.loadKeysOrCertificateChains(Native 
> Method)
>         at sun.security.mscapi.KeyStore.engineLoad(KeyStore.java:777)
>         ... 3 more
> Caused by: java.security.cert.CertificateException: Error parsing 
> certificates! iaik.asn1.DerInputException: Next ASN.1 object is no OBJECT 
> IDENTIFIER!
>         at iaik.x509.CertificateFactory.engineGenerateCertificates(Unknown 
> Source)
>         at 
> java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.java:462)
>         at sun.security.mscapi.KeyStore.generateCertificate(KeyStore.java:869)
>         ... 5 more
> This is more obvious when it comes to analyzing such an issue.
>  
> Also, I added a property “sun.security.mscapi.ignoreFailingCertificates” 
> which, when set to true, will cause skipping of certificates that failed with 
> Exception. That might be a nice workaround option if one is not particularly 
> interested in a failing certificate.
>  
> You can reproduce all this with the test coding in the OpenJDK Bug, the IAIK 
> provider 3.15 which is downloadable here: 
> http://jcewww.iaik.tu-graz.ac.at/sic/Download (educational/research version, 
> needs registration) and ECC certificates in the Windows Root certificate 
> store.
>  
> Would you think this change is reasonable and worthwile?
>  
> Thanks & Best regards
> Christoph
>  

Reply via email to