2012-04-17 3 views
2

Я пытаюсь написать код клиента и сервера, чтобы выполнить 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 действительно «Сервер»), но сервер не может получить сертификат клиента, поэтому рукопожатия не удается.

Может ли кто-нибудь предложить решение этой проблемы?

Большое спасибо.

ответ

0

Проверка сертификата subject сертификата клиента. В некоторых случаях поле CN (общее имя) должно иметь IP-адрес или имя хоста клиентского узла.

В вашем случае сертификат клиента может иметь следующую тему:

Subject: C=xxx, ST=xxx, L=xxx, O=xxx, OU=xxx, CN=192.168.181.180 

Я не 100% уверен, что это исправление. Но прежде чем взломать стену, попробуйте.

+0

Я проверил CN, это не IP. Я создал свой собственный ЦС на своей машине Linux и подписал мои сертификаты сервера и клиента с этим ЦС. Клиент CN является «Клиент», а Server CN - «Сервер». CA - «CA123». – Jake

0

ОК ... Я не уверен, что следующее решение - это просто исправление, найденное для моего текущего проекта, но я до сих пор не удовлетворен своим ответом.

Итак, прочитав мой вопрос, вы заметите, что я упомянул, что CA был сделан на машине linux, а сертификаты для клиента и сервера были подписаны этим CA. Этот хост является другой VMWare VM, назовите его «VM3». Таким образом, сертификаты, сгенерированные с использованием «CA123» на «VM3» для клиента и сервера, не работали на клиентской VM (назовите его «VM1») и VM сервера (назовите его «VM2»). Из любопытства я попытался настроить ЦС на VM2 и подписать сертификаты клиентов и серверов и скопировать клиентский сертификат на виртуальную машину клиента. К моему удивлению, это работает, но я не знаю, почему. Я не могу ответить, какую зависимость я создал на VM3?

Не стесняйтесь публиковать более точный и полный ответ.

+0

Вы наконец поняли это?Я думаю, возможно, что командная строка для генерации CA и сертификатов имеет значение. Пожалуйста, опубликуйте его. – tedyyu

Смежные вопросы