> Мне надо чтобы работало и в обратную сторону, чтобы и клиент
> убеждался, что он коннектиться к правильному серверу. Для этого клиенту я
> подсовываю CA, которым подписан сертификат сервера и с помощью этого CA
> я хочу проверить, что сертификат сервера подписан именно этим CA. В
> общем, задача установления безопасного соединения в обе стороны, поэтому проверить просто
> валидность сертификата сервера недостаточно.Что-то я вас не понимаю.
В моем разумение проверка факта, что представленный сертификат подписан доверенным CA и common name указанный в сертификате совпадает с хостом к которому мы конектимся и является признаком валидности сертификата.
т.е. примерно так:
int
check_ssl_certificate(SSL *conn, const char *host)
{
X509 *cert;
X509_NAME *xname;
char cname[256];
long vresult;
if (conn == NULL)
/* Нифига не SSL */
cert = SSL_get_peer_certificate(conn);
if (!cert)
/* Нет сертификата */
vresult = SSL_get_verify_result(conn);
if (vresult != X509_V_OK)
/* Громко ругаемся. */
xname = X509_get_subject_name(cert);
cname[0] = '\0';
X509_NAME_get_text_by_NID(xname, NID_commonName,
cname, sizeof(cname));
if (!cname_match(cname, host))
/* Нас пытались обмануть */
/* Еще надо проверить ASN1 */
/* Позвать *_free() */
/* Все хорошо. */
return (0);
}