Tag: openssl

openssl:减少内存使用量

美好的一天。 我们有一个用C ++编写的服务器,它接受许多SSL / TLS连接; 我们正在使用boost :: asio(所以后端是openssl )来建立SSL。 在服务器上,每个连接使用大约160-200k字节的内存,我们希望减少这种使用。 boost :: asio默认使用SSL_MODE_RELEASE_BUFFERS标志,因此基本优化已经完成。使用ctx->freelist_max_len似乎没有任何改变。 怎么做到这一点? 也许我们还有一个额外的“秘密设置”? 可能我们可以安全地禁用一些加密算法来减少内存消耗?

如何将公钥存储为c数组

我一直在寻找这个问题的答案,所以我可能会发布我发现的内容。 我正在使用openssl来签署和validation许可证,使用私钥进行签名和公钥进行validation。 因为我要将公钥发送给客户进行validation,所以我无法将其提供给他并要求输入密钥的路径,因为他可以使用自己的私钥/公钥更改公钥并加密消息。 解决方案:将公钥存储在C程序中作为数组。 现在我需要更改我的公钥读取代码: EVP_PKEY *public_key = NULL; public_key_fd = fopen( public_key_path, “r” ); if ( !public_key_fd ) // something went wrong PEM_read_PUBKEY( public_key_fd, &public_key, NULL, NULL ); fclose( public_key_path ); 使用字符串而不是文件的东西。

如何将subjectNameAlt扩展名添加到X509_REQ?

我正在创建一个将由我的服务器处理的CSR。 它需要设置subjectNameAlt,以便服务器可以处理它。 我进行了广泛的搜索,并且只发现了如何使用普通的X509证书,而不是X509_REQ。 我怎么能这样做(使用C和OpenSSL。即我需要相当于X509_get_ext_d2i但是X509_REQ )?

没有填充的OpenSSL RSA加密无法正确加密

我们尝试使用“RSA_public_encrypt()”方法(Symbian上的openSSL)执行RSA加密,但我们并没有取得成功。 加密本身成功,但加密文本(我们尝试匹配哈希)不是它应该是的(在其他平台上,我们检查了这是我们现在它正常工作,我们在这里得到不同的值)。 我们认为这可能是由于输入没有以正确的格式提供给“RSA_public_encrypt()”方法。 代码: #define RSA_E 0x10001L void Authenticator::Test(TDesC8& aSignature, TDesC8& aMessage) { RSA *rsa; char *plainkey; char *cipherkey; int buffSize; // create the public key BIGNUM * bn_mod = BN_new(); BIGNUM * bn_exp = BN_new(); const char* modulus2 = “137…859”; // 309 digits // Convert to BIGNUM int len = BN_dec2bn(&bn_mod, modulus2); // with […]

如何提供OpenSSL随机数据以用于ECDSA签名?

我想在使用EC密钥签名数据期间提供OpenSSL特定数据以用作随机种子。 我这样做是为了将我的应用程序与另一个引用程序(闭源)进行比较。 该实用程序将文件与私钥,带有数据的文件进行签名,并将随机数据作为参数进行归档。 我已经获得了EC密钥的生成和数据签名,但由于我没有共同点,因此无法比较这两个应用程序。 OpenSSL生成用于签名数据的随机数据(可能来自/ dev / random),因此每次运行都会给我一个不同的签名。 我已经尝试将RAND_clear()与RAND_add()结合使用,但不断改变签名。 要么我不了解整个ECDSA概念,要么我做错了。 我比较应用程序的第二个选项是导入公钥并validation参考程序生成的签名。 这是更好的选择,但我无法导入给定的示例公钥(83个字符的hex字符串)。 EC_POINT_oct2point()不断给我null结果。 任何帮助/指针/参考将不胜感激。 char * key_as_binary_data; //369368AF243193D001E39CE76BB1D5DA08A9BC0A63307AB352338E5EA5C0E05A0C2531866F3E3C2702 int data_size; //Size of the key buffer EC_POINT * ecpoint = NULL; EC_GROUP * ecgroup = NULL; EC_KEY * eckey = NULL; point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; int asn1_flag = OPENSSL_EC_NAMED_CURVE; eckey = EC_KEY_new(); ecpoint = EC_POINT_new(ecgroup); ecgroup […]

OpenSSL中的内存泄漏?

