当前位置:编程学习 > 网站相关 >>

openssl访问https,怎么获取证书

比如访问QQ邮箱:https://mail.qq.com/
怎么获取它的证书,
浏览器有个复制证书,复制后是.cer的,openssl能用吗,谢谢给个关键代码..
openssl QQ邮箱 证书 https --------------------编程问答-------------------- 要不换个方法,,,不使用证书openssl怎么建立连接.. --------------------编程问答-------------------- 如果网站是https的,必须使用openssl建立安全通道,也就是必须要用证书。

.cer是证书的常用后缀,一般是asn.1编码的,openssl中有相关解析证书接口,链接:http://blog.csdn.net/wanjie518/article/details/6570141

--------------------编程问答-------------------- 关于获取服务器证书
       就我所知,获取服务器证书通用的方法通常有两个,一个就是你已经提到的在浏览器自带的证书复制/导出功能,缺点只适用于可用浏览器访问的网站,对于那些只用客户端(或者手机应用)访问的网站就无能为力,因为人家的客户端或应用往往都不提供证书复制或导出功能;即使是可用浏览器访问的网站,也只适用于直接使用https协议的网站(比如Gmail),不适用于临时从http跳转到https又跳回http的情况(比如12306)。
       因为不管怎么说,在SSL协议的握手阶段,服务器必然会向客户端/浏览器发送自己的证书,所以我要详细说的第二种获取证书的方法就是通过抓包从网络协议数据流中获取。以利用Wireshark 1.10(当然你若是有其他习惯的抓包工具也可以,只要支持SSL协议解析即可)获取account.xxx.cn的服务器证书例,方法如下:
(1)使用Wireshark 1.10把登录account.xxx.cn过程的HTTPS会话数据抓取下来(抓包的过程就不多说了,不会问度娘),为了后面定位数据包方便,抓包要尽量干净、完整;
(2)为了防止你还是不小心抓住了其他HTTPS会话的数据,你可以在Windows的命令提示符下用nslookup命令查询account.xxx.cn的IP地址,假如是192.168.1.57;
(3)使用 Ctrl+F 组合键打开查找对话框,By(查找类型)选择String,Search In(查找区域)选择Packet list,过滤条件写 Certificate ,设定完毕点 Find。如下图:
--------------------编程问答-------------------- 关于证书文件的加载
       一般说来,当前主流网站都走的单项认证的路子,即只有服务器需向客户端发送证书,客户端不需向服务器发送证书。在这种情况下,加载证书是服务端需要做的事情。所以下面给个基于openssl的SSL服务端例程,内含加载证书的代码(有特别标注):
	// 前面省略了服务端socket套接字的创建过程
// 接受客户端的socket连接
m_nConversion = accept(nListen, (sockaddr *)&addr_client, &size);
if (nClient == -1)
{
printf("accept failed!\n");
continue;
}

// 创建服务端SSL会话环境
m_pServerCtx = SSL_CTX_new(SSLv23_server_method());
if (m_pServerCtx == 0)
{
printf("SSL_CTX_new for Server failed!\n");
return -1;
}

/*-------------------------Begin of:服务端公私钥加载-------------------------*/
// 为服务端指定SSL连接所用公钥证书
//参数 m_pServerCtx,服务端SSL会话环境
//参数 pCertPath,你存放公钥证书的路径
//参数 SSL_FILETYPE_PEM,指定你所要加载的公钥证书的文件编码类型为 Base64
if (SSL_CTX_use_certificate_file(m_pServerCtx, pCertPath, SSL_FILETYPE_PEM) != 1)
{
printf("SSL_CTX_use_certificate_file failed!\n");
return -1;
}
// 为服务端指定SSL连接所用私钥
//参数 m_pServerCtx,服务端SSL会话环境
//参数 pKeyPath,你存放对应私钥文件的路径
//参数 SSL_FILETYPE_PEM,指定你所要加载的私钥文件的文件编码类型为 Base64
if (SSL_CTX_use_PrivateKey_file(m_pServerCtx, pKeyPath, SSL_FILETYPE_PEM) != 1)
{
printf("SSL_CTX_use_PrivateKey_file failed!\n");
return -1;
}
// 检查SSL连接 所用的私钥与证书是否匹配【所以你仅有公约证书是不够的】
if (!SSL_CTX_check_private_key(m_pServerCtx))
{
printf("Private key does not match the certificate public key\n");
return -1;
}
/*-------------------------End of:服务端公私钥加载-------------------------*/

// 创建一个与客户端通信的SSL套接字
m_pServerSSL = SSL_new(m_pServerCtx);
if (m_pServerSSL == 0)
{
printf("SSL_new for Server failed!\n");
return -1;
}
// 将与客户端通信的 SSL套接字&&socket套接字 进行可读写地绑定
SSL_set_fd(m_pServerSSL, m_nConversion);
// 接受客户端的SSL连接
if (SSL_accept(m_pServerSSL) == -1)  
{
printf("SSL_set_fd for Server failed!\n");
return -1;
}
//后面省略的是基于SSL_read()与SSL_write()的SSL通信过程

       需要特别补充的是加载公私钥文件API函数的第三个参数,文件编码类型。当前证书文件有两种编码类型,即:二进制编码【宏定义为SSL_FILETYPE_ASN1】与ASCII(Base64)【宏定义为SSL_FILETYPE_PEM】编码。对于公约证书的加载,它两种类型都支持,但函数本身并不能自动同时识别处理两种类型,必须由用户在调用的时候根据自己所用文件的类型自行指定;对于私钥文件的加载,则仅支持SSL_FILETYPE_PEM。
       第三个参数的取值务必和你要加载的公钥证书文件的编码类型相匹配。若是你第三个参数设为SSL_FILETYPE_PEM,实际加载的却是一个二进制编码的证书文件,加载就会出错。针对你要加载的cer文件而言,仅凭这个扩展名还无法断定文件编码类型.其实在你导出文件的时候,是有指定编码类型的,不知你是否还记得下图:
--------------------编程问答-------------------- 看不懂。。。。。 --------------------编程问答-------------------- Ping_Fani07 说的很详细,抓包, 找到certificate , 拷贝下来即可

wireshark 过滤
ip contains  “certificate” 
补充:云计算 ,  云安全
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,