openssl访问https,怎么获取证书

aigylz 2013-05-22 08:07:24
比如访问QQ邮箱:https://mail.qq.com/
怎么获取它的证书,
浏览器有个复制证书,复制后是.cer的,openssl能用吗,谢谢给个关键代码..
...全文
18569 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢8楼,9楼
xiaoyu_code 2015-05-29
  • 打赏
  • 举报
回复
引用 11 楼 Ping_Fani07 的回复:
还要再补充一点,就是前面给的加载证书的示例代码,是从我的一个工程里面截出来的,出于一些目的,某些变量的命名有所改变,但是可能还有遗漏。比如在accept()函数调用后的第一个判断,
if (nClient == -1)
应该是
if (m_nConversion == -1)
如此种种,回复改起来相对麻烦,所以如果有更正,一并放在我的另一篇博文里:《OpenSSL编程初探2 --- 关于证书文件的加载》 另外也在博文里补充了更多的一些内容
windows证书库里面的证书,openssl又该如何获取呢?
Ping_Fani07 2014-06-30
  • 打赏
  • 举报
回复
还要再补充一点,就是前面给的加载证书的示例代码,是从我的一个工程里面截出来的,出于一些目的,某些变量的命名有所改变,但是可能还有遗漏。比如在accept()函数调用后的第一个判断,
if (nClient == -1)
应该是
if (m_nConversion == -1)
如此种种,回复改起来相对麻烦,所以如果有更正,一并放在我的另一篇博文里:《OpenSSL编程初探2 --- 关于证书文件的加载》 另外也在博文里补充了更多的一些内容
Ping_Fani07 2014-06-30
  • 打赏
  • 举报
回复
更详细的描述可以参考我的这篇博文:http://blog.csdn.net/howeverpf/article/details/9926557 相对来说,用图更准确,步骤描述更清晰
Ping_Fani07 2014-06-30
  • 打赏
  • 举报
回复
引用 8 楼 sinat_16606629 的回复:
这样保存的证书不能用,必须一个一个保存的证书才可以打开。

8楼说得对,确实是我的疏忽。certificates是证书链,确实直接拷贝certificates得到的文件是打不开的,应该到一个个具体的certificate条目去拷贝单个证书的十六进制流,如下图:
感谢8楼的指正~
sinat_16606629 2014-06-18
  • 打赏
  • 举报
回复
引用 3 楼 Ping_Fani07 的回复:
关于获取服务器证书 就我所知,获取服务器证书通用的方法通常有两个,一个就是你已经提到的在浏览器自带的证书复制/导出功能,缺点只适用于可用浏览器访问的网站,对于那些只用客户端(或者手机应用)访问的网站就无能为力,因为人家的客户端或应用往往都不提供证书复制或导出功能;即使是可用浏览器访问的网站,也只适用于直接使用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。如下图:
(4)查看所查找到的数据包的源IP地址,是否为第(2)步中所获取的192.168.1.57,若是,则成功定位所需数据包;否则使用 Ctrl+N 组合键查看下一个符合查找条件的数据包,直到找到所需数据包为止; (5)在上步定位好的数据包中找到证书所在,如下图【出于隐私考虑擦去了部分信息】:
(6)Wireshark 提供了比较方便地方法从数据包中拷贝出证书,在上图中标注的证书所在位置右键,依次选择"copy"-->"Bytes"-->"Hex Stream",获取16进制流形式的证书文件。如下图:
(7)找一款支持16进制流拷贝的工具,比如010Editor,新建一个文件,把上一步得到的十六进制流复制到本文件(一定注意不能使用简单的文本复制,010Editor中使用 Ctrl+Shift+V 组合键即可按十六进制流复制),文件另存为account.xxx.cn.cer。这就是你要的证书,可以直接双击打开。
这样保存的证书不能用,必须一个一个保存的证书才可以打开。
拉了啦啦啦啦 2014-05-27
  • 打赏
  • 举报
回复
看不懂,,还是初学者,,
a_mao 2013-08-23
  • 打赏
  • 举报
回复
Ping_Fani07 说的很详细,抓包, 找到certificate , 拷贝下来即可 wireshark 过滤 ip contains “certificate”
king_alan 2013-08-22
  • 打赏
  • 举报
回复
看不懂。。。。。
Ping_Fani07 2013-08-10
  • 打赏
  • 举报
回复 1
关于证书文件的加载
一般说来,当前主流网站都走的单项认证的路子,即只有服务器需向客户端发送证书,客户端不需向服务器发送证书。在这种情况下,加载证书是服务端需要做的事情。所以下面给个基于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文件而言,仅凭这个扩展名还无法断定文件编码类型.其实在你导出文件的时候,是有指定编码类型的,不知你是否还记得下图:

如果你当时按照默认一路点下去,那么就该使用SSL_FILETYPE_ASN1类型加载;反之,如果你选定了第二项,那么就该使用SSL_FILETYPE_PEM类型加载。如果你不记得当时怎么选的,那么就用记事本打开证书文件,若有乱码,则说明是二进制编码,该使用SSL_FILETYPE_ASN1类型加载;反之,若皆可识别,则说明经过了Base64编码,该使用SSL_FILETYPE_PEM类型加载。
通过抓包从数据包里获取的证书一般都属于二进制编码,使用SSL_FILETYPE_ASN1类型加载即可。
如果想要了解证书文件的扩展名与其编码类型的关系,请参考这个:《电子证书 DER vs. CRT vs. CER vs. PEM .》。
Ping_Fani07 2013-08-10
  • 打赏
  • 举报
回复 1
关于获取服务器证书
就我所知,获取服务器证书通用的方法通常有两个,一个就是你已经提到的在浏览器自带的证书复制/导出功能,缺点只适用于可用浏览器访问的网站,对于那些只用客户端(或者手机应用)访问的网站就无能为力,因为人家的客户端或应用往往都不提供证书复制或导出功能;即使是可用浏览器访问的网站,也只适用于直接使用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。如下图:

(4)查看所查找到的数据包的源IP地址,是否为第(2)步中所获取的192.168.1.57,若是,则成功定位所需数据包;否则使用 Ctrl+N 组合键查看下一个符合查找条件的数据包,直到找到所需数据包为止;
(5)在上步定位好的数据包中找到证书所在,如下图【出于隐私考虑擦去了部分信息】:

(6)Wireshark 提供了比较方便地方法从数据包中拷贝出证书,在上图中标注的证书所在位置右键,依次选择"copy"-->"Bytes"-->"Hex Stream",获取16进制流形式的证书文件。如下图:

(7)找一款支持16进制流拷贝的工具,比如010Editor,新建一个文件,把上一步得到的十六进制流复制到本文件(一定注意不能使用简单的文本复制,010Editor中使用 Ctrl+Shift+V 组合键即可按十六进制流复制),文件另存为account.xxx.cn.cer。这就是你要的证书,可以直接双击打开。
zhpxpower 2013-07-24
  • 打赏
  • 举报
回复
如果网站是https的,必须使用openssl建立安全通道,也就是必须要用证书。 .cer是证书的常用后缀,一般是asn.1编码的,openssl中有相关解析证书接口,链接:http://blog.csdn.net/wanjie518/article/details/6570141
aigylz 2013-05-23
  • 打赏
  • 举报
回复
要不换个方法,,,不使用证书openssl怎么建立连接..

4,453

社区成员

发帖
与我相关
我的任务
社区描述
云计算 云安全相关讨论
社区管理员
  • 云安全社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