안녕하세요????
https 는 SSL을 사용하는 경우인데요...
이경우에는 구현하기 굉장히 복잡할 것입니다...
왜냐하면 웹 서버와 클라이언트가 서로 여러번의 통신을 통해서 암호 키를 생성해서 그 생성된 키로 통신 내용을 암호화 및 복호화 해서 통신을 하니까요...
이 여러번의 통신은 약 10번 정도의 과정을 거치게 됩니다. 물론 서버에 따라서 정도가 틀리지만요...
대충, 인증서(digital certificate) 검증할 수 있는 모듈, 대칭키 암호 모듈, 공개키 암호 모듈, 난수 생성 모듈, 해쉬 함수 모듈 등등...아주 복잡합니다...
그러나, 친절하게도 Eric Young에 의해서 주도되는 오픈 소스 프로젝트로 OpenSSL이라는 프로그램이 있습니다.
http://www.openssl.org 에서 구하실수 있습니다.
참고로 MS IE 등에서는 SSL을 처리할 수 있는 모듈이 들어있으며, 더우기 이러한 과정을 사용자가 모르게 처리해 주기 때문에 걱정할게 없지만요...
님께서 이 페이지를 호출하려면 일단 만드신 프로그램에서 서버와 SSL 프로토콜을 수행할 수 있게 구현해야겠죠...그래야만 서버에서 무슨 내용을 페이지에 보여줄테니까요...
그 후에 서버에서 클라이언트와 인증과정이 맞다면 페이지를 뿌려주겠죠...
근데 제가 답변 드린 내용이 의도와 맞는지 모르겠네요...^^
최종호 님이 쓰신 글 :
: 소켓 프로그램으로 http 페이지를 호출하는 소켓프로그램은 구현을 했는데요..
: https 페이지를 소켓프로그램으로 호출할려고 하니...
: 당장 막막한 느낌이 들어서요.
: 접근하는 방식부터 막혀서 헤메고 있습니다.
:
: 혹시 아래 소스를 보시고
: https 페이지를 호출하는 소켓프로그램 작성에 도움주실분들은 연락주시기 바랍니다..
:
:
:
: ------------
: http페이지를 소켓프로그램으로 호출하는 C module
: ------------
:
: #include <stdio.h>
: #include <string.h>
: #include <stdlib.h>
: #include <time.h>
: #include <sys/types.h>
:
: #include <netdb.h>
: #include <sys/socket.h>
: #include <netinet/in.h>
:
: int main()
: {
: char *str;
: int sockfd, numbytes;
: char buf[1024];
: struct hostent *he;
: struct sockaddr_in their_addr;
: char *strurl;
: char *url_directory;
: char *host_name;
:
: int lenurl;
:
: str = (char *) malloc (sizeof(char) * 512);
: host_name = (char *) malloc (sizeof(char) * 100);
: strurl = (char *) malloc (sizeof(char) * 100);
: url_directory = (char *) malloc (sizeof(char) * 100);
:
: /* URL 문자열 입력 */
: strcpy(host_name,"dic.simmani.com"); // URL
: strcpy(url_directory,"/cgi-bin/search.cgi"); // URL Directory
: strcpy(str,"query=test"); // parameter
:
: if ((he = gethostbyname(host_name)) == NULL) {
: herror("gethostbyname");
: return 1;
: }
: if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
: perror("socket");
: return 1;
: }
:
: their_addr.sin_family = AF_INET;
: their_addr.sin_port = htons(80);
: their_addr.sin_addr = *((struct in_addr *)he->h_addr);
: bzero(&(their_addr.sin_zero), 8);
:
: if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
: perror("connect");
: return 0;
: }
:
: /* HTTP/1.1 프로토콜로 URL 호출 */
: sprintf(strurl, "POST %s HTTP/1.1\n",url_directory);
: send(sockfd, strurl, strlen(strurl), 0);
:
: strcpy(strurl, "Content-Type: application/x-www-form-urlencoded\n");
: send(sockfd, strurl, strlen(strurl), 0);
:
: strcpy(strurl, "Accept-Encoding:gzip, deflate\n");
: send(sockfd, strurl, strlen(strurl), 0);
:
: sprintf(strurl, "Host: %s\n",host_name);
: send(sockfd, strurl, strlen(strurl), 0);
:
: sprintf(strurl, "Content-Length: %d\n\n", strlen(str));
: send(sockfd, strurl, strlen(strurl), 0);
:
: send(sockfd, str, strlen(str), 0);
:
: /* 정상적으로 URL을 호출하였나 찍는 부분 */
: while( recv(sockfd, buf, 1024, 0) > 0)
: printf("%s\n",buf);
:
: close(sockfd);
: }
: