How to validate the SSL server certificate in twisted SSL client

python, ssl, ssl-certificate, twisted

Solution

Since Twisted 14.0, `optionsForClientTLS` is the best way to do this:

from twisted.internet.ssl import optionsForClientTLS
from twisted.internet.endpoints import SSL4ClientEndpoint

ctx = optionsForClientTLS(hostname=u"example.com")
endpoint = SSL4ClientEndpoint(reactor, host, port, ctx)
factory = ...
d = endpoint.connect(factory)
...

`optionsForClientTLS` takes other (optional) arguments as well which may also be useful.

Prior to Twisted 14.0, the process was a bit more involved:

After the connection is established and the SSL handshake has completed successfully (which means the certificate is currently valid based on its `notBefore` and `notAfter` values and that it is signed by a certificate authority certificate which you have indicated is trusted) you can get the certificate from the transport:

certificate = self.transport.getPeerCertificate()

The certificate is represented as a pyOpenSSL X509 instance. It has a method you can use to retrieve the certificate's subject name:

subject_name = certificate.get_subject()

The subject name is a distinguished name, represented as a pyOpenSSL X509Name instance. You can inspect its fields:

common_name = subject_name.commonName

This is a string, for example `"example.com"`.

If you need to inspect the `subjectAltName` instead (which it's likely you do), then you can find this information in the extensions of the certificate:

extensions = certificate.get_extensions()

This is a list of pyOpenSSL X509Extension instances. You'll have to parse each one to find the `subjectAltName` and its value.

Problem

How do I validate the SSL server certificates in my twisted SSL client? I am very much beginner to the SSL, I have gone through the twisted SSL tutorials but still I am unclear about some things. My queries are: How should I validate the SSL server certificate using `twisted.internet.ssl` module, How `ssl.ClientContextFactory.getContext` method is useful while dealing with SSL, How can I tell twisted SSL client about the location of the public key file?

Original source