Thanks David, and apologies to Rick. I missed that you were starting
your server without TLS (as well as the client) and confused things
here.


On Sat, Dec 30, 2023 at 3:03 PM David Li <lidav...@apache.org> wrote:
>
> Just to be clear - the server never supports both TLS and plaintext 
> connections at the same time. (I don't believe this is possible in gRPC.) The 
> URI scheme determines how the server listens so if you don't use grpc+tls:// 
> it will use plaintext regardless of if you pass certificates or not. The code 
> could do more input validation in this case but it was never listening using 
> TLS in the first place.
>
> On Sat, Dec 30, 2023, at 18:57, Bryce Mecum wrote:
> > Hi Rick,
> >
> > You're right that TLS support is built into PyArrow Flight [1]. I
> > think the issue with your code is that your client isn't attempting to
> > connect over TLS and that the default behavior of the FlightServerBase
> > must be to allow both TLS and non-TLS connections. This seems to be
> > similar to how web servers might choose to accept connections over
> > HTTP and HTTPS (though many may not).
> >
> > To make your code fail as you expect, see [1] and, in your client
> > code, either change server_location to use
> > pyarrow.flight.Location.for_grpc_tls to construct the Location object
> > or change your URI to "grpc+tls://localhost:8081" instead of just
> > "grpc://localhost:8081". Once you change this, your client should fail
> > with an SSL handshake error.
> >
> > [1] https://arrow.apache.org/docs/python/flight.html#enabling-tls
> >
> > On Sat, Dec 30, 2023 at 2:20 PM Rick Spencer
> > <richard.linger.spence...@gmail.com> wrote:
> >>
> >> I am working on supporting TLS, and it looks like everything that I need is
> >> built into FlightServerBase.
> >>
> >> However, I am struggling to understand how it works, or how to test that it
> >> is working. For example, I don't understand why I can pass garbage in for
> >> the tls_certs, and still get results when called from a client. Here is a
> >> minimal example I put together to show where I am confused.
> >>
> >> Server that I think should not work:
> >> ```python
> >> from pyarrow import flight, Table
> >>
> >> class SampleServer(flight.FlightServerBase):
> >> def __init__(self, *args, **kwargs):
> >> tls_certificates = [("garbage", "garbage")]
> >> location = flight.Location.for_grpc_tcp("localhost", 8081)
> >> super(SampleServer, self).__init__(location,
> >> None,
> >> tls_certificates,
> >> False,
> >> None,
> >> *args, **kwargs)
> >>
> >> def do_get(self, context, ticket):
> >> data = {'col': [1]}
> >> table = Table.from_pydict(data)
> >> return flight.RecordBatchStream(table)
> >>
> >> if __name__ == "__main__":
> >> server = SampleServer()
> >> server.serve()
> >> ```
> >>
> >> Client code that I think should not work: ```python
> >> import pyarrow.flight as fl
> >> import json
> >> def main():
> >> server_location = "grpc://localhost:8081"
> >>
> >> client = fl.FlightClient(server_location)
> >> ticket = fl.Ticket(json.dumps({}))
> >> reader = client.do_get(ticket)
> >> print(reader.read_all().to_pandas())
> >>
> >> if __name__ == "__main__":
> >> main()
> >> ```
> >>
> >> But when I run the server, and then the client, I get a result: ``` %
> >> python3 client.py
> >>    col
> >> 0    1 ``` I would expect some kind of TLS error.
> >>
> >> I am sure that I am confused about something, but if someone could help me
> >> with my reasoning, I would appreciate it.

Reply via email to