Serveur HTTPS avec Python

J'ai écrit un serveur web simple & client avec python, voici mon code. Je veux mettre en œuvre le protocole HTTPS, pour que je suis en utilisant le standard de la bibliothèque SSL. Je suis à l'aide de Python 2.7.3. J'ai généré un fichier de certificat et de l'auto-signé. J'ai donc .crt et .fichiers de la clé que j'utilise pour le lier sur le socket.

Lorsque je parcours depuis le navigateur, j'obtiens le message d'erreur de certificat est auto-signé et je dois ajouter des exceptions. Puis il travaille.

Code de mon sever :

import BaseHTTPServer
import urlparse
import urllib 
import SocketServer
import threading
import ssl

HOST_NAME = 'localhost'
PORT_NUMBER = 8089


class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()

    def do_GET(self):

        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()

        if self.path == '/get/':
            self.wfile.write('On /get/')
            return
        self.wfile.write('On root')
        return    

    def do_POST(self):
        pass

class ThreadedHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
    pass


if __name__ == '__main__':
    httpd = BaseHTTPServer.HTTPServer((HOST_NAME, PORT_NUMBER), Handler)
    httpd.socket = ssl.wrap_socket (httpd.socket, keyfile='my_key.key', certfile='my_cert.crt', server_side=True)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        httpd.server_close()
    print "Server Stopped - %s:%s" % (HOST_NAME, PORT_NUMBER)

Cependant je suis en train d'utiliser les demandes de module et quand je donne le .crt fichier avec le demandes, j'ai le
erreur:

requests.get('https://localhost:8089', verify=True)
#requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

requests.get('https://localhost:8089', verify='my_cert.crt')
#requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

requests.get('https://localhost:8089', cert='my_crt.crt')
#requests.exceptions.SSLError: [Errno 336265225] _ssl.c:351: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

requests.get('https://localhost:8089', cert=('my_crt.crt', 'my_key.key'))
# requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed    

requests.get('https://localhost:8089', verify=False)
#<Response [200]>

1) Pourquoi j'obtiens cette erreur? Certes, je ne veux pas utiliser 'verify=False'. Je veux valider le certificat
du côté client.

2) (en Supposant que j'arrive à le faire fonctionner) Si je appliquer cert_reqs=CERT_REQUIRED en train de changer :

httpd.socket = ssl.wrap_socket (httpd.socket, keyfile='my_key.key', certfile='my_cert.crt', cert_reqs=CERT_REQUIRED, server_side=True)

alors, ça veut dire que les gens qui ont mon cert fichier (my_cert.crt) sera en mesure d'envoyer une requête et obtenir une réponse et de ceux qui ne l'est pas, ne sera pas en mesure de?

Comparez votre certfile de celui fourni avec les Demandes, assurez-vous qu'ils sont tous les deux dans le même format. C'est le plus évident échec de la cause.
ils sont les mêmes. Enfaite je suis en cours d'exécution à la fois le client et le serveur à partir du même dossier et ils utilisent la même clé
Ce n'est pas ce que je voulais dire. Les demandes livré avec un défaut cacert.pem fichier, comme vous pouvez le voir ici. Je voulais dire que vous devriez assurez-vous que le format correspond au format de votre certfile.

OriginalL'auteur avi | 2013-12-09