Hi Kartik,

See my inline responses

Regards,
Sachin

On Tue, Sep 13, 2022 at 1:36 PM 'Kartik Aiyer' via grpc.io <
grpc-io@googlegroups.com> wrote:

> Hi Sachin, et al,
>
> A follow up question. Given that the server is at 10.0.0.39 and the client
> attempts to connect with its certificate using the IP address specifically,
> the server reports that "No match found for server name: 10.0.0.39". Does
> the server expect the client to connect using common name or an address
> specified in the servers subjectAlternativeName only ?
>
I was expecting this kind of error: "No match found for server name:
10.0.0.39"
As I had mentioned earlier, this is expected from the server.
There is a way to override this behavior by calling SetSslTargetNameOverride
as discussed in this
<https://groups.google.com/g/grpc-io/c/ClsSH9K9_q0/m/FKFvmOnuAgAJ> thread.
But, it is a bad security practice as described in the same thread.

If IP keeps changing, having hostname as DNS in the SAN field of
server cert is the best option for you.

I will wait to see if any other grpc experts commenting on this.

> i.e only connections attempts to addresses or DNS names specified in the
> certificate of the server are accepted ? Even if there server is listening
> on other addresses, the client cannot use those addresses directly to
> connect ? If I attach server hostname dynamically when an IP address is
> assigned to the camera then I'm guessing that would work provided the
> client uses the host name to connect, though I'm not sure how the client
> will translate the hostname to an actual address given that there is no DNS
> serer in the internal network.
>
> Thanks
> Kartik
>
> On Monday, September 12, 2022 at 4:08:46 PM UTC-7 Kartik Aiyer wrote:
>
>> HI Sachin,
>>
>> Thanks a bunch for the quick response. Currently the camera (server) is
>> running avahi and the uses mdns to find all cameras found on the network. I
>> then use the IP address of a discovered camera to connect. The IP address
>> of the camera or the clients are dynamic and are typically assigned by DHCP
>> so I don’t think a static IP address would work. I can assign a hostname to
>> the camera (server) though I cannot assign one to the clients.
>>
>> I have few questions based on my ignorance of mTLS.
>> Assuming I could add the hostname of the camera to its server
>> certificate’s common name, is this what the client will use in addition to
>> the signature check to validate the server ?
>>
>> Given that the client can be any machine, I only want to confirm that the
>> client program written by me is the one that can connect to the server. Is
>> there a way I can tell the server to only validate the signature of client
>> supplied certificate and skip the host name or IP address checks ?
>>
>> Finally, a question about subjectAlternateName. I’ve currently added the
>> 0.0.0.0 address to both the server and client extension files. What does
>> it mean to the client when it see a IP address of 0.0.0.0 in the server
>> certificate’s subjectAlternativeName. Does it mean the client will accept
>> the connection only if the server is on localhost ? Similarly what does it
>> mean to the server when it sees 0.0.0.0 in the client’s
>> subjectAlternativeName ?
>>
>> Thanks a bunch for the help and I truly appreciate your time.
>>
>> Here are logs of a remote call made from my computer to the camera both
>> of which are on my home wifi.
>> Server
>>
>> Sep 12 22:46:32 buildroot kt_cam[204]: E0912 22:46:32.284179389     208 
>> ssl_transport_security.cc:1807] No match found for server name: 10.0.0.39.
>>
>> Client
>>
>> [2022-09-12 15:46:32.235] [info] Running on 10.0.0.39:50051
>> [2022-09-12 15:46:32.246] [info] Starting
>> [2022-09-12 15:46:32.410] [error] 14: failed to connect to all addresses
>> [2022-09-12 15:46:32.410] [info] Greeter received: RPC failed
>>
>> The only error I get from the client when I call the stub is “failed to
>> connect to all addresses” however on the server end I get the above error
>> which says no match for server name. Little confused why it says that. P.S:
>> 10.0.0.39 is the server (camera) IP address.
>>
>> Thanks again for the help.
>>
>> Kartik
>> On Monday, September 12, 2022 at 2:39:26 PM UTC-7 ssachinb...@gmail.com
>> wrote:
>>
>>> Hi Kartik,
>>>
>>> The below answer is assuming that your local mTLS is working but remote
>>> mTLS is failing. If this is not the case, clarify what is not working and
>>> are you getting any error logs.
>>>
>>> It is not mandatory for the client's IP to be part of the client's cert.
>>> But the server's cert needs to have the server's IP or hostname. This
>>> should match with how the client is going to connect to the server.
>>>
>>> For the local client, 0.0.0.0 might work but for the remote clients
>>> running on a different machine, this server cert does not work.
>>>
>>> How is the remote client connecting to the server?
>>> 1. If it is based on IP directly, add that IP as well in the server
>>> cert. You can add multiple IPs in SAN
>>> 2. If it is based on hostname, add the DNS name something like
>>> this: subjectAltName=DNS:<serverHostname>,IP:x.y.z.a
>>>
>>> Let us know if it works
>>>
>>> Regards,
>>> Sachin
>>>
>>> On Mon, Sep 12, 2022 at 2:02 PM 'Kartik Aiyer' via grpc.io <
>>> grp...@googlegroups.com> wrote:
>>>
>>>> The following script is what I used to generate the certificates
>>>>
>>>> #!/bin/bash
>>>> rm *.pem
>>>> # Generate a self-signed CA certificate and private key
>>>> openssl req -x509 -newkey rsa:4096 -days 3650 -keyout ca-key.pem -out 
>>>> ca-cert.pem -nodes -subj 
>>>> "/C=US/ST=California/O=Motive/OU=Embedded/CN=sc1-grpc-ca"
>>>> # Display info on self-signed CA certificate
>>>> openssl x509 -in ca-cert.pem -noout -text
>>>> # Generate a server private key and CSR
>>>> openssl req -newkey rsa:4096 -keyout kt-cam-key.pem -out kt-cam-req.pem 
>>>> -nodes -subj "/C=US/ST=California/O=Motive/OU=Embedded/CN=sc1-kt-cam" 
>>>> -addext "subjectAltName = IP:0.0.0.0"
>>>> # Use the CA cert to sign the kt-cam server CSR
>>>> openssl x509 -req -in kt-cam-req.pem -CA ca-cert.pem -CAkey ca-key.pem 
>>>> -CAcreateserial -out kt-cam-cert.pem -days 3650 -extfile kt-cam-ext.cnf
>>>> # Generate a client private key and CSR for kt_iot
>>>> openssl req -newkey rsa:4096 -keyout kt-iot-key.pem -out kt-iot-req.pem 
>>>> -nodes -subj "/C=US/ST=California/O=Motive/OU=Embedded/CN=sc1-kt-iot" 
>>>> -addext "subjectAltName = IP:0.0.0.0"
>>>> # Use the CA cert to sign the kt-iot client CSR
>>>> openssl x509 -req -in kt-iot-req.pem -CA ca-cert.pem -CAkey ca-key.pem 
>>>> -CAcreateserial -out kt-iot-cert.pem -days 3650 -extfile kt-iot-ext.cnf
>>>> # Generate a client private key and CSR for kt_cli
>>>> openssl req -newkey rsa:4096 -keyout kt-cli-key.pem -out kt-cli-req.pem 
>>>> -nodes -subj "/C=US/ST=California/O=Motive/OU=Embedded/CN=sc1-kt-cli" 
>>>> -addext "subjectAltName = IP:0.0.0.0"
>>>> # Use the CA cert to sign the kt-cli client CSR
>>>> openssl x509 -req -in kt-cli-req.pem -CA ca-cert.pem -CAkey ca-key.pem 
>>>> -CAcreateserial -out kt-cli-cert.pem -days 3650 -extfile kt-cli-ext.cnf
>>>>
>>>> All the extension files look like this
>>>>
>>>> subjectAltName = IP:0.0.0.0
>>>>
>>>> Thanks
>>>> Kartik
>>>> On Monday, September 12, 2022 at 1:51:39 PM UTC-7 Kartik Aiyer wrote:
>>>>
>>>>> Hello folks
>>>>>
>>>>> We have implemented a gRPC server on our embedded linux based camera
>>>>> and have a couple of clients that are expected to run on both the camera
>>>>> itself (so local loopback connection) as well as on host computers that 
>>>>> are
>>>>> on the same subnet as the camera. Both the server and clients are written
>>>>> in C++ and use the gRPC C++ API. I’m trying to use mutual TLS so that only
>>>>> clients written by us can connect to the server.
>>>>>
>>>>> I setup a self-signed root CA and used it to sign a server certificate
>>>>> and client certificate (more than one client certificate since I have more
>>>>> than one client). I’m not sure what is the best way to setup the
>>>>> certificate. From what I understand that either the common name or
>>>>> subjectAlternativeNames will be used to verify a connection in addition to
>>>>> the signature with the root certificate.
>>>>> Server
>>>>>
>>>>>    - I can setup the camera’s hostname to something that will match
>>>>>    the common name in the certificate. Is this the recommended approach ?
>>>>>
>>>>> Client
>>>>>
>>>>>    - I can’t set the hostnames of the clients, so I’m not sure what
>>>>>    to put in the common name for the server to verify. Any recommendation 
>>>>> here
>>>>>    ?
>>>>>
>>>>> Currently I’m using a subjectAlternativeName of IP:0.0.0.0 which
>>>>> allows me to make calls over local loopback but its not usable over the
>>>>> network.
>>>>>
>>>>> I’m using SslCredentials and SslServerCredentials but I’m wondering
>>>>> if I should be using the TlsCredentials and TlsServerCredentials with
>>>>> some kind of of custom verification callback. I would appreciate any 
>>>>> advice
>>>>> on setting up the certificates appropriately for the usecase I have
>>>>> described.
>>>>>
>>>>> To summarize, the client is expected to connect to the cameras on the
>>>>> same network and be able to use the remote API.
>>>>>
>>>>> Thanks
>>>>> Kartik
>>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "grpc.io" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to grpc-io+u...@googlegroups.com.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/grpc-io/87e3c94e-2935-46c4-8bd7-fd407f9070d0n%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/grpc-io/87e3c94e-2935-46c4-8bd7-fd407f9070d0n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
> You received this message because you are subscribed to the Google Groups "
> grpc.io" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to grpc-io+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/grpc-io/54b6f81b-bd13-431b-867a-e37603d6e902n%40googlegroups.com
> <https://groups.google.com/d/msgid/grpc-io/54b6f81b-bd13-431b-867a-e37603d6e902n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to grpc-io+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/CA%2BbEEAdySDTMzJLRoZmQPAZQfMNc%3DBx9qJH1_vuraE6cn7Hsdw%40mail.gmail.com.

Reply via email to