linux - SSL 使用自签名证书但不使用 CA 签名证书
问题描述
我正在尝试使用 c 语言在服务器(Linux)和客户端(POS 终端)之间建立 ssl 连接。我可以使用自签名证书连接到服务器,但不能使用 CA 签名证书。连接因 ssl 握手错误而终止。我在双方都使用相同的文件集。我已经检查了证书的有效性及其可用性。我也使用了不同类型的协议,例如 TLSv1_2_client_method 等,但没有运气。谢谢你。
客户端.c
SSL_load_error_strings();
SSL_library_init();
OPENSSL_add_all_algorithms_noconf();
sslContext = SSL_CTX_new(SSLv23_client_method());
if (sslContext == NULL ){
ERR_print_errors_fp(stderr);
return SSLERR;
}
SSL_CTX_set_options(sslContext, SSL_OP_ALL | SSL_OP_NO_SSLv2);
SSL_CTX_set_options(sslContext, SSL_OP_SINGLE_DH_USE);
SSL_CTX_set_cipher_list(sslContext, CIPHERS_LIMIT);//all ciphers used
iRet = SSL_CTX_load_verify_locations(sslContext, con->szCA, NULL);
SSL_CTX_set_verify(sslContext,SSL_VERIFY_PEER,NULL);
SSL_CTX_set_default_passwd_cb_userdata(sslContext, "1234");
SSL_CTX_use_certificate_file(sslContext, con->szCert, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(sslContext, con->szKey,SSL_FILETYPE_PEM);
SSL_CTX_check_private_key(sslContext);
# define SSL_ERROR_WANT_READ 2
# define SSL_ERROR_WANT_WRITE 3
while ((r = SSL_do_handshake(con->sslHandle)) != 1 && OsTimerCheck(&timer) > 0) {
int err = SSL_get_error(con->sslHandle, r);
if (err == SSL_ERROR_WANT_WRITE) {
events |= POLLOUT;
events &= ~POLLIN;
OsLog( LOG_ERROR, "return want write set events %d\n", events);
}
else if (err == SSL_ERROR_WANT_READ) {
events |= EPOLLIN;
events &= ~EPOLLOUT;
OsLog( LOG_ERROR, "return want read set events %d\n", events);
}
else {
OsLog( LOG_ERROR, "SSL_do_handshake return %d error %d errno %d
msg %s\n", r, err, errno, strerror(errno));
ERR_print_errors_fp(stderr);
check1(0, SSLERR_CONNECT, "do handshake error");
}
日志:
return want write set events 12 \n return want read set events 9 \n SSL_do_handshake return -1 error 1 errno 0 msg Success \n do handshake error \n
服务器.c
SSL_library_init();
OpenSSL_add_all_algorithms(); /* load & register all cryptos, etc. */
SSL_load_error_strings(); /* load all error messages */
if ((ctx = SSL_CTX_new(SSLv23_server_method())) == NULL)
if (SSL_CTX_use_certificate_file(ctx, CERT_FILE, SSL_FILETYPE_PEM)
if (SSL_CTX_use_PrivateKey_file(ctx, KEY_FILE, SSL_FILETYPE_PEM)
{
fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", KEY_FILE);
slog_debug(0, "ERROR: failed to load %s, please check the file", KEY_FILE)
return -1;
}
if ( SSL_CTX_check_private_key(ctx)!=SSL_SUCCESS )
if (!SSL_CTX_load_verify_locations (ctx, CA_FILE, NULL))
解决方案
推荐阅读
- r - 如何使用多面图添加趋势线
- python - Python多处理:运行更多的进程速度较慢
- javascript - 我想使用数组和循环(for循环)优化我的javascript代码
- python - 在 Flask 单元测试中设置用户上下文
- python - 从python中的给定文件列表中提取文件夹结构
- java - Long young(ParNew) GC 暂停
- java - Camel Aws 使用 acl public 移动文件
- javascript - 为什么 setState 回调会抛出错误:“来自 useState() 和 useReducer() Hooks 的状态更新不支持第二个回调参数...”
- vue.js - router-link 无法跳转到页面
- python - Django rest 框架反转序列化器