EVP_DecryptFinal_ex:bad decrypt

启动wss服务,发现报错:

_tls_common.js:156
      c.context.setKey(key, passphrase);
                ^

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
 

经过研究,可以通过去除key的passphrase,因为我根本就没有提供passphrase:

1、创建密钥

使用openssl工具生成一个RSA私钥

openssl genrsa -des3 -out server.key 2048

注意:生成私钥,需要提供一个至少4位,最多1023位的密码。

2、生成CSR(证书签名请求)

openssl req -new -key server.key -out server.csr

说明:需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。

可以将证书发送给证书颁发机构(CA),CA验证过请求者的身份之后,会出具签名证书,需要花钱。另外,如果只是内部或者测试需求,也可以使用OpenSSL实现自签名。

3、删除密钥中的密码

openssl rsa -in server.key -out server.key.pem

说明:如果不删除密码,在应用加载的时候会出现输入密码进行验证的情况,不方便自动化部署。

4、生成自签名证书

内部或者测试使用,只要忽略证书提醒就可以了。

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

5、生成pem格式的公钥

有些服务,需要有pem格式的证书才能正常加载,可以用下面的命令:

openssl x509 -in server.crt -out server.pem -outform PEM

使用配置:

const cfg = {
    port: 8888,
    ssl_key: 'server.key.pem',
    ssl_cert: 'server.crt'
};

即可避免这个错误,记录一下。不知道是不是提供一个不输入phase的key,就可以不需要删除密钥中的密码那一步了,欢迎实践过的网友补充!

// AES解密 QByteArray KeyUtils::aesDecrypt(const QByteArray& data, const QByteArray& key) { if (key.size() != AES_BLOCK_SIZE || data.size() <= AES_BLOCK_SIZE) { return QByteArray(); } EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); if (!ctx) return QByteArray(); // 提取IV QByteArray iv = data.left(AES_BLOCK_SIZE); QByteArray ciphertext = data.mid(AES_BLOCK_SIZE); if (EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, reinterpret_cast<const unsigned char*>(key.constData()), reinterpret_cast<const unsigned char*>(iv.constData())) != 1) { EVP_CIPHER_CTX_free(ctx); return QByteArray(); } // 准备输出缓冲区 int out_len = ciphertext.size() + AES_BLOCK_SIZE; unsigned char* out = new unsigned char[out_len]; int len1, len2; if (EVP_DecryptUpdate(ctx, out, &len1, reinterpret_cast<const unsigned char*>(ciphertext.constData()), ciphertext.size()) != 1) { delete[] out; EVP_CIPHER_CTX_free(ctx); return QByteArray(); } //输出 { // 验证密钥(key)的一致性 int nSize = key.size(); //密钥长度 QByteArray arr = key.toHex(); //密钥内容 //验证 IV(初始化向量)的正确性 int nIV = iv.size(); QByteArray arrIV = iv.toHex(); //检查密文(ciphertext)的完整性 int nCiphertext = ciphertext.size(); //密文长度 QByteArray arrCiphertext = ciphertext.left(16).toHex(); int n = EVP_DecryptFinal_ex(ctx, out + len1, &len2); qDebug() << "..."; } if (EVP_DecryptFinal_ex(ctx, out + len1, &len2) != 1) { // 打印错误信息 unsigned long err; while ((err = ERR_get_error()) != 0) { char errMsg[256]; ERR_error_string_n(err, errMsg, sizeof(errMsg)); qDebug() << "OpenSSL 错误:" << errMsg; // 关键:根据错误信息定位问题 } delete[] out; EVP_CIPHER_CTX_free(ctx); return QByteArray(); } int total_len = len1 + len2; QByteArray result(reinterpret_cast<char*>(out), total_len); delete[] out; EVP_CIPHER_CTX_free(ctx); return result; }上面内容在QT Lib静态库中执行EVP_DecryptFinal_ex值为0,errmsg错误:"error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt. 但是上面同样的代码,在单独的exe执行值为1。其中输出部分如arr,arrIV,arrCiphertext等在lib静态库和exe中值输出是完全一样的。分析原因
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值