2008-12-18 5 views
2

J'ai une application MFC qui utilise actuellement CAtlHttpClient pour interroger un serveur Web pour obtenir des informations.Comment parler SSL à partir d'un client MFC Windows?

Je voudrais changer cela afin que la requête se passe en toute sécurité, avec l'authentification du serveur, en utilisant SSL.

recherche sur Google révèle que Microsoft a changé la façon dont ils prennent en charge plusieurs fois, par exemple, WinInet, WinHTTP, mais pour la vie de moi je ne peux pas comprendre comment faire ci-dessus en utilisant MFC sous MSVS 2005.

L'application est en C++, et si possible, je voudrais éviter de faire glisser .Net dans l'image.

Toute aide, des conseils, des suggestions ou des pointeurs grandement apprécié!

Merci,

ony

Répondre

2

En 2002, j'ai écrit un article pour le magazine Windows Developer qui a montré comment utiliser OpenSSL pour fournir SSL pour la CAsyncSocket de MFC. Le code et l'article sont ici: http://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html et pourraient vous aider. Vous pouvez aussi faire quelque chose de similaire en utilisant Microsoft SChannel mais c'est un peu plus compliqué car OpenSSL fait une partie de la mise en mémoire tampon pour vous, tout ce que vous avez à faire est de pousser des octets jusqu'à obtenir un texte clair sur ...

+0

Merci - bel article! Je préférerais une solution qui me permet de tirer parti du code de Microsoft, plutôt que de transporter OpenSSL. SChannels semblent un peu trop bas niveau ... Merci encore. Rony – ronys

4

vous pouvez jeter un oeil sur Ultimate TCP/IP - il est MS convivial et peut faire ce que vous êtes après:

http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx

J'utilise cette boîte à outils et il est très bon.

+0

Merci pour le pointeur - ressemble à une boîte à outils utile, bien que peut-être un peu exagéré pour mon projet. En outre, la licence est "La licence Open Project (CPOL) 1.02", qui ne figure pas parmi les licences approuvées par OSI dans http://opensource.org/licenses. Rony – ronys

+0

... Quoi, donc en utilisant MFC est ok, mais une licence libre qui n'est pas 'OSI approuvé' n'est pas? Et parce que ça ne fait pas exactement ce dont vous avez besoin, mais un peu plus, c'est "exagéré"? Si vous n'aimez pas les réponses, ne posez pas la question ... – Roel

+0

La beauté de Ultimate TCP/IP est que vous avez seulement besoin de compiler dans les parties que vous voulez - dans ce cas, juste le support HTTPS - à peine exagérer à mon humble avis . – Rob

1

utiliser juste WinHttp, il est un grand API et a tout ce que vous devez faire SSL sur HTTP (plus fonctionne avec la configuration du proxy de Vista aller de l'avant)

+0

SSL Dans WinHTTP, https://msdn.microsoft.com/en-us/library/windows/desktop/aa384076(v=vs.85).aspx, explique les bases de SSL avec WinHTTP et l'utilisation de certificats. –

0

J'utilise Visual Studio 2005 avec une application MFC a des fonctionnalités pour accéder à un site Web pour un petit fichier. J'utilise les fonctions WinINet, see the WinINet API reference in Microsoft Windows Dev Center, qui fournit un ensemble simple de fonctions qui accède à un site Web en utilisant une URL qui spécifie le protocole (HTTP, HTTPS, FTP, etc.) pour extraire un petit fichier.

En regardant sur le site libcurl, il y avait une référence à cette note technique de Microsoft, Article Id 238425 - INFO: WinInet Not Supported for Use in Services qui est marqué comme retiré en août-12-2015. Le résumé de l'article est:

Les fonctions Microsoft Win32 Internet (exportées à partir de WinInet.dll) sont non pris en charge lorsqu'il est exécuté à partir d'un service ou d'une application Internet Information Server (IIS) (également un service). Cet article traite en utilisant le WinInet.dll dans un service ou dans Internet Information Server applications.

Le code source applicable J'utilise dans mon application MFC a une boîte de dialogue qui utilise une URL de type HTTPS auquel est joint des informations supplémentaires pour construire un URI complet puis aller sur le site Web pour tirer la petite complète le fichier est:

int GetFile (HINTERNET hOpen, TCHAR * szURL, BYTE szTemp[4096]) 
{ 
    DWORD dwSize; 
    TCHAR szHead[15]; 
    HINTERNET hConnect; 

    szHead[0] = '\0'; 
    szTemp[0] = 0; 

    // Opens a resource specified by a complete HTTP URL. 
    if (!(hConnect = InternetOpenUrl(hOpen, szURL, szHead, 15, INTERNET_FLAG_DONT_CACHE, 0))) 
    { 
     DWORD dwlasterror = GetLastError(); 
     if (dwlasterror == ERROR_INTERNET_NAME_NOT_RESOLVED) { 
      AfxMessageBox (_T("Error: ERROR_INTERNET_NAME_NOT_RESOLVED - check LAN connectivity.")); 
     } else if (dwlasterror == ERROR_INTERNET_TIMEOUT) { 
      AfxMessageBox (_T("Error: ERROR_INTERNET_TIMEOUT - check LAN connectivity.")); 
     } else if (dwlasterror == ERROR_INTERNET_SERVER_UNREACHABLE) { 
      AfxMessageBox (_T("Error: ERROR_INTERNET_SERVER_UNREACHABLE - check LAN connectivity.")); 
     } else if (dwlasterror == ERROR_INTERNET_OPERATION_CANCELLED) { 
      AfxMessageBox (_T("Error: ERROR_INTERNET_OPERATION_CANCELLED - check LAN connectivity.")); 
     } else { 
      CString msg; 
      msg.Format (_T("Error: GetLastError() returned %d."), dwlasterror); 
      AfxMessageBox (msg); 
     } 
     return -2; 
    } 

    // Reads data from a handle opened by the InternetOpenUrl, FtpOpenFile, or HttpOpenRequest function. 
    if (InternetReadFile (hConnect, szTemp, 4096, &dwSize)) 
    { 
     if (dwSize) { 
      return dwSize; 
     } 
     return -3; 
    } 
    return -4; 
} 

int DownloadURLImage (TCHAR * szURL, BYTE szTemp[4096]) 
{ 
    int result = -1; 
    HINTERNET hInternet; 

    // Initializes an application's use of the WinINet functions. 
    hInternet= InternetOpen (_T("DeviceConfig"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); 
    if (hInternet) { 
     // if open succeeded then get the file and close the handle as we be done. 
     result = GetFile (hInternet, szURL, szTemp) ; 
     InternetCloseHandle(hInternet); 
    } 
    return result ; 
} 
Questions connexes