Этот вопрос немного проще, чем мой последний, так что, надеюсь, я получу буквально любой ответ, как минимум, комментарий (пожалуйста.)
Я пытаюсь создать простой сервер сокетов 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()
, но с теми же результатами.