openssl 握手失败

2023-12-30

我正在尝试编写简单的 C openssl 客户端和服务器。这是客户的代码:

int main() {
    int err;

    SSL_CTX * ctx = init_ctx("client-cert.pem", "client-private.pem", "certs/cacert.pem", "clientpass");
    if (!ctx) {
        fprintf(stderr, "couldn't init ctx\n");
        exit(1);
    }

    int sock = tcp_connect("localhost", 4443);

    /* Connect the SSL socket */
    SSL * ssl = SSL_new(ctx);
    BIO * sbio = BIO_new_socket(sock,BIO_NOCLOSE);
    SSL_set_bio(ssl,sbio,sbio);

    if((err = SSL_connect(ssl)) != 1) {
        switch(SSL_get_error(ssl, err)) {
            case SSL_ERROR_NONE:
            fprintf(stderr, "error SSL_ERROR_NONE\n");
            break;
            case SSL_ERROR_ZERO_RETURN:
            fprintf(stderr, "errorSSL_ERROR_ZERO_RETURN \n");
            break;
            case SSL_ERROR_WANT_READ:
            fprintf(stderr, "error SSL_ERROR_WANT_READ\n");
            break;
            case SSL_ERROR_WANT_WRITE:
            fprintf(stderr, "error SSL_ERROR_WANT_WRITE\n");
            break;
            case SSL_ERROR_WANT_CONNECT:
            fprintf(stderr, "error SSL_ERROR_WANT_CONNECT\n");
            break;
            case SSL_ERROR_WANT_X509_LOOKUP:
            fprintf(stderr, "error SSL_ERROR_WANT_X509_LOOKUP\n");
            break;
            case SSL_ERROR_SYSCALL:
            fprintf(stderr, "error SSL_ERROR_SYSCALL\n");
            break;
            case SSL_ERROR_SSL:
            fprintf(stderr, "error SSL_ERROR_SSL\n");
            break;
            default:
            fprintf(stderr, "error f****** s***!!!\n");
            break;
        }
        fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL));
        ERR_print_errors_fp(stderr);
        //exit(1);
    }

    check_cert(ssl, "host.com");
    fprintf(stderr, "%d bytes sent\n", send_request(ssl, "come with me, we'll go dreaming"));   

    /* shutdown ssl connection */
    err = SSL_shutdown(ssl);
    if (err < 0) {
        ERR_print_errors_fp(stderr);
        exit(1);
    }

    close(sock);
    SSL_free(ssl);
    SSL_CTX_free(ctx);

    return 0;
}

ssize_t send_request(SSL * ssl, const char * req) {
    fprintf(stderr, "sending request...\n");
    ssize_t size = SSL_write(ssl, req, strlen(req));

    if (size < 0) {
        ERR_print_errors_fp(stderr);
    }

    return size;
}

SSL_get_error(ssl, err)回报SSL_ERROR_SYSCALL and send_request返回以下错误:5269:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:。我正在设置用密码保护的私钥pem_password_cb打回来:

SSL_CTX_set_default_passwd_cb(ctx, passwd_func);
SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *)password);

。使用 v23 方法...我不知道这次握手失败的原因...

我尝试过这样的调试:openssl s_client -connect localhost:4443 -cert sberbank-cert.pem -key sberbank-private.pem -verify 1 -CAfile cacert.pem -prexit -msg我有以下结果:

milo@milonote:~/src/tests/ssl$ openssl s_client -connect localhost:4443 -cert sberbank-cert.pem -key sberbank-private.pem -verify 1 -CAfile cacert.pem -prexit  -msg
verify depth is 1
CONNECTED(00000003)
>>> TLS 1.0 Handshake [length 005a], ClientHello
    01 00 00 56 03 01 4d ed fc 5e a7 d7 56 6a 70 40
    0c a6 19 d0 06 23 08 28 65 07 53 46 d1 87 c0 c2
    a2 27 d8 5b ad ac 00 00 28 00 39 00 38 00 35 00
    16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
    15 00 12 00 09 00 14 00 11 00 08 00 06 00 03 00
    ff 02 01 00 00 04 00 23 00 00
5825:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 95 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

这是来源tcp_connect。我确信它不会失败,因为它返回 fd (不是-1):

int tcp_connect(const char *host, int port) {
    struct hostent *hp;
    struct sockaddr_in addr;
    int sock;

    if(!(hp=gethostbyname(host)))
        return -1;

    memset(&addr,0,sizeof(addr));
    addr.sin_addr=*(struct in_addr*)
    hp->h_addr_list[0];
    addr.sin_family=AF_INET;
    addr.sin_port=htons(port);

    if((sock=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP))<0)
       return -1;

    if(connect(sock,(struct sockaddr *)&addr, sizeof(addr))<0)
        return -1;

    return sock;
}

我已经解决了我的问题!不是客户端,而是服务器端!服务器在收到 SSL_WANT_READ 错误时关闭 tcp 连接,而不是重复 SSL_accept。感谢您的参与!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openssl 握手失败 的相关文章

