我正在尝试用C ++编写Gnutls客户端代码。 不幸的是,没有太多的文档或示例。 我设置了一个这样的会话:
gnutls_certificate_allocate_credentials (&x509_cred);
gnutls_certificate_set_x509_key_file (x509_cred, certfile.c_str(), keyfile.c_str(),GNUTLS_X509_FMT_PEM);
gnutls_certificate_set_verify_function (x509_cred, _verify_certificate_callback);
gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, x509_cred);
但我的服务器没有收到证书。 如果我使用gnutls-cli程序,它可以工作,所以我认为它应该是上面代码中的内容。
我错了什么?
希望获得灵感,
斯巴达克斯
答案 0 :(得分:2)
根据我上面引用的讨论提示[1]我可以让GnuTLS客户端发送证书:
服务器必须要求提供证书,否则客户端将不会发送任何内容。
gnutls_certificate_server_set_request (mSession, GNUTLS_CERT_REQUEST);
客户端仅自动发送与服务器信任的CA匹配的证书。
如果要覆盖它,则必须在客户端的证书请求上安装回调:
gnutls_certificate_client_set_retrieve_function (credentials, cert_callback);
在回调中,您可以选择要发送的证书/密钥:
static int cert_callback (gnutls_session_t session,
const gnutls_datum_t * req_ca_rdn,
int nreqs,
const gnutls_pk_algorithm_t * sign_algos, int sign_algos_length,
gnutls_retr_st * st) {
// Check CA's requested by server
// Check Algorithms accepted by server
// Putting in our key / cert, even if not trusted by the sever
st->cert.x509 = &myCert;
st->ncerts = 1;
st->key.x509 = myKey;
st->deinit_all = 0;
return 0; // no error
}
有关cert_callback的完整来源,请查看gnutls-cli的cli.c。
来源: [1] http://comments.gmane.org/gmane.network.gnutls.general/145