OpenSSLをWindowsでビルドしてみた
ここ*1見ながら openssl-1.0.2d をビルド。
動作確認のためテストプログラムをごにょにょと書いてみた。
サーバー側
// ssltcps.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <ws2tcpip.h> #include <openssl/ssl.h> #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "libeay32.lib") #pragma comment(lib, "ssleay32.lib") int _tmain(int argc, _TCHAR* argv[]) { int sockfd, newsockfd, clilen, n = 1, portno = 10000; char buffer[1024]; struct sockaddr_in serv_addr, cli_addr; WSADATA wsaData; WSAStartup(MAKEWORD(2,0), &wsaData); if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&n, sizeof(n)); memset((char *)&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("bind"); exit(1); } listen(sockfd, 5); clilen = sizeof(cli_addr); if ((newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen)) < 0) { perror("accept"); exit(1); } // SSLの初期化 SSL_library_init(); SSL_CTX *ctx = SSL_CTX_new(TLSv1_server_method()); SSL *ssl = SSL_new(ctx); SSL_set_fd(ssl, newsockfd); // SSLの公開鍵と秘密鍵の読みだし SSL_use_certificate_file(ssl, "public.key", SSL_FILETYPE_PEM); SSL_use_PrivateKey_file(ssl, "private.key", SSL_FILETYPE_PEM); // SSL通信の開始 SSL_accept(ssl); memset(buffer, 0, sizeof(buffer)); SSL_read(ssl, buffer, sizeof(buffer)); printf("%s\n", buffer); // SSLの終了 SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); closesocket(newsockfd); closesocket(sockfd); WSACleanup(); return 0; }
クライアント側
// ssltcpc.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <ws2tcpip.h> #include <openssl/ssl.h> #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "libeay32.lib") #pragma comment(lib, "ssleay32.lib") int _tmain(int argc, _TCHAR* argv[]) { int sockfd; struct sockaddr_in serv_addr; struct hostent *server; char hostname[] = "localhost"; int portno = 10000; char msg[] = "test text"; WSADATA wsaData; WSAStartup(MAKEWORD(2,0), &wsaData); if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } if ((server = gethostbyname(hostname)) == NULL) { perror("gethostbyname"); exit(1); } memset((char *)&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; memcpy((char *)&serv_addr.sin_addr.s_addr, (char *)server->h_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("connect"); exit(1); } // SSLの初期化 SSL_library_init(); SSL_CTX *ctx = SSL_CTX_new(TLSv1_client_method()); SSL *ssl = SSL_new(ctx); // SSL通信の開始 SSL_set_fd(ssl, sockfd); SSL_connect(ssl); if (SSL_write(ssl, msg, strlen(msg)) < 0) { perror("SSL_write"); exit(1); } // SSLの終了 SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); closesocket(sockfd); WSACleanup(); return 0; }