>

OpenSSL 1.1.1을 사용하여 DTLS "연결"을 얻으려고합니다.

나는 끊임없이 SSL_ERROR_SYSCALL 를 받고있다   DTLSv1_listen() 를 실행하려고 할 때  소켓에.

모든 수신 데이터를 수신하기 위해 단일 AF_INET, DGRAM, UDP 소켓을 사용합니다. 나는 그것을가정한다고 가정하고 데이터 그램을받을 때마다 OpenSSL이 발신자를 결정하는 것을 처리하지만 실수라고 생각하기 시작한다.

내가 : (간결하게하기 위해 오류 처리가 생략 됨)

SSL_CTX *ctx = SSL_CTX_new(DTLS());
SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM);
SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie);
SSL_CTX_set_cookie_verify_cb(ctx, &verify_cookie);
int fd = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*) &on, (socklen_t) sizeof(on));
bind(fd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in))
SSL *ssl = SSL_new(ctx);
SSL_set_fd(ssl, fd);
SSL_set_accept_state(ssl);
while(DTLSv1_listen(ssl, (BIO_ADDR *) BIO_get_conn_address(SSL_get_rbio(ssl))) <= 0)
...

앞에서 언급했듯이, 마지막 줄은`SSL_ERROR_SYSCALL '입니다.

errno  나에게 0 를 제공 .

CTX 구성에서 일부 단계가 누락 된 것 같지만 확실하지 않습니다.

나는 몇 가지 예제와 하나 특히 내 눈을 사로 잡았습니다. 데이터 그램을 수신하고 connect() 를 수행 할 때마다new소켓을 생성하는 것 같습니다  해당 소켓에서 원격 주소로. UDP에 클라이언트 AFAIK마다 소켓이 필요하다고 생각하지 않기 때문에 조금 어리석은 것 같습니다.


  • 답변 # 1

    UDP 연결에 따라

    와이즈 비즈

    그러므로 성공한 중고

    In BSD sockets one can do a connect on a UDP socket, but this basically just sets the default destination address for send (instead giving explicitly to send_to).

    에서 성공할 수 있습니다  기능.

    일반적으로 많은 피어와의 DTLS 통신에 UDP 소켓을 사용할 수 있습니다. 이를 위해서는 "association keys/seqn-numbers"와 다른 피어 주소 간의 매핑이 필요합니다. 이것은 서버 쪽과 거의 동일하지만 불가능해서는 안됩니다. 그러나 많은 TLS 파생 구현은 이러한 UDP 특정 기능을 활성화하지 않으므로 별도의 소켓을 사용해야 할 수도 있습니다.

    어쨌든 하나의 함정이 남을 것이다 : SNI/server Name Indication)을 사용하여 동일한 피어에서 다른 DNS 이름을 사용하여 동일한 물리적 서버에 액세스하려는 경우 실패합니다.

    send

  • 이전 reactjs - 자바 스크립트에서 이메일 주소를 마스킹하려면 Regex가 필요합니다
  • 다음 Cloud Functions를 사용하여 Firestore 모음의 모든 문서에 쓰는 방법은 무엇입니까?