openssl证书验证-构建系统和目标系统上的不同行为(在ARM上无法正常工作)



这个故事的背景是,我将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-连接173.194.67.104:443-验证9

下面列出了不同机器上的输出。我在这两种情况下都运行openssl 1.0.1c。特别地,目标(ARM)系统似乎接收/解释不同的证书链。

我不知道为什么输出不同。有人能解释一下我如何让我的目标设备以与我的构建机器相同的方式正确验证证书吗?

构建(Fedora)机器的输出:

验证深度为9已连接(00000003)depth=2 C=US,O="威瑞信股份有限公司",OU=3级公共初级认证机构验证返回:1depth=1 C=ZA,O=Thawte Consulting(Pty)有限公司,CN=Thawte-SGC CA验证返回:1depth=0 C=美国,ST=加利福尼亚,L=山景,O=谷歌公司,CN=www.Google.com验证返回:1---证书链0秒:/C=美国/ST=加利福尼亚/L=山景/O=谷歌公司/CN=www.Google.comi:/C=ZA/O=Thawte咨询(私人)有限公司/CN=Thawte SGC CA-----开始证书-----[为简洁起见已删除]-----最终证书-----1 s:/C=ZA/O=Thawte Consulting(Pty)有限公司/CN=Thawte SGC CAi:/C=US/O=VeriSign,股份有限公司/OU=3级公共初级认证机构-----开始证书-----[为简洁起见已删除]-----最终证书--------服务器证书subject=/C=美国/ST=加利福尼亚/L=山景/O=谷歌公司/CN=www.Google.com发行人=/C=ZA/O=Thawte Consulting(Pty)有限公司/CN=Thawte SGC CA---未发送客户端证书CA名称---SSL握手读取1907字节,写入299字节---新,TLSv1/SSLv3,密码为RC4-SHA服务器公钥为1024位支持安全的重新协商压缩:无扩展:无SSL会话:协议:TLSv1密码:RC4-SHA会话ID:C05953342AC01E9AB63CF0BABBE94B4E29061AA4904C3F1393EBBB1548B0254会话ID ctx:主钥匙:38B97C0CC2795A1D3EEACAE244E33F1E5A0988AE9182AC85DFFF5B6BFAE6585E6BCF763E1E0EB300CD38B87CC0F2501密钥参数:无Krb5委托人:无PSK标识:无PSK标识提示:无TLS会话票证生存期提示:100800(秒)TLS会话票证:[为简洁起见已删除]开始时间:1347036912超时:300(秒)验证返回代码:0(ok)

从目标(ARM)机器输出

验证深度为9已连接(00000003)depth=1 C=ZA,O=Thawte Consulting(Pty)有限公司,CN=Thawte-SGC CA验证错误:num=20:无法获取本地颁发者证书验证返回:1depth=1 C=ZA,O=Thawte Consulting(Pty)有限公司,CN=Thawte-SGC CA验证错误:num=27:证书不可信验证返回:1depth=0 C=美国,ST=加利福尼亚,L=山景,O=谷歌公司,CN=www.Google.com验证返回:1---证书链0秒:/C=美国/ST=加利福尼亚/L=山景/O=谷歌公司/CN=www.Google.comi:/C=ZA/O=Thawte咨询(私人)有限公司/CN=Thawte SGC CA-----开始证书-----[为简洁起见已删除]-----最终证书-----1 s:/C=ZA/O=Thawte Consulting(Pty)有限公司/CN=Thawte SGC CAi:/C=US/O=VeriSign,股份有限公司/OU=3级公共初级认证机构-----开始证书-----[为简洁起见已删除]-----最终证书--------服务器证书subject=/C=美国/ST=加利福尼亚/L=山景/O=谷歌公司/CN=www.Google.com发行人=/C=ZA/O=Thawte Consulting(Pty)有限公司/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:主钥匙:7A15F2071D50C076C0524AAD45857C5683212370582AD7D9F882B64104F0A8C2948B885C1EC19015C51CAC30D4A05密钥参数:无PSK标识:无PSK标识提示:无SRP用户名:无TLS会话票证生存期提示:100800(秒)TLS会话票证:[为简洁起见已删除]开始时间:1347036508超时:300(秒)验证返回代码:27(证书不可信)

错误消息非常清楚: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)。

最新更新