C++ Can';不要使用openssl服务器,因为密码已过时…或其他…错误\u SSL\u版本\u或\u密码\u不匹配

C++ Can';不要使用openssl服务器,因为密码已过时…或其他…错误\u SSL\u版本\u或\u密码\u不匹配,c++,openssl,C++,Openssl,这个问题比我的上一个问题要简单一些,所以希望我能得到任何回复,比如至少一条评论(请) 我正在尝试使用OpenSSL创建一个简单的tls套接字服务器,但无法完成握手,因为我的服务器没有任何浏览器将使用的密码(这就是我推断的)。Chrome说“ERR\u SSL\u VERSION\u或\u CIPHER\u MISMATCH”,Firefox说“SSL\u ERROR\u NO\u CYPHER\u OVERLAP”程序本身一直在运行 这是一个相当简单的程序,所以我不知道为什么它会以这种方式失败。

这个问题比我的上一个问题要简单一些,所以希望我能得到任何回复,比如至少一条评论(请)

我正在尝试使用OpenSSL创建一个简单的tls套接字服务器,但无法完成握手,因为我的服务器没有任何浏览器将使用的密码(这就是我推断的)。Chrome说“
ERR\u SSL\u VERSION\u或\u CIPHER\u MISMATCH
”,Firefox说“
SSL\u ERROR\u NO\u CYPHER\u 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;
}

编辑:根据手册页,应该使用
TLS\u server\u method()
,但结果相同。我还尝试使用了
SSL\u CTX\u set\u options()
SSL\u CTX\u set\u cipher\u list()
,但结果相同。

您不也需要包含一些标题吗?顺便说一句,我得到的
const SSL\u METHOD*TLSv1\u 2\u server\u METHOD()是不推荐的
。是的,但显然函数
TLSv1\u 2\u server\u METHOD()
是不推荐的。我知道的不多,我明白了。这件事我知道的不多。你的证书是最新的吗?也许你需要生成或获取新的证书?嗯。。。我在自己的网页上使用Let's Encrypt’s certs,它们似乎总是有效的。但那是几年前的事了。我知道你可以运行
openssl
来显示证书有效的时间段,但我说过,那是很久以前的事了。@TedLyngmo我解决了我的一个问题。二进制文件与源文件不在同一文件夹中,因此证书和pk实际上没有被使用。我只是把它指向了确切的目录。如果你愿意,你可以得到帮助我的答案。如何添加标题?