Yeah. I have a proof of concept complete. It's a bit more than 3 lines. It's just under 100 lines. Error handling, etc.
1. This needs to be something devs can use without a lot of effort or they just push back and use file-based HTTPS servers. 2. This needs to have no loss of functionality. Otherwise, adoption will be slow at best. On Friday, October 8, 2021 at 9:21:33 AM UTC-5 seank...@gmail.com wrote: > It's only 3 lines excluding error handling if you just want to use a > static string. > And you'll likely want to setting up your own http.Server anyway to have > control over timeouts (and also your own mux to prevent leaking debug > handlers). > > In practice you may actually want o use crypt/tls.Config.GetCertificate > instead, to allow your server to update certs from your secret store > without a restart. > > On Friday, October 8, 2021 at 3:52:29 PM UTC+2 Sam Caldwell wrote: > >> Sorry for the delayed response. I needed to noodle on this option and >> talk to some of the devs who would need to implement this. >> >> 1. Setting up an http.Server{} and tls.Config will work. But it is a lot >> of effort for devs who want to focus on the business logic. >> 2. This creates more code the golang users (devs) need to implement and >> maintain...which disincentivizes a non-file-based approach. >> >> I've created my own library to do what is suggested in this thread, but >> I'd say that as a community we should pursue a better option. >> On Monday, September 13, 2021 at 4:14:01 PM UTC-5 bse...@computer.org >> wrote: >> >>> On Mon, Sep 13, 2021 at 3:03 PM Sam Caldwell <ma...@samcaldwell.net> >>> wrote: >>> >>>> Does anyone have any ideas of an easy path to load certificate and key >>>> files from a string rather than a file? >>>> >>>> *Use Case:* >>>> 1. traditionally we all put a cleartext file on disk with our private >>>> key and public certificate. If the server is breached, we just regenerate >>>> all the things and move on. >>>> 2. I would like to store my certificates and keys in a more secure >>>> location (AWS SSM Param store, Hashicorp Vault, etc.). >>>> 3. The certificate is only read from file at startup as best I can >>>> tell, and relocating certificates and keys to an encrypted store would (a) >>>> allow better auditing when the content is accessed, (b) restrict access to >>>> only authorized processes and (c) make rotating keys and certificates a >>>> much easier process. >>>> >>>> *Analysis:* >>>> *Current Functionality:* >>>> - We setup a server using ListenAndServeTLS() and pass in a filename >>>> for the certificate and key. >>>> - In go1.17.1/src/net/http/server.go at 3066, tls.LoadX509KeyPair() >>>> loads is called. >>>> - LoadX509KeyPair() exists at 230 in src/crypto/tls/tls.go and >>>> - It calls os.ReadFile() at 231 and 235. >>>> *Possible Solution:* >>>> - We cannot break existing things, and within the limitations of >>>> golang, it is probably the least-disruptive solution to add a new >>>> ListenAndServeTLSFromVar() which would functionally do everything >>>> ListenAndServeTLS() does, but instead of reading a file, it would instead >>>> accept the input string as the certificate/key content. >>>> - Alternatively ListenAndServeTLSFromVar() would accept a boolean >>>> parameter which would determine if certificate and key parameters are >>>> filenames or content strings. in this case, ListenAndServeTLSFromVar() >>>> would support both filenames and content string use cases and provide a >>>> path to unifying the approach if the community begins to adopt the use >>>> case >>>> identified above in large numbers. >>>> >>> >>> You can already do this by creating an http.Server{} with a tls.Config >>> initialized from the certificates you have. You have to decode and parse >>> the certificates from strings to create the tls.Config. >>> >>> >>> >>>> >>>> *Conclusion:* >>>> I'm willing to do the work and contribute the code to implement the >>>> above, but I wanted to solicit opinions first. Ideally the functionality >>>> exists already and I am reinventing a wheel. In that case, please point >>>> me >>>> in the right direction so I can focus my efforts on my current project. >>>> >>>> -- >>>> 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...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/golang-nuts/6e283ce3-7802-4765-9fd3-156d01c65bbbn%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/golang-nuts/6e283ce3-7802-4765-9fd3-156d01c65bbbn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- 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 on the web visit https://groups.google.com/d/msgid/golang-nuts/7e705e2b-27de-4fa8-85c5-ef3f5476d35dn%40googlegroups.com.