如何通过命令行验证SSL指纹?(白发,卷曲……)


32

使用命令行网站下载,如wgetcurl或其他任何一个...在一个脚本...

我拥有网站的SHA-1和SHA-256认证指纹。出于安全考虑(1)(2),我不想使用公共SSL证书颁发机构系统。指纹必须经过硬编码。

像应用程序这样的wget可以检查SSL指纹吗?

wget没有这种功能。(3

使用wget --ca-certificatecurl --cacert我必须运行自己的本地证书颁发机构,我想防止这样做,因为这会增加很多复杂性。这也非常困难,而且从未有人做到过。(4

没有像这样的工具
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com吗?

当然,该解决方案必须不易受到TOCTOU的攻击。(5)MITM可以为openssl客户端请求返回有效的指纹,并篡改以下wget请求。


可能需要做一些OpenSSL魔术,例如:cyberciti.biz/faq/…–
贾斯汀·安德鲁斯克

访客:请注意,这是交叉发布到infosec SE的。自我答案之一就是从那里复制的。顺便说一句,这是皱着眉头的行为。
费利克斯Saparelli

Answers:


31

资源

安装所需的软件:

apt-get install ca-certificates curl

下载公共SSL证书:

openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt >./x.cert </dev/null

或更好:

echo -n | openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./torproject.pem

获取SHA-1指纹:

openssl x509 -noout -in torproject.pem -fingerprint -sha1

获取SHA-256指纹:

openssl x509 -noout -in torproject.pem -fingerprint -sha256

使用torproject.org常见问题解答:SSL手动比较SHA-1和SHA-256指纹。

.

(可选)使ca证书对测试无效。在这里使用curl,但是wget有一个Bug Bug并仍然使用ca文件。

sudo mv /usr/share/ca-certificates /usr/share/ca-certificates_

使用curl和固定的证书下载:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html

但是,这在代理人的情况下不起作用:-/
Frederick Nord 2015年

请注意,在您的示例中,-CAfile选项被完全忽略。
拉尔斯

11

在tcsh中:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout

3
zsh工作,也应该为bash工作
5

10

这也足够了:

openssl x509 -fingerprint -in server.crt

添加-md5选项以检索MD5指纹。-md5不能放在之间-inserver.crt
林果皞

4

使用openssl命令及其客户端功能相当容易。

以下小脚本将采用给定的域(没有https前缀)和SHA-1指纹,如果检索到的指纹匹配,则退出且没有错误(0),如果没有匹配,则退出代码为1。然后,您可以通过简单地测试最后一个退出代码将其合并到脚本中$?

#!/ bin / bash
FPRINT =`echo -n | openssl s_client -connect $ 1:443 2> / dev / null \ | openssl x509-无-指纹| 切-f2 -d'='` 如果[“ $ 2” =“ $ FPRINT”]; 然后 出口0 其他 1号出口 科幻

它容易受到TOCTOU的攻击。[1] MITM可以为openssl客户端请求返回有效的指纹,并篡改以下wget请求。[1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch

从理论上讲是正确的。wget使用OpenSSL 修改和编译它相当容易,以便它可以执行内联所需的操作,但这超出了AU回答的范围。
ish 2012年

那么,如何使用s_client来检索文档呢?像(echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443应该工作,不是吗?好吧,您必须将SSL会话信息与实际内容回复分开。
taneli 2012年

3

资源

#!/usr/bin/perl
# https://security.stackexchange.com/questions/20399/how-to-verify-the-ssl-fingerprint-by-command-line-wget-curl
# Code snippets taken from Net::SSLeay documentation and mildly modified.
# Requires a newer version of SSLeay (tested with 1.48)
# Needless to say, verify correct $host and $fingerprint before testing!!!

use Net::SSLeay qw(get_https3);

$host = "www.google.com";
$port = 443;
$fingerprint = "C1:95:6D:C8:A7:DF:B2:A5:A5:69:34:DA:09:77:8E:3A:11:02:33:58";

($p, $resp, $hdrs, $server_cert) = get_https3($host, $port, '/');
if (!defined($server_cert) || ($server_cert == 0)) {
    warn "Subject Name: undefined, Issuer  Name: undefined";
} elsif (Net::SSLeay::X509_get_fingerprint($server_cert, "sha1") ne $fingerprint) {
    warn 'Invalid certificate fingerprint '
        .  Net::SSLeay::X509_get_fingerprint($server_cert, "sha1")
        . ' for ' . Net::SSLeay::X509_NAME_oneline(
             Net::SSLeay::X509_get_subject_name($server_cert));
} else {
    print $p;
}

如Net :: SSLeay文档中概述的那样,此方法意味着在HTTP事务之后进行验证,因此如果要在发送数据之前验证自己正在与正确的服务器通信,则不应使用此方法。但是,如果您要做的只是确定是否信任刚刚下载的内容(听起来像是来自参考文献4),那就很好了。


1

那是我的日常脚本:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

输出:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.