[Twisted-Python] Deprecate and remove t.internet.ssl.DistinguishedName ?
Wim Lewis
wiml at hhhh.org
Sat May 30 00:16:29 MDT 2020
I'm looking at a fix for bug <https://twistedmatrix.com/trac/ticket/9804>
(Cannot load a PEM certificate with Unicode in subject). The underlying
problem is that the DistinguishedName class can't handle non-ascii AVAs.
The fix I've made simply avoids creating DistinguishedName instances when
it isn't necessary, but that leaves the question of what to do with the
class. I think that the best thing to do is to deprecate the class
entirely and replace it with simpler API.
Reasons I think that the DN class is broken:
- The values in a certificate are conceptually text-strings, not
byte strings; they may be in ASCII, UTF8, UTF16, or several
other encodings. However
- DN represents these textual values as `bytes` instead of `str`
- DN can't handle non-ASCII-representable values at all, even if
the user never tries to access that value
- It can only handle a subset of the attribute-assertions found in
a PKIX DN; there's no escape hatch for others (e.g. OID keys or
whatever)
- It can't represent the full structure of a DN (specific ordering,
multiple-value RDNs, AVAs whos values aren't textual, etc.) ---
these are not common in the PKIX world but they are valid
What I propose as an alternative:
- Replace APIs that take `DistinguishedName` classes with ones that take
`Union[OpenSSL.crypto.X509Name, dict]` where the `dict` format is parsed
with the same convenience semantics as DistinguishedName, except that
values are `str`
- Replace APIs that return `DistinguishedName` with ones that return
OpenSSL.crypto.X509Name, which is already fairly convenient to use
(e.g. it has attributes for retrieving/setting commonName
and so on without dealing with the full complexity of X.500 names)
- Deprecate `DistinguishedName` and the APIs that use it for eventual removal
- Expose a convenience function for the dict -> X509Name transform
Any objections? Thoughts on how I should go about doing this? Should I
do it as part of this Trac ticket or split it out?
The only downside I can think of is that this exposes the
OpenSSL.crypto.X509Name type as part of Twisted's API. I don't think
this is a huge reduction in flexibility --- Twisted's API already somewhat
assumes that TLS is implemented using OpenSSL, and only users whose needs
are *already* not well met by DistinguishedName will care if that `Union`
type changes in the future.
Wim Lewis / wiml at hhhh.org
More information about the Twisted-Python
mailing list