MSYS2(Windows) で OpenSSL

MSYS2をインストールしたので、次に OpenSSL のプログラムをする。
というか Windows11 で OpenSSL を使うのに MSYS2 が最善と Copilot 勧められたのでインストールしたわけだが。

こちらのページに あったソースをWinSock 用に直して使用した。

コンパイルは以下のように打ち込む。
gcc main.c -lcrypto -lssl -lWs2_32

いささかてこずったが、無事終了した。

最初、毎日新聞のサイトで試したがうまくゆかず、 札幌市のページで試したら成功した。
朝日、読売、日経のサイトも成功したが、毎日新聞だけは接続エラーとなる。
原因不明である。

なを、C:\msys64\ucrt64\include\openss\opensslv.h を見ると、
OpenSSL のバージョンは "OpenSSL 3.6.0 1 Oct 2025" となっていた。

ソースはこちらから。

# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <unistd.h>

#include <winsock2.h>
#include <ws2tcpip.h>

# include <openssl/ssl.h>
# include <openssl/err.h>

WSADATA wsaData;
SOCKET hsock;

int main(void) {
    struct sockaddr_in server;
    ADDRINFO hints, *res;
    int rc=0;

    SSL *ssl;
    SSL_CTX *ctx;

    char msg[100];

    char *host = "www.city.sapporo.jp"; //札幌市
    char *path = "/";
    int   port = 443;

    rc=WSAStartup(WINSOCK_VERSION, &wsaData);
    fprintf(stdout, "WSAStartup %d\n", rc);

    // IPアドレスの解決
    memset(&hints, 0, sizeof(hints));
    hints.ai_family   = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    char *service = "https";
    
    if ((rc = GetAddrInfo(host, service, &hints, &res)) != 0) {
        fprintf(stderr, "Fail to resolve ip address - %d\n", rc);
        return EXIT_FAILURE;
    }

    if ((hsock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) {
        fprintf(stderr, "Fail to create a socket.\n");
        return EXIT_FAILURE;
    }

    if (connect(hsock, res->ai_addr, res->ai_addrlen) != 0) {
        printf("Connection error.\n");
        return EXIT_FAILURE;
    }

    ctx = SSL_CTX_new(SSLv23_client_method());
    ssl = SSL_new(ctx);
    rc = SSL_set_fd(ssl, hsock);

    rc=SSL_connect(ssl);
    if (rc!=1) {
        printf("Connection error %d.\n",rc);
        return EXIT_FAILURE;
    }

    sprintf(msg, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", path, host);

    SSL_write(ssl, msg, strlen(msg));
    
    char buf[buf_size];
    int read_size;

    do {
        read_size = SSL_read(ssl, buf, buf_size);
        write(1, buf, read_size);
    } while(read_size > 0);

    SSL_shutdown(ssl);
    SSL_free(ssl);
    SSL_CTX_free(ctx);

    closesocket(hsock);
    WSACleanup();

    return EXIT_SUCCESS;
}

2026年1月9日
  戻る