2015-01-20 30 views
8

SSL_shutdown üzerindeki openssl belgeleri şu anlama gelir: İki yönlü kapatma henüz tamamlanmadıysa, SSL_shutdown() işlevinin dönüş değerini kontrol etmek ve SSL_shutdown() işlevini yeniden çağırmak önerilir. arama 0'dır.SSL_shutdown'ı doğru bir şekilde kullanma

https://www.openssl.org/docs/ssl/SSL_shutdown.html

ben kullanıyorum ben SSL_shutdown dönüş değeri 0 için kontrol edin ve tekrar diyoruz yerin hemen altında bir kod parçacığını var. Benim sorum şu ki, ikinci çağrıdaki SSL_shutdown değerinin geri dönüş değerini göz ardı etmemek ya da 1 (iki yönlü kapatma tamamlandı) geri gelene kadar SSL_shutdown'u yeniden denememiz gerekir.

int r = SSL_shutdown(ssl); 
//error handling here if r < 0 
if(!r) 
{ 

    shutdown(fd,1); 
    SSL_shutdown(ssl); //how should I handle return value and error handling here is it required?? 
} 
SSL_free(ssl); 
SSLMap.erase(fd); 
shutdown(fd,2); 
close(fd); 

cevap

11

openssl koyu tekniğin bir parçasıdır.

Öncelikle, başvuruda bulunduğunuz sayfanın dönüş değerlerini hatalı bir şekilde HTML'ye sahip olması gerekir. İşte insan sayfa aslında söylüyor:

RETURN VALUES 

    The following return values can occur: 

    0 The shutdown is not yet finished. Call SSL_shutdown() for a second 
     time, if a bidirectional shutdown shall be performed. The output 
     of SSL_get_error(3) may be misleading, as an erroneous 
     SSL_ERROR_SYSCALL may be flagged even though no error occurred. 

    1 The shutdown was successfully completed. The "close notify" alert 
     was sent and the peer's "close notify" alert was received. 

    -1 The shutdown was not successful because a fatal error occurred 
     either at the protocol level or a connection failure occurred. It 
     can also occur if action is need to continue the operation for non- 
     blocking BIOs. Call SSL_get_error(3) with the return value ret to 
     find out the reason. 

BIOS engelleme varsa, işler nispeten basittir. İlk aramada 0, çift yönlü bir kapatma yapmak isterseniz SSL_shutdown numaralı telefonu tekrar aramanız gerektiği anlamına gelir. 1, bittiğin anlamına gelir. A -1 bir hata demektir. İkinci çağrıda (sadece 0'ınız varsa), çift yönlü bir kapatma başlatılır. Mantık, tekrar 0 alamadığınızı belirtir (çünkü engelleme BIO'dur ve ilk adımı tamamlamış olur). A -1 bir hatayı gösterir ve 1'i tamamlandığını gösterir.

olmayan engelleme Bios varsa, aynı geçerlidir, tüm SSL_ERROR_WANT_READ ve SSL_ERROR_WANT_WRITE tekerleme geçmesi gerekir aslında, yani .:

If the underlying BIO is non-blocking, SSL_shutdown() will also return 
    when the underlying BIO could not satisfy the needs of SSL_shutdown() 
    to continue the handshake. In this case a call to SSL_get_error() with 
    the return value of SSL_shutdown() will yield SSL_ERROR_WANT_READ or 
    SSL_ERROR_WANT_WRITE. The calling process then must repeat the call 
    after taking appropriate action to satisfy the needs of SSL_shutdown(). 
    The action depends on the underlying BIO. When using a non-blocking 
    socket, nothing is to be done, but select() can be used to check for 
    the required condition. When using a buffering BIO, like a BIO pair, 
    data must be written into or retrieved out of the BIO before being able 
    to continue. 

Yani tekrarlama iki düzeyine sahip için kaydedin. SSL_shutdown'u 'ilk' zaman olarak adlandırın, ancak select() döngüsünü normal şekilde dolaştıktan sonra SSL_ERROR_WANT_READ veya SSL_ERROR_WANT_WRITE döngüsünü alırsanız yineleyin ve SSL_ERROR_WANT_ olmayan bir hata kodu alırsanız, yalnızca 'ilk' SSL_shutdown değerini tamamlayın. başarısız oldu) veya bir 0 veya 1 dönüşüne sahip olursunuz. Bir 1 getiri alırsanız, bitirdiniz. Bir 0 dönüşü alırsanız ve çift yönlü bir kapatma işlemi yapmak isterseniz, ikinci aramayı yapmanız gerekir, bunun için tekrar SSL_ERROR_WANT_READ veya SSL_ERROR_WANT_WRITE için kontrol etmeniz ve yeniden deneme seçimini yapmanız gerekir; Bu 1 dönmemelidir, ancak 0 veya bir hata döndürebilir.

Kolay değil.

+0

Teşekkürler! çok takdir yardım. – cmidi

İlgili konular