ravjotbrar opened a new issue, #39014:
URL: https://github.com/apache/arrow/issues/39014

   ### Describe the bug, including details regarding any error messages, 
version, and platform.
   
   When attempting to connect to a flight endpoint with the jdbc flight driver, 
 I get the following error even though the Root CA of the endpoint is available 
in the System Roots keychain:
   
   ```
   java.sql.SQLException: cfjd.org.apache.arrow.flight.FlightRuntimeException: 
UNAVAILABLE: io exception
   Channel Pipeline: [SslHandler#0, ProtocolNegotiators$ClientTlsHandler#0, 
WriteBufferingAndExceptionHandler#0, DefaultChannelPipeline$TailContext#0]
        at 
org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler$Builder.build(ArrowFlightSqlClientHandler.java:813)
        at 
org.apache.arrow.driver.jdbc.ArrowFlightConnection.createNewClientHandler(ArrowFlightConnection.java:114)
        at 
org.apache.arrow.driver.jdbc.ArrowFlightConnection.createNewConnection(ArrowFlightConnection.java:88)
        at 
org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver.connect(ArrowFlightJdbcDriver.java:85)
        at 
org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver.connect(ArrowFlightJdbcDriver.java:49)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:208)
        at JdbcClient.main(JdbcClient.java:30)
   Caused by: cfjd.org.apache.arrow.flight.FlightRuntimeException: UNAVAILABLE: 
io exception
   Channel Pipeline: [SslHandler#0, ProtocolNegotiators$ClientTlsHandler#0, 
WriteBufferingAndExceptionHandler#0, DefaultChannelPipeline$TailContext#0]
        at 
cfjd.org.apache.arrow.flight.CallStatus.toRuntimeException(CallStatus.java:131)
        at 
cfjd.org.apache.arrow.flight.grpc.StatusUtils.fromGrpcRuntimeException(StatusUtils.java:164)
        at 
cfjd.org.apache.arrow.flight.grpc.StatusUtils.fromThrowable(StatusUtils.java:185)
        at 
cfjd.org.apache.arrow.flight.auth2.ClientHandshakeWrapper.doClientHandshake(ClientHandshakeWrapper.java:59)
        at 
cfjd.org.apache.arrow.flight.FlightClient.handshake(FlightClient.java:212)
        at 
org.apache.arrow.driver.jdbc.client.utils.ClientAuthenticationUtils.getAuthenticate(ClientAuthenticationUtils.java:73)
        at 
org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler$Builder.build(ArrowFlightSqlClientHandler.java:806)
        ... 7 more
   Caused by: javax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslEngine.handshakeException(ReferenceCountedOpenSslEngine.java:1945)
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslEngine.wrap(ReferenceCountedOpenSslEngine.java:852)
        at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:511)
        at cfjd.io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:1130)
        at 
cfjd.io.netty.handler.ssl.SslHandler.wrapNonAppData(SslHandler.java:974)
        at cfjd.io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1507)
        at 
cfjd.io.netty.handler.ssl.SslHandler.unwrapNonAppData(SslHandler.java:1425)
        at cfjd.io.netty.handler.ssl.SslHandler.access$1800(SslHandler.java:170)
        at 
cfjd.io.netty.handler.ssl.SslHandler$SslTasksRunner.resumeOnEventExecutor(SslHandler.java:1816)
        at 
cfjd.io.netty.handler.ssl.SslHandler$SslTasksRunner.access$2000(SslHandler.java:1707)
        at 
cfjd.io.netty.handler.ssl.SslHandler$SslTasksRunner$2.run(SslHandler.java:1868)
        at 
cfjd.io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
        at 
cfjd.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
        at 
cfjd.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
        at cfjd.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
        at 
cfjd.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
        at 
cfjd.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at 
cfjd.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:748)
   Caused by: sun.security.validator.ValidatorException: PKIX path building 
failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to 
find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:456)
        at 
sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:323)
        at sun.security.validator.Validator.validate(Validator.java:271)
        at 
sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:315)
        at 
sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:278)
        at 
sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:141)
        at 
cfjd.io.netty.handler.ssl.EnhancingX509ExtendedTrustManager.checkServerTrusted(EnhancingX509ExtendedTrustManager.java:69)
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback.verify(ReferenceCountedOpenSslClientContext.java:235)
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:790)
        at 
cfjd.io.netty.internal.tcnative.CertificateVerifierTask.runTask(CertificateVerifierTask.java:36)
        at cfjd.io.netty.internal.tcnative.SSLTask.run(SSLTask.java:48)
        at cfjd.io.netty.internal.tcnative.SSLTask.run(SSLTask.java:42)
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslEngine.runAndResetNeedTask(ReferenceCountedOpenSslEngine.java:1534)
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslEngine.access$700(ReferenceCountedOpenSslEngine.java:96)
        at 
cfjd.io.netty.handler.ssl.ReferenceCountedOpenSslEngine$TaskDecorator.run(ReferenceCountedOpenSslEngine.java:1509)
        at 
cfjd.io.netty.handler.ssl.SslHandler$SslTasksRunner.run(SslHandler.java:1885)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        ... 1 more
   Caused by: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target
        at 
sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
        at 
sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
        at sun.security.validator.PKI
   ```
   @arseny-dremio dug into this issue deeper and noticed the bug lies in the 
ClientAuthenticationUtils.getCertificateInputStreamFromSystem method where it 
tries to get the keystore this way:
   `keyStoreList.add(getKeyStoreInstance("KeychainStore"));`
   
   A simple app to test this method found that the KeychainStore was only 
returning user's certificates. The following code can help repro the problem:
   
   import java.io.IOException;
   import java.security.KeyStore;
   import java.security.KeyStoreException;
   import java.security.NoSuchAlgorithmException;
   import java.security.NoSuchProviderException;
   import java.security.cert.Certificate;
   import java.security.cert.CertificateException;
   import java.security.cert.X509Certificate;
   import java.util.*;
   
   ```
   public class Main {
       public static void main(String[] args) throws KeyStoreException, 
NoSuchProviderException, CertificateException, IOException, 
NoSuchAlgorithmException {
           KeyStore keyStore = KeyStore.getInstance("KeychainStore", "Apple");
           keyStore.load(null, null);
           
           Collections.list(keyStore.aliases()).forEach(alias -> {
               try {
                   Certificate certificate = keyStore.getCertificate(alias);
                   if (certificate instanceof X509Certificate) {
                       X509Certificate x509Certificate = (X509Certificate) 
certificate;
   
                       // Access certificate information
                       System.out.println("Alias: " + alias);
                       System.out.println("Subject: " + 
x509Certificate.getSubjectDN());
                       System.out.println("Issuer: " + 
x509Certificate.getIssuerDN());
                       System.out.println("Serial Number: " + 
x509Certificate.getSerialNumber());
                       System.out.println("Valid From: " + 
x509Certificate.getNotBefore());
                       System.out.println("Valid Until: " + 
x509Certificate.getNotAfter());
                       System.out.println("-----");
                   }
               } catch (KeyStoreException e) {
                   throw new RuntimeException(e);
               }
           });
       }
   }
   ```
   
   
   
   ### Component(s)
   
   Java


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to