2009-09-05 10 views
4

Dans Lispworks sur XP quand je fais:SSL avec le package CL Unilatérale + SSL

 
CL-USER 489 > (cl+ssl:make-ssl-client-stream (cl+ssl:stream-fd *standard-output*)) 

je reçois:

 
Error: A failure in the SSL library occurred on handle #. (Return code: 1)SSL error queue: error:140C5042:SSL routines:SSL_UNDEFINED_FUNCTION:called a function you should not call 

Est-ce quelque chose que je fais mal?

+0

Où avez-vous libssl32.dll et libeay32. dll fichiers de? Je ne pouvais pas trouver de combinaison de travail non plus. – Marko

Répondre

1

Il y a deux possibilités ici. Soit vous avez oublié d'appeler une fonction d'initialisation que vous auriez dû appeler avant de faire le flux ou il y a un bogue dans CL + SSL, probablement un qui ne fait surface que sur Lispworks ou Windows XP (c'est probablement le dernier).

La suite de tests CL + SSL s'exécute-t-elle sans problème?

Editer: juste testé ceci sur SBCL/Linux, même erreur. Le problème doit être avec CL + SSL.

+0

Merci beaucoup d'avoir essayé. Je suppose que cela suggère que personne n'utilise CL + SSL pour SSL. Je me demande ce qu'ils utilisent. – Mitch

+1

En fait, CL + SSL est très populaire, étant le seul paquet SSL portable pour CL. Hunchentoot et Drakma l'utilisent sans aucun problème. Par exemple il suffit d'essayer (drakma: http-request "https://fortify.net/sslcheck.html") J'ai vérifié la source Drakma, ce n'est pas très différent de ce que vous essayez, mais il passe un flux TCP réel retourné par comm: open-tcp-stream (sur Lispworks) ou usocket: socket-connect (ailleurs). Donc, je conclus que CL + SSL est sain d'esprit, mais vous devez comprendre comment l'utiliser correctement. – skypher

+0

Ugh, Stack Overflow alimente mon texte de commentaire:/vous devez mettre https et: // devant l'URI de test Drakma et enlever le point-virgule après la citation de fermeture. – skypher

1

Le message d'erreur ici n'est pas utile. Je crois que le vrai problème ici est que CL + SSL attend un flux d'octets, alors que le flux d'entrée standard de base dans Common Lisp est un flux de caractères. Essayez d'utiliser un flux d'octets à la place. Cela devrait fonctionner dans SBCL sous Linux:

(let ((stdin (sb-sys:make-fd-stream 0 
       :input t :buffering :full 
       :element-type '(unsigned-byte 8))) 
    (cl+ssl:make-ssl-client-stream (cl+ssl:stream-fd stdin))) 

Cela repose sur le fait que Unix a l'entrée standard disponible en tant que descripteur de fichier 0. Je ne sais pas comment effectuer une telle astuce sur Windows.

Pour une application réelle, vous ne voulez probablement pas vraiment à travailler depuis l'entrée standard, quelque chose comme cela fonctionnerait, en utilisant la bibliothèque usocket:

(let ((sock (usocket:socket-connect host port :element-type '(unsigned-byte 8)))) 
    (cl+ssl:make-ssl-client-stream (usocket:socket-stream sock))) 
+0

réellement '(let ((sock (usocket: socket-connect" www.google.com "80: type-élément '(unsigned-byte 8)))) (cl + ssl: make-ssl-client-stream (usocket: sock socket-stream))) ' toujours obtenir la même erreur –

+0

Que diriez-vous d'utiliser le port 443 pour SSL sur HTTP? –