暗号化だけする時は前のモノでOKですが、証明書の正当性を検証する時はSSL_connectした後に次のようにします。
int ret;
int verify_success=TRUE;
X509 *cert=SSL_get_peer_certificate(ssl);
// SSL_get_verify_resultで証明書を検証
// 返り値(エラーメッセージ)の意味はopenssl/err.hを見てください(爆)
if((ret=SSL_get_verify_result(ssl))!=X509_V_OK)
{
fprintf(stderr,"Certification failed. (%d)\n",ret);
verify_success=FALSE;
};
// Common Name検証
// SubjectのCommonNameフィールドしか見てません。X509拡張による指定もあるようですけどよく分からないのでとりあえずパス
char buffer[256];
X509_NAME *xname=X509_get_subject_name(cert);
if(X509_NAME_get_text_by_NID(xname,NID_commonName,buffer,sizeof(buffer))==-1 || strcmp(buffer,ADDRESS))
{
fprintf(stderr,"Can't find valid CommonName.\n");
verify_success=FALSE;
};
if(!verify_success)
{
X509_free(cert);
SSL_shutdown(ssl);
SSL_free(ssl);
close(sock);
SSL_CTX_free(ctx);
ERR_free_strings();
return -1;
};
X509_free(cert);
ちなみに証明書の内容を表示する時は次のようにすればOK
SSL* sslとX509 *cert=SSL_get_peer_certificate(ssl)を使って
printf("Encryption Method: %s\n",SSL_get_cipher(ssl));
printf("Encryption Protocol: %s\n",SSL_get_cipher_version(ssl));
// BIOというのはよく分からないけどI/Oのカプセル化でX509_get_...の返り値を表示するためのものらしい??
BIO *bio=BIO_new_fp(stdout,BIO_NOCLOSE);
BIO_printf(bio,"Cert Information:\n");
X509_NAME_print_ex(bio,X509_get_subject_name(cert),0,XN_FLAG_RFC2253);
BIO_printf(bio,"\n");
X509_NAME_print_ex(bio,X509_get_issuer_name(cert),0,XN_FLAG_RFC2253);
BIO_printf(bio,"\n");
BIO_printf(bio,"from: ");
ASN1_TIME_print(bio,X509_get_notBefore(cert));
BIO_printf(bio,"\nto: ");
ASN1_TIME_print(bio,X509_get_notAfter(cert));
BIO_printf(bio,"\n");
BIO_free(bio);
2008-07-12 13:06:43[プログラミング]
この記事へのトラックバックURL: https://www.asmusic.jp/ASHARD/score/tb.cgi/yu-oishi/20080710_2
手動トラックバック