我在验证自定义服务器 SSL 证书和 wget 时遇到问题。
wget -O- --ca-certificate=myservercert.pem https://www.google.com
这应该会失败,但实际上并没有失败,因为wget
不知何故还包括来自/etc/ssl
.使用curl
,效果与预期相同。
我怎样才能拥有两个相互验证的 SSL 点不信任违约?
答案1
答案取决于 wget 所链接的 SSL 库。它还可能取决于版本,但在 wget 1.13 和 1.15 之间,行为没有改变。
如果 wget 与 GnuTLS 链接(例如 Debian)
Wget 可以从文件或目录中的文件读取证书。要关闭所有默认受信任 CA(在 中/etc/ssl/certs
),请同时传递--ca-certificate
和--ca-directory
。
wget -O- --ca-directory=/empty --ca-certificate=myservercert.pem https://www.google.com
(创建/empty
以避免错误消息,但即使该目录不存在,wget 也会继续运行。)
如果 wget 与 OpenSSL 链接(例如 Ubuntu)
Wget 无条件检查 OpenSSL 默认位置中的证书(/usr/lib/ssl/certs
在 Ubuntu 上,./configure
由--openssldir
选项决定)。除此之外,还会检查命令行上指定的文件和目录(如果有)。没有选项可以禁用默认位置。
SSL_CTX_set_default_verify_paths
由于 wget无条件地从 OpenSSL调用该函数,因此会检查默认位置。您可以使用LD_PRELOAD
使呼叫无效。
$ cat no_openssl_default_verify_paths.c
int SSL_CTX_set_default_verify_paths(void *ctx) {
return 0;
}
$ gcc -Wall -fPIC -shared -o no_openssl_default_verify_paths.so no_openssl_default_verify_paths.c
$ wget -nv -O /dev/null https://www.google.com
2015-05-04 14:31:02 URL:https://www.google.fr/?gfe_rd=cr&ei=hmZHVa_DD5Tu8wex3IC4BQ [18613] -> "/dev/null" [1]
$ LD_PRELOAD=~/no_openssl_default_verify_paths.so wget -nv -O /dev/null https://www.google.com
ERROR: cannot verify www.google.com's certificate, issued by ‘/C=US/O=Google Inc/CN=Google Internet Authority G2’:
Unable to locally verify the issuer's authority.
To connect to www.google.com insecurely, use `--no-check-certificate'.