这个故事的背景是我正在使用gSOAP和openssl进行一些SOAP / WSDL应用程序开发 . 最终的应用程序必须针对嵌入式ARM设备进行交叉编译 .
在我的构建系统(Fedora 17 x64)上一切正常,但是当我在目标设备(ARM / Montavista 5)上运行交叉编译版本时,我收到以下错误:
错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
我开始关注OpenSSL,看看我是否可以缩小它 - 我的构建系统与我的嵌入式系统之间肯定存在不同的行为导致验证失败 .
我在两者上都运行了以下命令(IP地址是google.com):
openssl s_client -showcerts -connect 173.194.67.104:443 -verify 9
下面列出了不同机器上的输出 . 我在两种情况下都运行openssl 1.0.1c . 特别是目标(ARM)系统似乎接收/解释不同的证书链 .
我不知道为什么输出不同 . 有人可以解释我是如何能够让我的目标设备以与构建机器相同的方式正确验证证书吗?
从构建输出(Fedora)机器:
验证深度为9
连(00000003)
depth = 2 C = US,O =“VeriSign,Inc . ”,OU = Class 3 Public Primary Certification Authority
验证回报:1
深度= 1 C = ZA,O = Thawte Consulting(Pty)Ltd . ,CN = Thawte SGC CA.
验证回报:1
depth = 0 C = US,ST = California,L = Mountain View,O = Google Inc,CN = www.google.com
验证回报:1
证书链
0 s:/ C = US / ST =加州/ L =山景/ O = Google Inc / CN = www.google.com
i:/ C = ZA / O = Thawte Consulting(Pty)Ltd./CN=Thawte SGC CA.
-----开始证书-----
[去除了BREVITY]
-----结束证书-----
1 s:/ C = ZA / O = Thawte Consulting(Pty)Ltd./CN=Thawte SGC CA
i:/ C = US / O = VeriSign,Inc . / OU = Class 3公共主要证书颁发机构
-----开始证书-----
[去除了BREVITY]
-----结束证书-----
服务器证书
subject = / C = US / ST = California / L = Mountain View / O = Google Inc / CN = www.google.com
发行人= / C = ZA / O = Thawte Consulting(Pty)Ltd./CN=Thawte SGC CA
没有发送客户端证书CA名称
SSL握手读取1907个字节,写入299个字节
新的,TLSv1 / SSLv3,密码是RC4-SHA
服务器公钥是1024位
支持安全重新协商
压缩:无
扩展:无
SSL会话:
协议:TLSv1
密码:RC4-SHA
Session 编号:C05953342AC01E9AB63CF0BABBE942B4E29061AA4904C3F1393EBBB1548B0254
会话ID-CTX:
主密钥:38B97C0CC2795AD1D3EEACAE244E33F1E5A0988AE9182AC85DFFF5B6BFAE6585E6BCF763E1E0EB300CD38B87CC0F2501
Key-Arg:无
Krb5校长:无
PSK身份:无
PSK身份提示:无
TLS会话票证生命周期提示:100800(秒)
TLS会话票:
[去除了BREVITY]
开始时间:1347036912
超时:300(秒)
验证返回码:0(ok)
从目标(ARM)机器输出
验证深度为9
连(00000003)
深度= 1 C = ZA,O = Thawte Consulting(Pty)Ltd . ,CN = Thawte SGC CA.
验证错误:num = 20:无法获得本地颁发者证书
验证回报:1
深度= 1 C = ZA,O = Thawte Consulting(Pty)Ltd . ,CN = Thawte SGC CA.
验证错误:num = 27:证书不受信任
验证回报:1
depth = 0 C = US,ST = California,L = Mountain View,O = Google Inc,CN = www.google.com
验证回报:1
证书链
0 s:/ C = US / ST =加州/ L =山景/ O = Google Inc / CN = www.google.com
i:/ C = ZA / O = Thawte Consulting(Pty)Ltd./CN=Thawte SGC CA.
-----开始证书-----
[去除了BREVITY]
-----结束证书-----
1 s:/ C = ZA / O = Thawte Consulting(Pty)Ltd./CN=Thawte SGC CA
i:/ C = US / O = VeriSign,Inc . / OU = Class 3公共主要证书颁发机构
-----开始证书-----
[去除了BREVITY]
-----结束证书-----
服务器证书
subject = / C = US / ST = California / L = Mountain View / O = Google Inc / CN = www.google.com
发行人= / C = ZA / O = Thawte Consulting(Pty)Ltd./CN=Thawte SGC CA
没有发送客户端证书CA名称
SSL握手已读取2130个字节并写入443个字节
新的,TLSv1 / SSLv3,密码是ECDHE-RSA-RC4-SHA
服务器公钥是1024位
支持安全重新协商
压缩:无
扩展:无
SSL会话:
协议:TLSv1.2
密码:ECDHE-RSA-RC4-SHA
Session 编号:AA9E7D7AD223F18241A210D224B8BEF4A441572C1A9719BF3504FB03297D85DE
会话ID-CTX:
主密钥:7A15F2071D50C076C0524AAD45857C5683212370582AD7D9F882B64104F0A0A8C2948B8B85C1EC19015C
51CAC30D4A05
Key-Arg:无
PSK身份:无
PSK身份提示:无
SRP用户名:无
TLS会话票证生命周期提示:100800(秒)
TLS会话票:
[去除了BREVITY]
开始时间:1347036508
超时:300(秒)
验证返回码:27(证书不可信)
1 回答
错误消息非常清楚:
openssl
无法使用ARM框上的CA存储验证是否信任签署服务器证书的CA.要验证您是否可以从
curl
的站点下载受信任的CA捆绑包:http://curl.haxx.se/ca/cacert.pem然后使用-CAfile
参数来使用它:openssl s_client -showcerts -connect 173.194.67.104:443 -verify 9 -CAfile <full_path_to_cacert.pem>
要以编程方式执行此操作,请参阅SSL_CTX_load_verify_locations函数 .
另请参阅
openssl
命令行工具的源代码以获取更多详细信息:http://cvs.openssl.org/fileview?f=openssl/apps/s_client.c&v=1.169(搜索CAfile和SSL_CTX_load_verify_locations) .