ste*_*rab 3 c ssl xcode openssl exc-bad-access
我最近想通过使用BSD套接字来构建自己的客户端-服务器系统。某些时候,我想加入SSL来加密数据传输。我按照本教程进行操作,并使用Xcode(添加了链接器标志:-lssl -lcrypto)很好地编译了代码,但是EXC_BAD_ACCESS一旦程序到达SSL_CTX_use_certificate_file()调用位置,我就一直得到所有的时间。您可以在下面看到使用的代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
int main(int argc, const char * argv[])
{
SSL_METHOD *method = NULL;
SSL_CTX *ctx = NULL;
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
method = SSLv2_server_method();
ctx = SSL_CTX_new(method);
SSL_CTX_use_certificate_file(ctx, "/Users/steve/certificate.pem", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "/Users/steve/key.pem", SSL_FILETYPE_PEM);
printf("Hello, World!\n");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
如果程序无法在指定的路径中找到证书,则它不会崩溃,但是我当然不会进行任何SSL加密。证书本身可能有问题吗?我只是使用以下命令通过openssl生成了一个:
# generate the key
$ openssl genrsa -out key.pem 1024
# generate request
$ openssl req -new -key key.pem -out request.pem
# fill in all the stuff ...
# generate certificate
$ openssl x509 -req -days 30 -in request.pem -signkey key.pem -out certificate.pem
Run Code Online (Sandbox Code Playgroud)
任何的想法?
更新:在将OS X部署目标设置为10.7或更高版本的情况下进行编译时,实际上会出现一些警告,因为所有这些SSL内容都显示为已弃用。是否有建议的替代方法来保护SSL套接字?
问题是您需要调用SSL_library_init,查看代码内部的修改(始终处理我们调用的函数中的错误也是一种很好的做法:-):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
int main(int argc, const char * argv[])
{
//SSL_METHOD *method = NULL;
SSL_CTX *ctx = NULL;
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
//method = SSLv2_server_method();
//ctx = SSL_CTX_new(method);
/* Without this line you got an error when calling SSL_CTX_new */
SSL_library_init();
ctx = SSL_CTX_new(SSLv2_server_method());
if(!ctx)
{
fprintf (stderr, "SSL_CTX_new ERROR\n");
ERR_print_errors_fp(stderr);
return EXIT_FAILURE;
}
if (!SSL_CTX_use_certificate_file(ctx, "/Users/steve/certificate.pem", SSL_FILETYPE_PEM))
{
fprintf (stderr, "SSL_CTX_use_certificate_file ERROR\n");
ERR_print_errors_fp(stderr);
return EXIT_FAILURE;
}
SSL_CTX_use_PrivateKey_file(ctx, "/Users/steve/key.pem", SSL_FILETYPE_PEM);
printf("Hello, World!\n");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3241 次 |
| 最近记录: |