8151


`SSL_write()` が一度成功し、その後に `SSL_read()` でデータの受信もできましたが、そのあとに`SSL_write()` を行うと
`SSL_ERROR_WANT_X509_LOOKUP` が発生しました。  
これの対処方法をご存じの方がいましたらよろしくお願いします。


CC BY-SA 3.0
2015-03-19T08:13:34.063
8117
2015-03-19T17:05:10.017
2015-03-19T08:44:50.767
7926
3496
question
openssl
OpenSSLのクライアントでSSL_ERROR_WANT_X509_LOOKUPが発生


コードを見ていないため、不明点（`SSL_write()`と`SSL_read()`が成功してデータが受信できているというあたり）もありますが、参考までに、`SSL_ERROR_WANT_X509_LOOKUP`
エラーに関する回答です。

`SSL_ERROR_WANT_X509_LOOKUP` は、OpenSSL
のマニュアルにも記載されている通り、`SSL_CTX_set_client_cert_cb()`
で設定したコールバック関数が負の値を返してハンドシェイクを中断したために発生するエラーです。

<https://www.openssl.org/docs/ssl/SSL_get_error.html>

> **SSL_ERROR_WANT_X509_LOOKUP**
>
> The operation did not complete because an application callback set by
> SSL_CTX_set_client_cert_cb() has asked to be called again. The TLS/SSL I/O
> function should be called again later. Details depend on the application.

`SSL_CTX_set_client_cert_cb()` は、クライアント証明書の設定を
`SSL_CTX_use_certificate_file()` と `SSL_CTX_use_PrivateKey_file()`
によって事前に設定するのではなく、ハンドシェイク時にコールバックで設定するものですが、これらの違いを理解して利用されていますか？

<https://www.openssl.org/docs/ssl/SSL_CTX_set_client_cert_cb.html>

> **DESCRIPTION**
>
> SSL_CTX_set_client_cert_cb() sets the client_cert_cb() callback, that is
> called when a client certificate is requested by a server and no certificate
> was yet set for the SSL object.
>
> When client_cert_cb() is NULL, no callback function is used.
>
> SSL_CTX_get_client_cert_cb() returns a pointer to the currently set callback
> function.
>
> client_cert_cb() is the application defined callback. If it wants to set a
> certificate, a certificate/private key combination must be set using the
> x509 and pkey arguments and "1" must be returned. The certificate will be
> installed into ssl, see the NOTES and BUGS sections. If no certificate
> should be set, "0" has to be returned and no certificate will be sent. A
> negative return value will suspend the handshake and the handshake function
> will return immediately. SSL_get_error will return
> SSL_ERROR_WANT_X509_LOOKUP to indicate, that the handshake was suspended.
> The next call to the handshake function will again lead to the call of
> client_cert_cb(). It is the job of the client_cert_cb() to store information
> about the state of the last call, if required to continue.


CC BY-SA 3.0
2015-03-19T17:05:10.017
8151
2015-03-19T17:05:10.017
1024
8117
answer