2010-03-08 5 views
2

J'ai une implémentation de SSL poignée de main du côté client, en utilisant ces fonctions: SSL_CTX_load_verify_locations SSL_CTX_use_certificate_chain_file SSL_CTX_use_PrivateKey_fileOpenSSL avec des chemins unicode

Toutes les fonctions se char * type pour le paramètre de nom de fichier. Comment puis-je le modifier pour prendre en charge également les emplacements de fichiers Unicode?

Merci!

Répondre

1

Sur quelle plateforme? OpenSSL sous Posix prend en charge les chemins UTF-8, mais pas sur d'autres plates-formes. Les chances sont, vous devrez charger manuellement les fichiers de certificat vous-même en utilisant les fonctions d'E/S standard du fichier OS qui supportent les chemins Unicode, puis analyser les données brutes et les charger dans OpenSSL, comme par PEM_read_bio_X509 avec sk_X509_NAME_push, PEM_read_bio_PrivateKey/d2i_PrivateKey_bio avec SSL_CTX_use_PrivateKey, d2i_X509_bio/PEM_read_bio_X509 avec SSL_CTX_use_certificate, etc

+0

Merci de répondre. J'ai besoin qu'il fonctionne sous Windows ... Qu'est-ce que le 'mapping' pour SSL_CTX_load_verify_locations? Merci! – rkellerm

+0

Il n'y a pas de mappage direct. Vous devrez le pirater. En interne, SSL_CTX_load_verify_locations() appelle X509_STORE_load_locations(), qui à son tour appelle X509_STORE_add_lookup(), X509_LOOKUP_load_file() et X509_LOOKUP_add_dir(). Essayez de définir une structure X509_LOOKUP_METHOD personnalisée qui ouvre un fichier comme vous le souhaitez, puis passez cette structure à X509_STORE_add_lookup() avant d'appeler X509_LOOKUP_load_file() et X509_LOOKUP_add_dir(). Puisque l'API utilise char *, vous devrez utiliser la conversion de type pour transmettre un nom de fichier wchar_t * à votre implémentation X509_LOOKUP_METHOD. –

+0

Regardez dans ssl_lib.c, x509_d2.c, x509_lu.c, et by_file.c pour voir comment l'implémentation actuelle de SSL_CTX_load_verify_locations() est configurée. C'est par défaut X509_LOOKUP_METHOD utilisé, SSL_LOOKUP_file(), utilise l'API BIO pour lire les fichiers de certificat. Vous devrez probablement faire en sorte que votre implémentation utilise également des BIO, mais vous pouvez utiliser un BIO basé sur un FICHIER * afin que vous puissiez appeler _wfopen() pour ouvrir les noms de fichiers Unicode. –

0

Je veux répondre à l'article ci-dessus au lieu de créer une nouvelle réponse, mais je n'ai pas été en mesure de répondre, alors je crée une nouvelle réponse. Basé sur mes tests pour SSL_CTX_load_verify_locations et en regardant le code openssl, en fait l'openssl utiliserait utf-8 pour le chemin du fichier aussi bien sur Windows. À la fonction BIO_new_file pour ouvrir un fichier, il choisirait utf-8 pour le chemin du fichier si les deux _WIN32 et CP_UTF8 sont définis. Ceux-ci sont définis à windows. Cependant, openssl a aussi du code pour revenir au chemin ANSI si le chemin n'est pas un caractère utf-8 valide. Donc, avec ça, en fait openssl fonctionnera avec les deux chemins utf-8 et ANSI sous Windows.

+0

Je viens de découvrir que sur les fenêtres l'API SSL_CTX_use_certificate_chain_file nécessiterait le chemin ANSI car il utilise une fonction différente de BIO_new_file pour lire le fichier. La fonction est statique longue MS_CALLBACK fichier_ctrl (BIO * b, int cmd, long num, void * ptr) qui n'a pas l'utf8 à ANSI retomber. – windfly2006

Questions connexes