我使用以下代码检查签名。 为简单起见,公钥,消息和签名在main中初始化。 #include #include #include #include int main(){ const unsigned char key[] = “—–BEGIN PUBLIC KEY—–\n” “MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALulMfYFyX1kSm7oUxZyCWWhrBBcWrRA\n” “V7LSz1PzMPxoxG3KS8H7PRKFkIk42yM8/vhobmcCmj7UM5572wWch50CAwEAAQ==\n” “—–END PUBLIC KEY—–\n”; unsigned int key_len = sizeof(key); const unsigned char data[] = {0x6d,0x65,0x73,0x65,0x0a}; unsigned int data_len = sizeof(data); const unsigned char sig[] = {0xa9,0x29,0x81,0x07,0x8c,0xeb,0xf0,0x1b,0x2a,0x31,0xe5,0x60,0x94,0x8a,0x47,0x94,0x3a,0x8f,0x6b, 0x4e,0x85,0xb9,0xe7,0xe5,0x4a,0x6c,0x56,0x46,0xd1,0x80,0x15,0x57,0xce,0xcb,0x0a,0x3a,0x67,0x15,0xed, 0x68,0x03,0x58,0x99,0xa4,0x73,0x61,0xe3,0x30,0x85,0xff,0x89,0x7e,0x32,0xef,0x16,0xec,0x23,0x7f,0x14, 0xde,0xbf,0x53,0xe0,0x3a}; unsigned int sig_len = sizeof(sig); EVP_PKEY* evp_pubkey = EVP_PKEY_new(); […]

使用openssl生成DSA密钥对

我想使用C生成私钥和公钥,以便在身份validation过程中使用它们。 你能给我一个基本的例子来生成C中的密钥吗? 我发现了这些function,但我不知道如何使用它们: DSA * DSA_generate_parameters(int bits, unsigned char *seed, int seed_len, int *counter_ret, unsigned long *h_ret, void (*callback)(int, int, void *), void *cb_arg); int DSA_generate_key(DSA *dsa); 请帮帮我! 谢谢! 🙂

什么是包属性以及如何生成它们?

在将一些证书从密钥库转换为openssl / pem时,我第一次注意到证书之前有“Bag Attributes”。 看起来像这样: Bag Attributes friendlyName: CN=PositiveSSL CA,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB subject=/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=PositiveSSL CA issuer=/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN-USERFirst-Hardware 他们是否提供任何function? 我注意到我喜欢它们,因为它们使我的链文件(证书的串联)更加清晰。 可悲的是,我下载的ca证书没有它们。 那么我该如何生成它们呢?

什么可以解释对free()的调用堆腐败?

我已经调试了几天的崩溃,这发生在OpenSSL的深处(与维护者讨论)。 我花了一些时间进行调查,所以我会尝试让这个问题变得有趣且内容丰富。 首先,为了给出一些上下文,我重现崩溃的最小样本如下: #include #include #include #include #include #include int main() { ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); ENGINE_load_builtin_engines(); EC_GROUP* group = EC_GROUP_new_by_curve_name(NID_sect571k1); EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED); EC_KEY* eckey = EC_KEY_new(); EC_KEY_set_group(eckey, group); EC_KEY_generate_key(eckey); BIO* out = BIO_new(BIO_s_file()); BIO_set_fp(out, stdout, BIO_NOCLOSE); PEM_write_bio_ECPrivateKey(out, eckey, NULL, NULL, 0, NULL, NULL); // <= CRASH. } 基本上,此代码生成椭圆曲线键并尝试将其输出到stdout 。 类似的代码可以在openssl.exe ecparam和Wikis online上找到。 它在Linux上运行正常(valgrind报告根本没有错误)。 它只在Windows上崩溃(Visual Studio 2013 […]

为什么我的服务器总是响应“没有证书”?

我正在尝试使用以下的SSL客户端/服务器示例: http : //simplestcodings.blogspot.com.br/2010/08/secure-server-client-using-openssl-in-c.html来创建安全连接使用SSLv3,但没有成功。 我更改了客户端以尝试在客户端加载证书,添加了服务器示例中存在的LoadCertificates函数。 我按照本教程创建了证书。 我的问题是,当我连接到服务器时,客户端可以看到有关服务器证书的信息,但服务器从不加载有关客户端证书的信息。 这是我的客户端代码: //SSL-Client.c #include #include #include #include #include #include #include #include #include #include #define FAIL -1 //Added the LoadCertificates how in the server-side makes. void LoadCertificates(SSL_CTX* ctx, char* CertFile, char* KeyFile) { /* set the local certificate from CertFile */ if ( SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0 ) { […]