James,

Thanks for the feedback. I think Alan already addressed most of the issues. Here are my comments on the remaining items.



Why do TSSslCertFindByName() and TSSslCertFindByAddress() take a TSSslVConn 
argument?

I'm using the TSSslVConn to cache a pointer to the global cert table (loaded from ssl_multicert.config). Since in theory the ssl_multicert.config could be reloaded at any point, we acquire() a copy of the pointer before going into the PRE_HANDSHAKE and SNI hooks, and release() that pointer at the end. Originally I thought of having a TSSslCertTableGet() and then pass that into the TSSslCertFind*() functions, but decided to squish out the explicit LookupTable call.

Actually, as I'm writing this up, I realize that since I removed the explicit reference to the Lookup table from the API, I don't need to cache a copy of the lookup table in the framework. The TSSslCertFind*() functions can just acquire and release as they go. I'll go ahead and do that API simplification. That will remove the TSSslVConn argument.

Previously, then we looked at SSL integration APIs, we eschewed wrapped types 
like TSSslContext in favour of directly returning OpenSSL pointers (as void *). 
My argument at the time was that there's a lot of API surface needed to deal 
with SSL and not much value in just wrapping OpenSSL.

Can definitely go either way here. Another benefit of the opaque types is that the compiler can do some minimal type checking for you. Not a huge issue for me either way.


There's no TSSslVConnOp value for the default action? ie. to just accept the 
SSL session?
Definitely would be good to have the default to undo.  Will get that added

IIRC, OpenSSL doesn't guarantee anything about the SNI name except that is is a 
bag of bytes. Is it OK for TSSslVConnServernameGet() to present that as a C 
string?
The servername is not null terminated in the packet, but OpenSSL does null terminate it before handing back the value via SSL_get_servername(). I went back through the openssl to verify the null termination. Interestingly some data structures in there are storing the servername as buffer plus length, but the one returned is NULL terminated and data only. Internally they are doing many strlen and strcmp operations on it.

Finally, I'm not thrilled with the idea of using ssl_multicert.config to 
specify the tunneling action. What would you do if you had a wildcard cert and 
only wanted to tunnel a specific name?
In the wildcard case, e.g, a cert for *.bob.com, you could create a self signed cert to represent fred.bob.com and then use that cert to enter a config line to blind tunnel traffic to fred.bob.com. In the tunnel case the cert is only used select traffic, so it need not be signed by a 'real' CA.

Of course, I'm open to other options. As Alan noted, one could write a plugin for any complex scenarios, but adding a config-only option for simple cases seems like a good idea.

Thanks,
Susan

Reply via email to