Hi all, I am trying to make life easier for Apple and Windows users by providing functionality to use Window-MY and Windows-ROOT, however I got stuck with KeychainStore.
keyStore = KeyStore.getInstance("KeychainStore", "Apple"); keyStore.load(null, null); keyManagerFactory = KeyManagerFactory .getInstance("PKIX"); keyManagerFactory.init(keyStore, keyPassphrase); trustStore = KeyStore.getInstance("KeychainStore", "Apple"); trustStore.load(null, null); trustManagerFactory = TrustManagerFactory .getInstance("PKIX"); trustManagerFactory.init(trustStore); ctx = SSLContext.getInstance("TLS"); ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); factory = ctx.getSocketFactory(); The problem is that when connecting to an TLS endpoint with a publicly issued certificate, Java cannot validate the server’s certificate as follows; Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target It looks like the functionality to access the MacOS trust store is missing, which is counterintuitive and makes it seem like I doing something wrong. Digging into the JDK code it leads us here: https://github.com/openjdk/jdk/blob/master/src/java.base/macosx/native/libosxsecurity/KeystoreImpl.m Specifically, what I don’t see is a call to SecTrustCopyAnchorCertificates: https://developer.apple.com/documentation/security/1401507-sectrustcopyanchorcertificates?language=objc Am I right in understanding that java can access certificates in a keychain, but not certificates in the trust store? Does it make sense to amend “KeychainStore” to allow access to the trust store, or does macos need a dedicated keystore like Windows-ROOT? Regards, Graham —