Невозможно использовать сервер openssl, потому что шифры устарели ... или что-то ... ERR_SSL_VERSION_OR_CIPHER_MISMATCH - PullRequest
0 голосов
/ 11 января 2020

Этот вопрос немного проще, чем мой последний, так что, надеюсь, я получу буквально любой ответ, как минимум, комментарий (пожалуйста.)

Я пытаюсь создать простой сервер сокетов tls, используя OpenSSL, но не может завершить рукопожатие, потому что на моем сервере нет никаких шифров, которые бы использовал ни один браузер (это то, что я вывел). Chrome говорит "ERR_SSL_VERSION_OR_CIPHER_MISMATCH", а Firefox говорит "SSL_ERROR_NO_CYPHER_OVERLAP". Сама программа продолжает работать.

Это довольно простая программа, поэтому я не уверен, почему она так не работает. Версия openssl, установленная на моем компьютере, 1.1.0l-1~deb9u1, но я не уверен, действительно ли это то, на что на самом деле ссылается компилятор, когда я использую -lcrypto, или как я бы это определил.

int main() {
    SSL_library_init();

    OpenSSL_add_all_algorithms();
    OpenSSL_add_all_ciphers();
    SSL_load_error_strings();
    SSL_CTX* ctx = SSL_CTX_new(TLSv1_2_server_method());

    SSL_CTX_use_certificate_file(ctx, "example-com.cert.pem", SSL_FILETYPE_PEM);
    SSL_CTX_use_PrivateKey_file(ctx, "example-com.key.pem", SSL_FILETYPE_PEM);

    int sd = socket(PF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    addr.sin_addr.s_addr = INADDR_ANY;
    bind(sd, (struct sockaddr*) & addr, sizeof(addr));
    listen(sd, 100);
    while (1) {
        struct sockaddr_in clientAddr;
        socklen_t len = sizeof(clientAddr);

        SSL* ssl = SSL_new(ctx);
        int clientFD = accept(sd, NULL, NULL);
        SSL_set_fd(ssl, clientFD);
        SSL_accept(ssl);
        char buf[1024];
        int bytes = SSL_read(ssl, buf, sizeof(buf));
        std::string reply = "HTTP/1.1 301 Moved Permanently\r\nCache-Control: no-store\r\nLocation: https://google.com/ ";
        SSL_write(ssl, reply.c_str(), reply.length());
        SSL_free(ssl);
        close(clientFD);
    }
    close(sd);
    SSL_CTX_free(ctx);
    return 0;
}

edit: Согласно справочной странице, следует использовать TLS_server_method(), но это дало тот же результат. Я также пытался использовать SSL_CTX_set_options() и SSL_CTX_set_cipher_list(), но с теми же результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...