我如何创建一个Gnutls-Client发送它的证书到服务器

How do I create a Gnutls-Client which sends its certificate to the server?

本文关键字:证书 服务器 Gnutls-Client 何创建 创建 一个      更新时间:2023-10-16

我正在尝试在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],我可以获得发送证书的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