【发布时间】:2017-05-15 17:17:30
【问题描述】:
我必须使用带有 RSA 签名的 SHA1 和我在 C 中的私钥对一组数据进行签名。我正在使用 OpenSSl 库。但是我总是没有收到 OPENSSL_Applink 错误。我试过以下:
- 包括 applink.c
- 静态链接库仅限 libcrypto-1_1.a
- 调试 applink.c 以查看表的问题
- 由于我无法包含 applink.c,因此我在我的项目中手动将源代码添加到相同的文件名中,导致应用程序无响应。
我使用的是eclipseCDT氧气版。 我是 openSSl 库的初学者,如果有人知道这样做的好例子,我也想给我发送链接。我还尝试添加 OpenSSL_add_all_digests() 和 OpenSSL_add_all_algorithms(),但没有成功。
注意:这里的代码可能是错误的,但我的问题是当编译器点击 openssl 库项目的第一个自定义函数时崩溃并出现错误 no OPENSSL_Applink,所以这是我的主要问题,而不是修复代码本身。
这是一个代码sn-p:
int rsaSign(char *in_file, char * sig_file){
char *data = NULL;
int data_len;
unsigned int sig_len;
unsigned char *sig;
int err = -1;
OpenSSL_add_all_digests();
FILE *fd;
EVP_PKEY *priv_key = EVP_PKEY_new();
RSA *privkey = NULL;
printf( "we are here..\n");
if ((fd = fopen(PRIVKEY_FILE, "r")) == NULL){
printf("error reading file\n");
exit(0);
}
privkey = RSA_new();
if (!PEM_read_PrivateKey(fd, &privkey, NULL, NULL))
{
fprintf(stderr, "Error loading RSA Private Key File.\n");
return 2;
}
fclose(fd);
if (!EVP_PKEY_assign_RSA (priv_key, privkey))
{
fprintf(stderr, "EVP_PKEY_assign_RSA: failed.\n");
return 3;
}
if (!priv_key) {
printf("no private key\n");
}
EVP_PKEY_set1_RSA(privkey, priv_key);
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
const EVP_MD *md = EVP_get_digestbyname("SHA1");
if (!md) {
fprintf(stderr, "Error creating message digest");
fprintf(stderr, " object, unknown name?\n");
ERR_print_errors_fp(stderr);
exit(1);
}
if (!EVP_SignInit(ctx, md))
{
fprintf(stderr, "EVP_SignInit: failed.\n");
EVP_PKEY_free(priv_key);
return 3;
}
printf( "now to sign update..\n");
data = readFile(in_file);
data_len = strlen(data);
printf("data len = %d\n", data_len);
if (!EVP_SignUpdate(ctx, data, data_len))
{
fprintf(stderr, "EVP_SignUpdate: failed.\n");
EVP_PKEY_free(priv_key);
return 3;
}
printf( "now to sign final..\n");
sig = malloc(EVP_PKEY_size(privkey)); //!!!!! SEGMENTATION FAULT HERE !!!!!
if (!EVP_SignFinal(ctx, &sig, &sig_len, priv_key))
{
fprintf(stderr, "EVP_SignFinal: failed.\n");
free(sig);
EVP_PKEY_free(priv_key);
return 3;
}
free(data);
free(sig);
EVP_PKEY_free(priv_key);
return EXIT_SUCCESS;
}
【问题讨论】:
-
你说你不能链接到
libssl(例如链接到-lssl -lcrypto)? -
我可以链接它们或其他任何东西,但我的目标是静态链接它们,因为我读到如果你在我的案例中使用 dll 会出现问题(没有 OPENSSL_Applink)
-
可能我忘了说,我的程序是单线程的,在调试的时候发现它使用了多线程,这可能是个问题吗?
-
好吧,如果你想分发你的代码,这通常只是一个问题。 Eclipse 设置正确的环境来查找 .dll 库应该没有问题(这告诉我你在windoze上)。这取决于您使用的是 VS 还是 MinGW(MinGW 的版本也存在差异)。您可能需要查看how to do static linking of libwinpthread-1.dll in mingw? 以获得指导。
-
谢谢,是的,我使用的是windoze,minGW 3.4.5 版本,是的,我想分发代码。你认为问题可能是我使用的是 openssl 的预编译版本吗?