Hi Jason, 

Thanks for coming back to me. 

I will raise it as an issue to have it discussed further. 

Kind regards,
Vinnie

On Tuesday, 5 August 2025 at 14:21:36 UTC+10 Jason E. Aten wrote:

> Hi Vinnie,
>
> Do you mean the error you got being hard to fathom? I don't have 
> experience with
> getting that same error so I cannot really say.
>
> Filing an issue is the only way I know to have it discussed and considered 
> by
> a library's maintainers; and even if the current behavior is intended, 
> often times
> package author's would like to hear about pain points and sharp edges that 
> can
> be sanded.
>
> Best wishes,
> Jason
> On Monday, August 4, 2025 at 10:53:46 PM UTC+1 Vinnie Vertongen wrote:
>
>> Hi Jason, 
>>
>> Do you have any thoughts or opinions on the issue? 
>>
>> Kind regards,
>> Vinnie
>> On Sunday, 20 July 2025 at 07:57:09 UTC+10 Jason E. Aten wrote:
>>
>>> Hi Michael,
>>>
>>> See the 9th bullet point under 
>>> https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake
>>>
>>> and
>>>
>>> https://en.wikipedia.org/wiki/Mutual_authentication
>>>
>>> In short, client certs are just like server certs. 
>>> Any cert is a public key signed by a (Certificate Authority) private key.
>>> The corresponding CA public key is used to verify the signature on the 
>>> client cert (in TLS).
>>>
>>> The client cert is then used to verify (during the TLS handshake) that 
>>> the client 
>>> possess the private key corresponding to the client cert public key.
>>>
>>> To summarize, client certs, like server certs, are built into TLS. 
>>> They provide for mutual authentication.  
>>>
>>> Most web sites use other forms of client (user) authentication, because 
>>> of
>>> the hassle involved in configuring a web browser to obtain and deploy 
>>> client certs.
>>>
>>> If you want to play with them, I wrote a convenient tool called selfy 
>>> that 
>>> can readily generate CA key pairs and certs; here:
>>>
>>> https://github.com/glycerine/rpc25519/tree/master/cmd/selfy
>>>
>>> with description here:
>>>
>>> https://github.com/glycerine/rpc25519/tree/master?tab=readme-ov-file#the-selfy-tool-create-new-keys-quickly-view-certificates
>>>
>>> Here is how you use them in code (including password protection 
>>> checking):
>>>
>>>
>>> https://github.com/glycerine/rpc25519/blob/bace3bc59bb7a31561687d32f33a36af146994ed/selfcert/step6_loadkeypair.go#L31
>>>
>>> Best,
>>> Jason
>>>
>>> On Saturday, July 19, 2025 at 12:19:37 PM UTC+2 Michael Oguidan wrote:
>>>
>>>> Hi, i will like to follow this with you but i would like to know what's 
>>>> client certificate
>>>>
>>>> On Thursday, July 17, 2025 at 5:06:25 AM UTC Vinnie Vertongen wrote:
>>>>
>>>>> The `crypto/tls` library will not configure the client certificate if 
>>>>> the signing certificate authority is not present in the list provided by 
>>>>> the server in `CertificateRequest`. The current implementation causes the 
>>>>> `remote error: tls: certificate required` error making debugging the 
>>>>> underlying CA issue difficult.
>>>>>
>>>>> Additional notes:
>>>>>
>>>>> 1. The library code in handshake.go intentionally does not configure 
>>>>> the certificate if there is no match 
>>>>> 2. The error is as expected `remote error: tls: unknown certificate 
>>>>> authority` if you downgrade the client to TLS v1.2
>>>>> 3. The behaviour seems intentional and so I didn't want to raise a bug 
>>>>> ticket - but I think this needs an improvement (Config option?) to assist 
>>>>> in debugging - it's confusing without reading the library code to 
>>>>> understand the issue
>>>>>
>>>>>
>>>>> ```
>>>>> package main
>>>>>
>>>>> import (
>>>>> "crypto/tls"
>>>>> "fmt"
>>>>> "log"
>>>>> "net/http"
>>>>> )
>>>>>
>>>>> func main() {
>>>>> clientCert, err := tls.LoadX509KeyPair("certificate", "key")
>>>>> if err != nil {
>>>>> log.Fatalf("Failed to load client certificate: %v", err)
>>>>> }
>>>>>
>>>>> tlsConfig := &tls.Config{
>>>>> Certificates: []tls.Certificate{clientCert},
>>>>> ServerName:   "localhost",
>>>>> }
>>>>> client := &http.Client{
>>>>> Transport: &http.Transport{
>>>>> TLSClientConfig: tlsConfig,
>>>>> },
>>>>> }
>>>>> resp, err := client.Get("https://localhost:8443";)
>>>>> if err != nil {
>>>>> log.Printf("TLS Error: %v", err)
>>>>> return
>>>>> }
>>>>>
>>>>> fmt.Printf("%v\n", resp.Status)
>>>>> }
>>>>> ```
>>>>>
>>>>> Example HAProxy configuration:
>>>>> ```
>>>>> global
>>>>>     daemon
>>>>>
>>>>> defaults
>>>>>     mode http
>>>>>     timeout connect 5000ms
>>>>>     timeout client 50000ms
>>>>>     timeout server 50000ms
>>>>>
>>>>> frontend mtls_frontend
>>>>>     # Client certificate CA not present (remote error: tls: 
>>>>> certificate required)
>>>>>     bind *:8443 ssl crt /etc/ssl/certs/haproxy-server.pem verify 
>>>>> required ca-file /etc/ssl/certs/USERTrust_RSA_Certification_Authority.pem 
>>>>>     # Client certificate CA present (success)
>>>>>     #bind *:8443 ssl crt /etc/ssl/certs/haproxy-server.pem verify 
>>>>> required ca-file /etc/ssl/certs/chain.pem
>>>>>     default_backend web_servers
>>>>>
>>>>> backend web_servers
>>>>>     server web1 127.0.0.1:8080 check
>>>>> ```
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/e2cc6171-f117-4cc9-a9d3-b5b9bcb3ab4dn%40googlegroups.com.

Reply via email to