我用openssl写了一个客户端,现在已经能和ssl服务器正常通讯了。但我的代码中没有加入任何证书验证的部分,
请问,我现在要验证服务器端证书,要加些什么代码?有简单例子最好:D

解决方案 »

  1.   

    摘自MSDNhttp://support.microsoft.com/kb/257587/zh-cn
    [code=BatchFile]证书来验证自身期间 SSL 握手, 服务器发送客户端。 客户端使用证书来验证身份证书声称来表示。 启用 SSL 的客户经历这些步骤以验证服务器身份: 1. 今天的日期是否在有效期内 ? 客户检查服务器证书的有效期。 不如果超出该范围, 当前日期和时间是身份验证过程不转任何进一步。 上如果当前日期和时间是证书的有效期内, 客户端转到步骤 2。  
    2. 是否信任 CA 颁发证书颁发机构 (CA) ? 每个启用 SSL 的客户维护信任 CA 证书的列表。 此列表确定客户端将接受哪些服务器证书。 如果可分辨名称 (DN) 颁发 CA 的信任 CA, 客户列表上 CA 的 DN 匹配对此问题的答案是 yes, 并且客户端上转到步骤 3。 身份如果颁发 CA 不位于列表, 服务器不验证除非客户可验证证书链 CA, 位于列表中结束。  
    3. 颁发 CA 的公钥验证颁发者的数字签名 ? 客户端使用公钥从 CA 证书 (它在它的第二步中信任 CA 列表找到它) 来验证服务器证书被呈现, 上 CA 的数字签名。 不如果服务器证书中信息由 CA, 签名后已更改或者 CA 证书公钥与私钥由 CA 用于注册服务器证书, 不对应客户端不验证服务器的身份。 如果 CA 的数字签名可验证, 客户端从该 CA 将服务器的证书视为是介绍有效 " 号 " 并继续。 此时, 客户已确定服务器证书是否有效。 它是客户责任之前花费步骤 5 进行第 4 步。  
    4. 服务器证书中对服务器本身域名称域名称不匹配 ? 此步骤确认服务器是实际位于同一网络地址由域名服务器证书中指定。 虽然步骤 4 是 SSL 协议, 技术不属于它针对一种称为 " Man - - - 中间中攻击 " 安全攻击提供只保护 客户必须执行此步骤并必须拒绝要验证服务器或建立连接如果域名不匹配。 上如果服务器证书, 中域名称服务器的实际域名称匹配客户端转到步骤 5。  
    5. 服务器身份验证。 以 SSL 客户端继续。 如果客户不能获得到步骤 5 出于任何原因, 由证书标识该服务器无法验证, 用户被警告的问题并通知, 加密和身份验证连接无法建立。 
    [/code]
    看第二步。
      

  2.   

    感谢!但我要的是openssl的代码怎么写
      

  3.   

    看看这个:
    http://book.csdn.net/bookfiles/399/10039914686.shtml
      

  4.   

    int SSL_Proxy_Service_Mgr::verify_callback(int ok, X509_STORE_CTX *store)
    {
        ......
    return ok;
    } ACE_SSL_Context *context = ACE_SSL_Context::instance();
    context->set_mode(ACE_SSL_Context::SSLv3_server); char path[MAX_PATH] = {0};
    ::GetModuleFileNameA(NULL,path,MAX_PATH);
    ::PathRemoveFileSpecA(path);
    ::PathAppendA(path,"signedcert.crt");
    if(context->certificate(path, SSL_FILETYPE_PEM) != 0)
    {
    ACE_DEBUG((LM_ERROR,ACE_TEXT("服务端证书载入错误!\r\n")));
    return 0;
    } ::PathRemoveFileSpecA(path);
    ::PathAppendA(path,"cert.key");
    if(context->private_key(path, SSL_FILETYPE_PEM) != 0)
    {
    ACE_DEBUG((LM_ERROR,ACE_TEXT("服务端私锁载入错误!\r\n")));
    return 0;
    } if(context->verify_private_key() != 0)
    {
    ACE_DEBUG((LM_ERROR,ACE_TEXT("证书和私锁不配对!\r\n")));
    return 0;
    } ::PathRemoveFileSpecA(path);
    ::PathAppendA(path,"CAfile.pem");
    if(context->load_trusted_ca(path,NULL) != 0)
    {
    ACE_DEBUG((LM_ERROR,ACE_TEXT("载入信任CA出错!\r\n")));
    return 0;
    } int count = context->have_trusted_ca();
    ACE_DEBUG((LM_ERROR,ACE_TEXT("信任CA个数%d!\r\n"),count));
    context->set_verify_peer(true,1,1); //SSL_CTX_set_verify(context->context(),context->default_verify_mode(),verify_callback);