- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 dtls 的演示代码,它可以很好地与 ipv4 配合使用。但是在我为 ipv6 修改它之后,它在握手阶段失败了。服务器代码如下:
SSL_load_error_strings();
SSL_library_init();
SSL_CTX *ctx = SSL_CTX_new(DTLSv1_server_method());
if(SSL_CTX_use_certificate_chain_file(ctx, "path/to/crt") !=1)
ERR_print_errors_fp(stderr);
if(SSL_CTX_use_PrivateKey_file(ctx, "path/to/key", SSL_FILETYPE_PEM) != 1)
ERR_print_errors_fp(stderr);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_cert);
SSL_CTX_set_read_ahead(ctx, 1);
SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie);
SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie);
SSL_CTX_set_cipher_list(ctx, "ALL:NULL:eNULL:aNULL");
int fd = socket(AF_INET6, SOCK_DGRAM, 0);
struct sockaddr_in6 server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin6_family = AF_INET6;
server_addr.sin6_port = htons(MYPORT);
server_addr.sin6_addr = in6addr_any;
int flag = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) < 0)
perror("server reuse addr");
#ifdef SO_REUSEPORT
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag)) < 0)
perror("server reuse port");
#endif
if(bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)))
perror("bind server fd");
BIO *bio = BIO_new_dgram(fd, BIO_NOCLOSE);
SSL *ssl = SSL_new(ctx);
SSL_set_bio(ssl, bio, bio);
/* Enable cookie exchange */
SSL_set_options(ssl, SSL_OP_COOKIE_EXCHANGE);
fprintf(stderr, "Wait for incoming connections\n");
struct sockaddr_in6 client_addr;
while(1){
int ret = DTLSv1_listen(ssl, &client_addr);
if(ret < 0){
ERR_print_errors_fp(stderr);
}
if(ret > 0)
break;
}
fprintf(stderr, "Handle client connection\n");
int client_fd = socket(client_addr.sin6_family, SOCK_DGRAM, 0);
if (setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) < 0)
perror("reuse addr");
#ifdef SO_REUSEPORT
if (setsockopt(client_fd, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag)) < 0)
perror("reuse port");
#endif
if(bind(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)))
perror("bind client fd");
if(connect(client_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)))
perror("connect client");
BIO *cbio = SSL_get_rbio(ssl);
BIO_set_fd(cbio, client_fd, BIO_NOCLOSE);
BIO_ctrl(cbio, BIO_CTRL_DGRAM_SET_CONNECTED, 0, &client_addr);
fprintf(stderr, "waiting SSL_accept\n");
if(SSL_accept(ssl)!=1){
ERR_print_errors_fp(stderr);
}
fprintf(stderr, "SSL_accept completed\n");
客户端代码为:
SSL_load_error_strings();
SSL_library_init();
SSL_CTX *ctx = SSL_CTX_new(DTLSv1_client_method());
SSL_CTX_set_read_ahead(ctx, 1);
union {
struct sockaddr_storage ss;
struct sockaddr_in6 s6;
struct sockaddr_in s4;
} server_addr;
int fd;
memset(&server_addr, 0, sizeof(server_addr));
if(inet_pton(AF_INET, argv[1], &server_addr.s4.sin_addr) == 1){
fd = socket(AF_INET, SOCK_DGRAM, 0);
server_addr.s4.sin_family = AF_INET;
server_addr.s4.sin_port = htons(MYPORT);
}else if(inet_pton(AF_INET6, argv[1], &server_addr.s6.sin6_addr) ==1){
fd = socket(AF_INET6, SOCK_DGRAM, 0);
server_addr.s6.sin6_family = AF_INET6;
server_addr.s6.sin6_port = htons(MYPORT);
}else{
fprintf(stderr, "Wrong ip format\n");
return 1;
}
if(connect(fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))
perror("connect");
BIO *bio = BIO_new_dgram(fd, BIO_NOCLOSE);
BIO_ctrl(bio, BIO_CTRL_DGRAM_SET_CONNECTED, 0, &server_addr);
SSL *ssl = SSL_new(ctx);
SSL_set_bio(ssl, bio, bio);
fprintf(stderr, "waiting SSL_connect\n");
if(SSL_connect(ssl)!=1)
ERR_print_errors_fp(stderr);
fprintf(stderr, "SSL connected\n");
SSL_accept 和 SSL_connect 似乎没有返回。我通过将 sockaddr_in 更改为 sockaddr_in6 来修改代码。openssl版本为:linux上为1.0.2h
有人能告诉我代码有什么问题吗?
最佳答案
我加
BIO_ctrl_set_connected(bio, 0, &client_addr);
服务器端DTLSv1_listen
解决了这个问题。
关于c - DTLS 握手在 ipv6 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38766206/
在现有的 DTLS 连接上,即 DTLS 握手已在端口 5000 上成功完成,如果服务器收到传入的 DTLS 连接,即 DTLS 客户端问候数据包,则 SSL_read 正在生成 SSL_ERROR_
我有两个 SIP 端点,想通过 DTLS-SRTP 发送媒体。我在以下几点有点困惑 通过 DTLS 连接发送的 DTLS-SRTP 和 SRTP 数据包是相同的还是不同的? 如果不同,你能解释一下它们
我有一个使用 DTLS 与客户端通信的集群 哪些具有某种安全的分布式存储(...) 正如我们所知,DTLS 状态是相当长寿的。因此,在典型的负载均衡场景中,加密数据包将被转发到无法解密的服务器 我指的
我一直在阅读规范,rfc4346 和 rfc4347,但是我没有看到任何关于 DTLS 记录最小大小的提及,即在本例中为 UDP 负载大小。 从 DTLS/TLS 的角度来看,是否有任何决定大小的要求
我正在尝试在我当前基于 Netty 的服务器中添加 DTLS 支持。Netty 让我有可能将处理程序添加到管道中,在管道中数据包按定义的顺序处理,并在需要更改时更改。 BouncyCaSTLe 对 T
我使用 openssl 实现了一个 DTLS 服务器。 (我有一个 udp 套接字,我正在使用内存 bio 与 openssl 通信。)但是,如果丢包,DTLS 握手可能需要 1-2 秒,这在我的情况
SNMP over DTLS 和 SNMPv3 USM 模型的主要区别是什么,更喜欢哪一个。 TLS 和 DTLS 使用传输安全模型 (TSM) 安全模型,该模型在 RFC5591 中定义,该模型是作
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
对于 DTLS 连接设置,我需要帮助以获取以下条件的回调。 1).当客户端发送 ClientHello 消息并在应用程序配置一段时间后,如果 ServerHello 没有出现,则应收到超时。 2).如
对于这么大的代码块,我感到很抱歉,但我对发生的事情感到非常困惑,我不知道问题可能出在哪里...... 我正在尝试让一个非常小的 dtls 服务器运行,但我无法让客户端和服务器完成握手。 这是我的代码:
如何使用 twisted 和 m2crypto(或 pyopenssl)实现 dtls 协议(protocol)? 最佳答案 pyOpenSSL 和 M2Crypto 都没有公开 OpenSSL 的
我正在尝试在 Windows 下使用 Schannel 创建 DTLS“连接”(我正在最近的 Windows 10 版本下进行测试,因此 Schannel 支持的所有 DTLS 版本都应该可用) 我尝
我有 CoAP (libcoap) 的实现和 DTLS (tinyDTLS) 的实现。 如何将 CoAP (libcoap) 与 DTLS (tinyDTLS) 集成? 我将不胜感激任何建议。 最佳答
我正在尝试使用 Edge 的 ORTC 以便与其他网络浏览器进行实时通信。我已经使用点对点连接成功地完成了这项工作,但在中间添加网关后我遇到了问题。 当我使用 Edge(控制)开始调用时,由于某种原因
我有一个 dtls 的演示代码,它可以很好地与 ipv4 配合使用。但是在我为 ipv6 修改它之后,它在握手阶段失败了。服务器代码如下: SSL_load_error_strings(); SSL_
我正在开发一个应用程序,其中 key 服务器 (K) 生成对称 key 并将其与服务器 (A) 和客户端 (B) 共享。 A 和 B 通过 UDP 连接。我正在使用内存 BIO,并尝试使用密码“PSK
在 .NET 中是否有原生方式为 UDP 套接字提供 DTLS 支持? 按 native 编辑 我的意思是那些开箱即用的 .NET 框架。 最佳答案 我们的 SecureBlackbox 产品提供 c
我对我的期末项目感到进退两难。 想法是比较 QoS 参数(抖动、吞吐量、延迟、数据包丢失)并比较安全方面(防止第 3 方捕获语音数据、防火墙测试)在 (a.) Asterisk with TLS 和
为什么使用 DTLS在 SCTP什么时候已经有 TLS over SCTP 了? 这个想法有什么(好的)理由或优势吗? 最佳答案 TLS 假定明文消息按顺序传送。 DTLS 没有。 SCTP 支持消息
TLS 和 DTLS 在功能上有什么区别? 使用 TLS 与 DTLS 时,应用程序流程/协商有何不同? 最佳答案 基本上DTLS就是在数据报(UDP、DCCP等)上构建TLS DTLS 有意与 TL
我是一名优秀的程序员,十分优秀!