2017-02-08 6 views
2

私は、リモートサーバとのTLS接続を確立するためにopensslを使用しています。ここでopensslでエラー文字列を取得する方法は?

は、コードスニペットです:いくつかの未知の理由で

if ((ret = SSL_connect(c->ssl)) <= 0) { 
    ret = SSL_get_error(c->ssl, ret); 
    if((err = ERR_get_error())) { 
     SSL_load_error_strings(); 
     ERR_load_crypto_strings(); 
     CRERROR(LOGSSLUTILS, "SSL connect err code:[%lu](%s)\n", err, ERR_error_string(err, NULL)); 
     CRERROR(LOGSSLUTILS, "Error is %s \n",ERR_reason_error_string(err)); 
    } 
} 

、ssl_connectは失敗したと私はちょうどERR_error_stringを使用して理由を特定したい場合は、出力は以下のとおりです。

SSL connect err code:[336077172] (error:14082174:lib(20):func(130):reason(372)) 

Error: cmrSSLlInit:174 Error is (null) 

として、あなたが見ることができる、私はエラーコードを取得することができますが、読み取り可能なエラー文字列を取得することはできません。

どのように読み取り可能なエラー文字列を取得できますか?いくつかの未知の理由で

答えて

2

、ERR_error_stringを使用して理由を特定ssl_connectが失敗したと私はちょうど にしたい、出力は以下のとおりです。DH key too smallについては

SSL connect err code:[336077172] (error:14082174:lib(20):func(130):reason(372)) 
$ openssl errstr 0x14082174 
error:14082174:SSL routines:ssl3_check_cert_and_algorithm:dh key too small 

、チェックアウトSSL operation failed with code 1: dh key too small onスタックオーバーフロー。その短所は、OpenSSLの以前のバージョンでは512ビットDHグループが使用されていたことです。それは小さすぎるので、2048ビットのグループを使用する必要があります。


にはどうすれば読み込み可能なエラー文字列を取得できますか?

error:14082174:SSL routines:ssl3_check_cert_and_algorithm:dh key too smallのような文字列をログに記録するには、私はあなたがerr_print_errorsERR_print_errors_fpを呼び出すことができると信じて。この関数はエラースタック全体を出力します。 ERR_print_errors man pagesも参照してください。

3

サンプルコードでSSL_load_error_strings()ERR_load_crypto_strings()が遅すぎます。彼らはあなたのプログラムの始めに真っ先に呼び出さなければなりません。そうすれば、OpenSSLから読み込み可能なエラー文字列を得ることができます。 @jwwはDHグループが小さすぎるのは間違いありません。理想的には、サーバーをより大きなグループで再構成する必要があります。それが不可能な場合は、DHE以外の暗号スイートを使用して接続してください(つまり、代わりにECDHEを使用してください)

1

これは、opensslをコンパイルするときに「no-err」オプションが含まれているためです。したがって、Err_error_stringはNULLを返します

関連する問題