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?
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
Vous devez vous connecter pour publier un commentaire.
D'un certificat SSL et ne peuvent être validés par le client si il a le certificat utilisé pour la signature de la validation de certificat.
C'est la principale raison pour laquelle les certificats auto-signés ne sont pas couramment utilisés sur Internet.
Habituellement, vous demandez de l'organisation (Autorité de Certification) pour vous inscrire, vous certificat de avec ses.
Ces AC sont généralement approuvés par les gens et les autres organisations ainsi que leurs certificats ne sont déjà intégrés dans de nombreux clients.
Donc, si vous voulez faire tout le monde de pouvoir valider votre certificat, vous ne devriez pas signer. Il y a beaucoup de CA existe et certains de ces problèmes certificat gratuitement.
Sauf si vous obtenez un CA-certificat signé seulement les personnes qui ont déjà de votre certificat de valider.
EDIT:
Comme une note de côté: lorsque vous dites à votre navigateur pour ajouter une exception pour un site particulier, vous êtes lui disant de ne pas valider à tous de son certificat. Donc, vous ne serez pas protégé contre les MITM.
Dans ce cas, vous pouvez utiliser un certificat auto-signé, mais vous avez à donner à tous ceux qui ont à se connecter à votre serveur. Ensuite, ils doivent ajouter à leur navigateur. Si, au contraire, ils ajoutent une exception, l'utilisation de SSL devient inutile.
oui, je peux le donner à des gens.
OriginalL'auteur smeso