Simple TIdHttpServer Exemple en charge le protocole SSL
En espérant que quelqu'un peut me fournir un simple TIdHttpServer exemple qui prend en charge SSL. À l'aide de Delphi2007 et Indy10. J'ai le texte suivant pour créer/configurer le serveur et ioHandler:
ServerIOHandler := TIdServerIOHandlerSSLOpenSSL.Create(self);
ServerIOHandler.SSLOptions.CertFile := 'mycert.pem';
ServerIOHandler.SSLOptions.KeyFile := 'mycert.pem';
ServerIOHandler.SSLOptions.RootCertFile := 'mycert.pem';
ServerIOHandler.SSLOptions.Method := sslvSSLv23;
ServerIOHandler.SSLOptions.Mode := sslmServer;
ServerIOHandler.SSLOptions.VerifyDepth := 1;
ServerIOHandler.SSLOptions.VerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];
IdHTTPServer1 := TIdHTTPServer.Create;
IdHTTPServer1.AutoStartSession := True;
IdHTTPServer1.SessionState := True;
IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet;
idHttpServer1.ParseParams := True;
idHttpServer1.DefaultPort := 80;
idHttpServer1.IOHandler := ServerIOHandler;
IdHTTPServer1.Active := True;
mycert.pem a été créé à l'aide d'openssl avec cette commande:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
Tout de suite je pense qu'il ya quelque chose de mal parce que je suis en utilisant le même fichier pour CertFile, KeyFile, RootCertFile.
Je suis entré dans les blancs pour les invites à l'exception du nom commun. Que j'étais sûr de définir le nom de domaine, je suis en utilisant (disons, à titre d'hypothèse, il est myexample.com).
Dans un navigateur si j'ai frappé http://myexample.com résultats exception: Erreur d'accepter la connexion avec SSL. Frapper https://myexample.com ne se rend jamais à mon code.
30 janvier NOTE - j'ai utilisé sslbuddy pour générer les clés. Et cela n'a toujours pas de travail. J'ai commenté les lignes suivantes et il a travaillé:
ServerIOHandler.SSLOptions.VerifyDepth := 1;
ServerIOHandler.SSLOptions.VerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];
OriginalL'auteur M Schenkel | 2011-12-27
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez écouter sur 443, vous avez besoin de se lier à elle... (Si vous voulez la normale du trafic HTTP en tant que bien lier également à 80)
Si l'écoute de plus d'un port pour HTTP et HTTPS, lors du traitement de connexions dont vous avez besoin pour permettre normal ou le trafic chiffré en fonction du numéro de port. Il y a un OnQuerySSLPort événement que vous devez l'utiliser pour désactiver le SSL sur le port 80.
Sur les certificats... ça dépend si vous utilisez votre propre autorité de certification ou à l'aide d'un bien public, CA. Juste être conscient que vous devez également être le réglage de la OnGetPassword événement (ServerIOHandler) afin d'informer le serveur de votre mot de passe.
C'est d'OpenSSL qui est en utilisant les certificats - d'Indy est de simplement appeler OpenSSL méthodes. Je n'ai pas utilisé ce sans définir un mot de passe...je suppose que le mot de passe par défaut est vide donc le OnGetPassword événement serait facultatif dans ce cas.
Ok - faire des progrès dans ce domaine. J'ai été en mesure de générer un mot de passe protégé fichier avec openssl. J'ai vérifié, il est en fait en utilisant le mot de passe (si je morph le mot de passe dans le ongetpassword gestionnaire d'elle lève une exception). Maintenant, quand j'essaie de frapper une url https j'obtiens "Erreur d'Accepter la connexion avec ssl. EOF a été observé que viole le protocole" des messages. Une idée? Et c'est ensuite suivi par "SSL3_GET_CLIENT_CERTIFICATE: peer n'a pas de retour d'un certificat" d'exceptions. Est-il un événement j'ai besoin de la poignée qui retourne le certificat?
En regardant ce document: madboa.com/geek/openssl/#cert-self Regarde comme il n'y a plus pour moi de le faire (c'est à dire de générer des clés).
Je vous remercie. Voir mes 30 janvier note. Je pense que dans la fin, le problème était le VerifyDepth et VerifyMode paramètres.
OriginalL'auteur Darian Miller