Extrait de la Clé Publique à l'aide de pyOpenSSL de certificat ou d'autres informations de connexion

Je suis en train d'essayer d'écrire un python script serveur qui doit authentifier le client actuel, basé sur sa clé publique. Depuis que je suis en utilisant tordu, exemple dans le tordu documenteation qui m'a.

Alors que je peux générer des clés, se connecter et communiquer à l'aide de l'exemple de code, je n'ai pas encore trouvé un moyen d'obtenir la clé publique du client dans un format utilisable. Dans cette question stackexchange quelqu'un a extrait la clé publique d'un OpenSSL.crypto.PKey objet, mais ne peuvent pas le transformer dans un format lisible. Depuis que j'ai accès à la PKey objet du certificat x509 dans le verifyCallback de la méthode ou par l'intermédiaire de self.transport.getPeerCertificate() à partir de n'importe quelle méthode de mon Protocole, ce serait une bonne façon d'aller. La (non accepté) réponse suggère d'essayer crypto.dump_privatekey(PKey). Malheureusement, ce n'est pas vraiment rendement le résultat attendu:
Alors que le BEGIN PRIVATE KEY et BEGIN PRIVATE KEY dans la réponse pourrait être résolu par une simple fonction de remplacement de texte, la chaîne base64 ne semble pas correspondre à la clé publique. J'ai extrait la clé publique avec openssl rsa -in client.key -pubout > client.pub comme mentionné ici. Il ne correspond pas au résultat de la dump_privatekey fonction.

Alors qu'il est encore bug ouvert vers OpenSSL sur launchpad, il n'est pas encore fixé. Il a été rapporté de 19 Mois, et il y a quelques récentes (octobre 2012), l'activité sur elle, je n'ai pas le moindre espoir d'un rapide fix dans le repos.

Avez-vous d'autres idées de comment je pourrais obtenir la clé publique dans un format comparable à la client.pub fichier je l'ai mentionné ci-dessus? Il est peut-être un tordu ou OpenSSL connexion spécifique de l'objet qui détient cette information. Veuillez noter que j'ai pour stocker la clé publique dans le protocole d'un objet, tel que je peux y accéder plus tard.

Pourquoi pas de Réponse acceptée?

M2Crypto par J. F. Sebastian

Désolé, que je n'avais pas pensé à une possibilité où je ne peut pas corréler le certificat pour la connexion. J'ai ajouté l'exigence que j'ai pour stocker la clé publique à l'intérieur du protocole de l'instance. Ainsi, à l'aide peerX509.as_pem() à l'intérieur de la postConnectionCheck fonction comme suggéré par J. F. Sebastian ne fonctionne pas. En outre, au moins dans la version 0.21.1-2ubuntu3 de python-m2crypto j'ai appeler peerX509.get_rsa().as_pem() pour obtenir le droit de clé publique. À l'aide de peerX509.as_pem(None) (depuis peerX509.as_pem() veut toujours un mot de passe), on obtient exactement le même résultat que crypto.dump_privatekey(PKey) dans PyOpenSSL. Peut-être il y a un bug.

En plus de cela, la réponse m'a montré un moyen possible d'écrire une autre solution en utilisant les éléments suivants Echo classe de protocole:

class Echo(Protocol):
    def dataReceived(self, data):
        """As soon as any data is received, write it back."""
        if self.transport.checked and not self.pubkeyStored:
            self.pubkeyStored = True
            x509 = m2.ssl_get_peer_cert(self.transport.ssl._ptr())
            if x509 is not None:
                x509 = X509.X509(x509, 1)
                pk = x509.get_pubkey()
                self.pubkey = pk.get_rsa().as_pem()
                print pk.as_pem(None)
            print self.pubkey
        self.transport.write(data)

Comme vous pouvez le voir il utilise certaines classes internes que je voudrais éviter. Je suis hésitant de la soumission d'un petit patch qui permettrait d'ajouter un getCert méthode à la TLSProtocolWrapper classe dans M2Crypto.Le protocole SSL.TwistedProtocolWrapper. Même si elle a été acceptée en amont, il serait de casser la compatibilité de mon script avec les mais la plupart des coupe-de-la-pointe versions de m2crypto. Que feriez-vous?

Externe OpenSSL appel par moi -

Bien, c'est un vilain solution de contournement externe, commandes du système juste ce qui me semble encore pire que l'accès à la non-public des attributs.

OriginalL'auteur sumpfomat | 2012-12-12