随机推荐

  • 在 Python 桌面应用程序中安全分发 OAuth 2.0 client_secret

    我正在寻找一些有关如何设计和创建我自己的桌面应用程序 或已安装的应用程序 https developers google com identity protocols OAuth2 installed 在需要 OAuth 2 0 授权流到
  • 任务应用程序:compileDebugJavaWithJavac 失败

    当尝试在 Android 上运行我的 React Native 应用程序时 我收到此错误 失败 构建失败并出现异常 什么地方出了错 任务 react native firebase app compileDebugJavaWithJavac
  • Spring Kafka 错误处理 - v1.1.x

    如何处理错误处理春天卡夫卡 questions tagged spring kafka版本1 1 x 据我所知 它是在版本中引入的2 0 https github com spring projects spring kafka blob
  • Event.observe 'change' 事件在 IE 中没有被触发

    我用于更改选择菜单的原型事件侦听器未在 IE 中触发 Event observe use billing change Checkout getBillingData 这在 Firefox 中工作得很好 当然 但在 IE 中没有任何反应 当
  • 在抓取图像 src 上获取 base64 字符串

    我正在从网站上抓取图像 src 标题 价格等 但它给出了 base64 字符串来代替图像 src 当我将所有这些抓取的数据附加到 uri 时 它显示错误长 uri 如何减缓这个问题 如果您获得一个 base64 字符串作为 img src
  • 模板未在backbone.js中加载(TypeError:文本未定义)

    我在学主干 js http backbonejs org 我还处于起步阶段 我想通过添加模板下划线 http underscorejs org template模板方法 但它对我不起作用 我搜索了这个错误 但无法自行修复 如果没有显示模板
  • 除了请求许可之外,如何在不干扰当前前台进程的情况下获取 MediaProjectionManager?

    问题 我有一个屏幕截图应用程序 它使用浮动覆盖服务进行控件 并使用屏幕投射 API 媒体项目管理器来访问屏幕 有时 当设备内存不足时 Android 会重新启动服务 我就会丢失媒体投影 据我所知 重新获取新媒体投影的唯一方法是重新打开请求权
  • 添加了 ValidationContext 项的 MVC 和 EF 验证

    我有一个场景 我想将一个项目添加到 ValidationContext 并在 EF 触发的实体验证中检查它 我在向导中执行此操作 因此我只能在特定步骤上验证某些内容 如果有好的模式 请分享 问题在于 在控制器操作被击中之前 验证实际上被触发
  • Flutter Bloc 状态更改未使用 get_it 更新 UI

    我一直在结合使用本登录教程和 resocoder clean 架构教程来构建登录 身份验证功能 99 工作正常 但无法正确响应LoginButton被压 由于某种原因 当LoginBloc calls AuthenticationBloc
  • 如何检索 cl.exe 的路径?

    我想检索编译器的完整路径cl exe在 Visual Studio 中从程序中调用它 我们在注册表中是否有相应的密钥 怎么做 cl exe通常位于 VCINSTALLDIR bin VCINSTALLDIR默认情况下未设置环境变量 但在打开
  • 如何通过单击按钮更改文本颜色?

    我有如下文字 p strong em QUESTION WHAT IS YOUR NAME em strong p
  • 如何使用 bind_result 与 get_result 的示例

    我想看一个如何使用调用的示例bind result vs get result以及使用其中一种而不是另一种的目的是什么 还有使用每种方法的优点和缺点 使用这两种方法有什么限制 有什么区别吗 虽然这两种方法都适用 查询 当bind resul
  • 在单个查询中保存多行

    有没有办法让 cake 在单个查询中执行多行插入 而无需编写原始 SQL 来执行此操作 saveMany 和 saveAssociated 选项只会在单个事务中保存多行 但该事务包含多个插入语句 因此这些方法显然不是编写重型应用程序的解决方
  • Dozer 映射类级别是可访问的

    我正在使用推土机框架来克隆我的对象 我希望推土机框架在不使用 getter 和 setter 的情况下克隆数据 为此我在类级别设置 is accessible 属性 但这似乎不起作用 当我在字段级别设置 is accessible 时 它
  • 使用 Windows mklink 链接 2 个文件

    我试图在 Windows 上找到 nix 符号链接的等效项 并开始使用 mklink 问题是 作为普通用户 不是管理员 我可以使用 J 选项链接到文件夹 但无法链接到文件 我设法以管理员身份执行此操作 但我需要以标准用户身份执行此操作 为什
  • 为什么使用 Scala-IDE 的 Scala 工作表会给出此错误?

    在 Scala 工作表中我可以这样做 object Play println Playing a bit gt Playing a bit case class X a Int 1 x List X 但我不能这样做 object Play
  • JWT 实际上如何与 Spring MVC 一起创建令牌并验证令牌?

    我实际上希望获得更多 更清晰的理解JWT概念及其运作方式Spring MVC 我找到了链接https github com nielsutrecht jwt angular spring https github com nielsutre
  • REACT 应用程序调用安全的 Azure WEBAPI 服务 - 无用户

    我创建了一个简单的 REACT 应用程序 该应用程序仅在连接到我们网络上大屏幕的本地 PC 上运行 仅供内部使用 它就像广告牌或仪表板 零用户交互 屏幕不是触摸屏 也没有连接键盘和鼠标 因此没有用户可以登录 构建 REACT 应用程序 然后
  • Codeigniter flash 数据在某些浏览器中不起作用

    我在使用 Codeigniter flashdata 时遇到一些问题 在 Firefox 中似乎一切正常 但在 Chrome 以及我的移动 BB 浏览器 FWIW 中 页面之间似乎没有持久保存 flashdata 我还应该注意到 当我在本地
  • openssl 握手失败

    我正在尝试编写简单的 C openssl 客户端和服务器 这是客户的代码 int main int err SSL CTX ctx init ctx client cert pem client private pem certs cace