0

这个故事的背景是我将 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
depth=1 C = ZA, O = Thawte Consulting (Pty) Ltd., CN = Thawte SGC CA
验证返回:1
depth=0 C = 美国,ST = 加利福尼亚,L = 山景城,O = Google Inc,CN = www.google.com
验证返回:1
---
证书链
 0 秒:/C=US/ST=加利福尼亚/L=山景/O=Google Inc/CN=www.google.com
   i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
-----开始证书-----
[为简洁起见删除]
-----结束证书-----
 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-----开始证书-----
[为简洁起见删除]
-----结束证书-----
---
服务器证书
主题=/C=US/ST=加利福尼亚/L=山景/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
    会话 ID:C05953342AC01E9AB63CF0BABBE942B4E29061AA4904C3F1393EBBB1548B0254
    会话 ID-ctx:
    万能钥匙:38B97C0CC2795AD1D3EEACAE244E33F1E5A0988AE9182AC85DFFF5B6BFAE6585E6BCF763E1E0EB300CD38B87CC0F2501
    键-Arg:无
    Krb5 主体:无
    PSK 身份:无
    PSK 身份提示:无
    TLS 会话票证生命周期提示:100800(秒)
    TLS 会话票证:
[为简洁起见删除]
    开始时间:1347036912
    超时:300(秒)
    验证返回码:0(ok)

目标(ARM)机器的输出

验证深度为 9
已连接(00000003)
depth=1 C = ZA, O = Thawte Consulting (Pty) Ltd., CN = Thawte SGC CA
验证错误:num=20:无法获取本地颁发者证书
验证返回:1
depth=1 C = ZA, O = Thawte Consulting (Pty) Ltd., CN = Thawte SGC CA
验证错误:num=27:证书不受信任
验证返回:1
depth=0 C = 美国,ST = 加利福尼亚,L = 山景城,O = Google Inc,CN = www.google.com
验证返回:1
---
证书链
 0 秒:/C=US/ST=加利福尼亚/L=山景/O=Google Inc/CN=www.google.com
   i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
-----开始证书-----
[为简洁起见删除]
-----结束证书-----
 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-----开始证书-----
[为简洁起见删除]
-----结束证书-----
---
服务器证书
主题=/C=US/ST=加利福尼亚/L=山景/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
    会话 ID:AA9E7D7AD223F18241A210D224B8BEF4A441572C1A9719BF3504FB03297D85DE
    会话 ID-ctx:
    万能钥匙:7A15F2071D50C076C0524AAD45857C5683212370582AD7D9F882B64104F0A0A8C2948B8B85C1EC19015C
51CAC30D4A05
    键-Arg:无
    PSK 身份:无
    PSK 身份提示:无
    SRP 用户名:无
    TLS 会话票证生命周期提示:100800(秒)
    TLS 会话票证:
[为简洁起见删除]

    开始时间:1347036508
    超时:300(秒)
    验证返回码:27(证书不受信任)
4

1 回答 1

0

错误消息非常清楚: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函数。另请参阅命令行工具
的源代码以获取更多详细信息: http : //cvs.openssl.org/fileview?f=openssl/apps/s_client.c&v=1.169(搜索 CAfile 和 SSL_CTX_load_verify_locations)。openssl

于 2012-10-05T02:32:52.720 回答