如何创建将证书发送到服务器的Gnutls-Client?

时间:2011-12-06 16:22:46

标签: c++ c ssl

我正在尝试用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程序,它可以工作,所以我认为它应该是上面代码中的内容。

我错了什么?

希望获得灵感,

斯巴达克斯

1 个答案:

答案 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