wget、自签名证书和自定义 HTTPS 服务器

Posted

技术标签:

【中文标题】wget、自签名证书和自定义 HTTPS 服务器【英文标题】:wget, self-signed certs and a custom HTTPS server 【发布时间】:2010-12-11 07:19:40 【问题描述】:

出于各种原因,我创建了一个简单的 HTTP 服务器,并通过 OpenSSL 添加了 SSL 支持。我正在使用自签名证书。只要我将 CA 添加到受信任的根 CA,IE、Firefox 和 Chrome 就会愉快地加载内容。

但是,wget(即使使用--no-check-certificate 标志)报告:

OpenSSL: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

如果我使用以下命令对我的服务器运行 OpenSSL 客户端:

openssl s_client -connect dnvista:82 -debug

我回来了: 验证错误:num=19:证书链中的自签名证书 验证返回:0 然后

5852:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:.\ssl\s3_pkt.c:1060:SSL alert number 40
5852:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:.\ssl\s23_lib.c:188:

wget 和 OpenSSL 客户端根本不能使用自签名证书吗?

更新:

对于后来出现的任何人,添加此代码有助于 OpenSSL 客户端和 Firefox:

EC_KEY *ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
SSL_CTX_set_tmp_ecdh(ctx, ecdh);
EC_KEY_free(ecdh);

【问题讨论】:

【参考方案1】:

您还可以通过多种方式之一将受信任的根 CA 证书安装到 OpenSSL:

将您的 CA 证书放在 /etc/pki/tls/certs 或等效目录中,然后根据证书哈希创建一个链接。详情请见http://gagravarr.org/writing/openssl-certs/others.shtml#ca-openssl。 将您的 CA 证书附加到 /etc/pki/tls/certs/ca-bundle.crt、/etc/pki/tls/cert.pem 或等效的 CA 包。

【讨论】:

我发布了一个问题:Ruby OpenSSL Set-up or Configuration for your Application Code,询问如何 Ruby 获取 PEM 或 CRT 资源来进行主机验证。我已经详尽地寻找了一个通过递归 grep 扫描加载环境或配置信息的模块——没有运气(测试和示例除外)。【参考方案2】:

我查看了wget 的手册页,--no-check-certificate 似乎只影响服务器证书。您需要将您的自签名证书指定为本地有效的 CA 证书。

为此,请在wget 中将证书指定为--ca-certificate=...,在s_client 情况下将证书指定为-CAfile

【讨论】:

嗨。我见过很多这样的cmets,用很多词来“关闭检查”。这是一个真的糟糕想法。有点像在潮湿的道路上用光头轮胎进行街头赛车。我很失望这个答案有一个“勾号”标记。 will:我同意,将支票转入通常是个坏主意。我的回答建议了一种让客户端知道 CA 证书的方法,以便可以正确执行检查。

以上是关于wget、自签名证书和自定义 HTTPS 服务器的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发HTTPS实现之信任SSL证书和自签名证书

Web Server CA证书签名步骤和自签名测试,支持多域名

httpclient 和自签名证书的问题

为app接口使用https和自签名证书

PHP - 使用 STARTTLS 和自签名证书的 Swiftmailer

Ktor 客户端 IOS 和自签名证书