0

我正在使用嵌入式 Linux 上的 OPENSSL (openssl-1.0.2) 使用 Mongoose 构建 HTTPS 服务。我首先使用以下密码列表“AES128-SHA256:AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384”进行了尝试,它工作正常。但是,当我尝试仅使用“ECDHE-RSA-AES128-GCM-SHA256”时,编译仍然有效,但是当尝试在服务器和客户端(Windows 10 上的 Chrome)之间进行实际 HTTPS 连接时,连接总是在握手时失败。

这是 openssl 支持的密码列表:

# openssl ciphers | sed 's/:/\n/g'
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
...
ECDH-RSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
ECDH-RSA-AES256-SHA384
ECDH-ECDSA-AES256-SHA384
ECDH-RSA-AES256-SHA
ECDH-ECDSA-AES256-SHA
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-ECDSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-DES-CBC3-SHA
ECDHE-ECDSA-DES-CBC3-SHA
...

# 

根据服务器和客户端之间的数据包捕获,客户端确实支持 ECDHE-RSA-AES128-GCM-SHA256,因此从逻辑上讲握手应该可以工作。证书是使用 RSA 密钥签署的。

这是我设置 SSL 连接的代码。

const char *pem = ctx->config[SSL_CERTIFICATE];
const char *chain = ctx->config[SSL_CHAIN_FILE];
if (!load_dll(ctx, SSL_LIB, ssl_sw) || !load_dll(ctx, CRYPTO_LIB, crypto_sw))
    return 0;
  
// Initialize SSL crap
SSL_library_init();
SSL_load_error_strings();

**if ((CTX = SSL_CTX_new(TLSv1_2_server_method())) == NULL)
    printf("SSL_CTX_new error: %s", ssl_error());**


/** Set cipher list */
//char cipher[128]="AES128-SHA256:AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384";
char cipher[128]="ECDHE-RSA-AES128-GCM-SHA256";
if (SSL_CTX_set_cipher_list(CTX, cipher) <= 0) {
    printf("Failed setting the cipher list.\n");
    return 0;
}

if (CTX != NULL && SSL_CTX_use_certificate_file(CTX, pem, SSL_FILETYPE_PEM) == 0) {
    printf("%s: cannot open %s: %s", __func__, pem, ssl_error());
    return 0;
}else if (CTX != NULL && SSL_CTX_use_PrivateKey_file(CTX, pem, SSL_FILETYPE_PEM) == 0) {
    printf("%s: cannot open %s: %s", NULL, pem, ssl_error());
    return 0;
}

if (CTX != NULL && chain != NULL && SSL_CTX_use_certificate_chain_file(CTX, chain) == 0) {
    printf("%s: cannot open %s: %s", NULL, chain, ssl_error());
    return 0;
}

我所做的只是,

  1. 将方法从SSLv23_server_method()更改为TLSv1_2_server_method()
  2. 将密码列表从“AES128-SHA256:AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384”更改为“ECDHE-RSA-AES128-GCM-SHA256”

任何帮助都会有所帮助,谢谢。

4

0 回答 0