Я пытаюсь написать код клиента и сервера, чтобы выполнить SSL-квитирование с использованием openSSL API.openSSL: отказ при сбое - сервер не может получить сертификат клиента
Клиентский код содержит:
// Part of client code:
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);
SSL_CTX_load_verify_locations(ctx,"ca.pem",NULL);
...
if (SSL_CTX_use_certificate_file(ctx, "cli.crt" , SSL_FILETYPE_PEM) <= 0) {
exit(1);
}
if (SSL_CTX_use_PrivateKey_file(ctx, "cli.key", SSL_FILETYPE_PEM) <= 0) {
exit(1);
}
...
sd = socket (AF_INET, SOCK_STREAM, 0);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr ("127.0.0.1");
sa.sin_port = htons (44444);
...
ssl = SSL_new (ctx);
SSL_set_fd (ssl, sd);
err = SSL_connect (ssl);
код сервера содержит:
// Part of server code:
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);
SSL_CTX_load_verify_locations(ctx,"ca.pem",NULL);
...
if (SSL_CTX_use_certificate_file(ctx, "serv.crt", SSL_FILETYPE_PEM) <= 0) {
exit(1);
}
if (SSL_CTX_use_PrivateKey_file(ctx, "serv.key", SSL_FILETYPE_PEM) <= 0) {
exit(1);
}
...
listen_sd = socket (AF_INET, SOCK_STREAM, 0);
memset (&sa_serv, '\0', sizeof(sa_serv));
sa_serv.sin_family = AF_INET;
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port = htons (44444);
err = bind(listen_sd, (struct sockaddr*) &sa_serv, sizeof (sa_serv));
err = listen (listen_sd, 5);
client_len = sizeof(sa_cli);
sd = accept (listen_sd, (struct sockaddr*) &sa_cli, &client_len);
close (listen_sd);
....
ssl = SSL_new (ctx);
SSL_set_fd (ssl, sd);
err = SSL_accept (ssl);
Я побежал код, используя адрес назначения в качестве контура обратно адрес (127.0.0.1), как можно видеть из кода показано выше. Клиентские и серверные программы, выполненные на одном компьютере, работали нормально.
Но когда я запускаю клиентские и серверные программы на разных машинах (VMWare VMs - Ubuntu Linux), код не работает.
Client VM IP:192.168.181.188
Server VM IP:192.168.181.180
Использование IP сервера VM (например, 192.168.181.180) в качестве адреса в коде клиента, я получаю следующее сообщение об ошибке на сервере:
140890B2: SSL3_GET_CLIENT_CERTIFICATE:no certificate returned: s3_srvr.c:2602:
Я создал свой собственный CA на моей машине Linux и поделился файлом открытого ключа ЦС с виртуальными машинами клиентов и серверов. Сертификаты клиента и сервера подписываются этим центром сертификации.
CA : CA123
Client CN: Client (signed by CA123)
Server CN: Server (signed by CA123)
Клиент может проверить сертификат сервера (я могу даже получить сертификат сервера и проверить CN действительно «Сервер»), но сервер не может получить сертификат клиента, поэтому рукопожатия не удается.
Может ли кто-нибудь предложить решение этой проблемы?
Большое спасибо.
Я проверил CN, это не IP. Я создал свой собственный ЦС на своей машине Linux и подписал мои сертификаты сервера и клиента с этим ЦС. Клиент CN является «Клиент», а Server CN - «Сервер». CA - «CA123». – Jake