2016-12-08 2 views
0

Я новичок. У меня проблема при использовании SSL. Я нахожу код c в Интернете. в коде сервера, имеют функцию последующей:SSL_get_peer_certificate (ssl) return NULL?

void ShowCerts(SSL* ssl) 
{ X509 *cert; 
    char *line; 

    cert = SSL_get_peer_certificate(ssl); /* Get certificates (if available) */ 
    if (cert != NULL) 
    { 
     printf("Server certificates:\n"); 
     line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); 
     printf("Subject: %s\n", line); 
     free(line); 
     line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); 
     printf("Issuer: %s\n", line); 
     free(line); 
     X509_free(cert); 
    } 
    else 
     printf("No certificates.\n"); 
} 

, когда я использую команду: OpenSSL REQ -x509 -nodes -days 365 -newkey RSA: 1024 -keyout mycert.pem отъезда mycert.pem и запустить ./sslserver .o 443, а затем я запустил ./client localhost 443. ошибка сервера: «Нет сертификатов». Я думаю, что причина SSL_get_peer_certificate (ssl) возвращает значение null, но я не знаю, как это исправить. Вы можете помочь? Полный код: http://simplestcodings.blogspot.com/2010/08/secure-server-client-using-openssl-in-c.html

+0

Повреждение (и похоже на тот же код) http://stackoverflow.com/questions/40708532/how-to-load-client-certificate-during-ssl-connection-for-mutual-authentication –

ответ

0

SSL_get_peer_certificates возвращает сертификат только на стороне сервера, если клиент отправил сертификат. Но код, на который вы ссылаетесь, не запрашивает сертификат клиента, что означает, что клиент не отправит его. Чтобы запросить сертификат клиента сервер нужно будет использовать SSL_CTX_set_verify и установить режим, по меньшей мере, SSL_VERIFY_PEER, то есть как минимум вам нужно сделать:

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 

Но это будет запрашивать только дополнительный сертификат клиента. Это не приведет к его проверке. Обратите внимание, что используемый вами пример кода нарушен в этом отношении, так как он не выполняет какой-либо проверки сертификата. Это означает, что он открыт для тривиального человека в средней атаке, т. Е. Не обеспечивает безопасность, которую вы ожидаете при использовании SSL. Поэтому я рекомендую не использовать этот код в качестве примера того, как писать безопасный SSL-клиент и сервер.

+0

Для каждого что вы сделали, возможно, вы можете предоставить некоторый код, чтобы показать ему, как это делается. В противном случае это будет комментарий. Это хороший комментарий. – jww

+0

@jww: Теперь я добавил пример о том, как запросить сертификат клиента. Добавление примеров для всех других вещей, нарушенных в исходном коде, я рассматриваю вне сферы действия этого вопроса. Вместо этого OP должен отказаться от этого примера кода, потому что он не работает с самого начала. –