커맨드 라인으로 SSL 지문을 확인하는 방법? (ww, curl,…)


32

같은 명령 줄 웹 사이트 다운로더를 사용하여 wget, curl스크립트에서 ... 또는 다른 하나는 ...

웹 사이트의 SHA-1 및 SHA-256 인증 지문이 있습니다. 보안 문제 ( 1 ) ( 2 ) 로 인해 공용 SSL 인증 기관 시스템을 사용하고 싶지 않습니다. 지문은 하드 코딩되어 있어야합니다.

응용 프로그램과 같은 wget이 SSL 지문을 확인할 수 있습니까?

wget에는 그러한 기능이 없습니다. ( 3 )

사용 wget --ca-certificate하거나 curl --cacert직접 로컬 인증 기관을 실행해야합니다.이를 방지하고 싶습니다. 그것은 또한 매우 어렵고 그 어느 누구도 그랬습니다. ( 4 )

같은 도구가
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com없습니까?

솔루션은 물론 TOCTOU에 취약하지 않아야합니다. ( 5 )이 MITM은 다음과 wget을 요청에는 OpenSSL 클라이언트 요청 및 변조에 대한 유효한 지문을 반환 할 수 있습니다.


아마 같은 일부 OpenSSL이 마법을 수행해야합니다 cyberciti.biz/faq/...
저스틴 Andrusk

방문자 : 이것은 infosec SE에 게시되었습니다 . 자체 답변 중 하나가 거기서 복사되었습니다. 이것은 멍청한 행동입니다.
Félix Saparelli

답변:


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

SHA-1 및 SHA-256 지문을 torproject.org FAQ : SSL 과 수동으로 비교하십시오 .

.

선택적으로 인증서를 테스트 목적으로 쓸모 없게 만듭니다. 사용하여 컬을 여기하지만 wget과는 버그가 버그를 하고 어쨌든 CA-파일을 사용합니다.

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

curl 및 고정 된 인증서로 다운로드하십시오.

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

/ -이하지만, 프록시의 존재에서 작동하지 않습니다
프레드릭 노르

예제에서 -CAfile 옵션은 완전히 무시됩니다.
Lars

11

tcsh에서 :

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

3
에서 일하고 zsh, bash에서도 작동해야합니다
number5

10

이것으로도 충분합니다.

openssl x509 -fingerprint -in server.crt

-md5MD5 지문을 검색하는 옵션을 추가하십시오 . 와 -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 -noout-지문 | 컷 -f2 -d '='` [ "$ 2"= "$ FPRINT"] 인 경우; 그때 출구 0 그밖에 1 번 출구 fi

TOCTOU에 취약합니다. [1] MITM은 openssl 클라이언트 요청에 유효한 지문을 반환하고 다음 wget 요청을 변조 할 수 있습니다. [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
제임스 미치

이론적으로는 사실입니다. wgetOpenSSL을 사용하여 수정 하고 컴파일하는 것이 매우 쉬워 인라인으로 원하는 것을 수행하지만 AU 답변의 범위를 벗어납니다.
ish

그렇다면 s_client를 사용하여 문서를 검색하는 것은 어떻습니까? 같은 (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443것이 작동해야합니까? 글쎄, 당신은 실제 콘텐츠 응답에서 SSL 세션 정보를 분리해야합니다.
taneli

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.