Làm cách nào để liệt kê các bộ mật mã SSL / TLS mà một trang web cụ thể cung cấp?


261

Làm cách nào tôi có thể truy xuất danh sách các bộ mật mã SSL / TLS mà một trang web cụ thể cung cấp?

Tôi đã thử openssl, nhưng nếu bạn kiểm tra đầu ra:

$ echo -n | openssl s_client -connect www.google.com:443 
CONNECTED(00000003)
depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x
MTEyMTgyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA6PmGD5D6htffvXImttdEAoN4c9kCKO+IRTn7EOh8rqk41XXGOOsKFQebg+jN
gtXj9xVoRaELGYW84u+E593y17iYwqG7tcFR39SDAqc9BkJb4SLD3muFXxzW2k6L
05vuuWciKh0R73mkszeK9P4Y/bz5RiNQl/Os/CRGK1w7t0UCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQCfQ89bxFApsb/isJr/aiEdLRLDLE5a+RLizrmCUi3nHX4adpaQedEkUjh5
u2ONgJd8IyAPkU0Wueru9G2Jysa9zCRo1kNbzipYvzwY4OA8Ys+WAi0oR1A04Se6
z5nRUP8pJcA2NhUzUnC+MY+f6H/nEQyNv4SgQhqAibAxWEEHXw==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 316 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 748E2B5FEFF9EA065DA2F04A06FBF456502F3E64DF1B4FF054F54817C473270C
    Session-ID-ctx: 
    Master-Key: C4284AE7D76421F782A822B3780FA9677A726A25E1258160CA30D346D65C5F4049DA3D10A41F3FA4816DD9606197FAE5
    Key-Arg   : None
    Start Time: 1266259321
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

nó chỉ cho thấy rằng bộ mật mã là thứ gì đó với AES256-SHA. Tôi biết tôi có thể grep thông qua kết xuất hex của cuộc trò chuyện, nhưng tôi đã hy vọng cho một cái gì đó thanh lịch hơn một chút.

Tôi muốn làm điều này trên Linux, nhưng Windows (hoặc khác) sẽ ổn. Câu hỏi này được thúc đẩy bởi thử nghiệm bảo mật tôi làm cho PCI và thử nghiệm thâm nhập chung.

Cập nhật:

GregS chỉ ra bên dưới rằng máy chủ SSL chọn từ bộ mật mã của máy khách. Vì vậy, có vẻ như tôi sẽ cần phải kiểm tra tất cả các bộ mật mã một lần. Tôi nghĩ rằng tôi có thể hack một cái gì đó cùng nhau, nhưng có cách nào đơn giản hơn, bằng chứng trong tương lai (ví dụ như mật mã mới) để làm điều này không?


Có lẽ gnutls-clinào?
grawity

Sau khi thay đổi tiêu đề, câu hỏi này thực sự không yêu cầu phần mềm rec. Bỏ phiếu để mở lại.
Bob

@ fixer1234 Nếu điều đó làm bạn vui hơn, tôi đã xóa bất kỳ sự xuất hiện nào của từ "công cụ". Câu hỏi cốt lõi là hỏi làm thế nào để hoàn thành một nhiệm vụ cụ thể nào; đó là một cụm từ nhỏ và khác xa với các câu hỏi loại "danh sách phần mềm" kết thúc mở hơn.
Bob

@Bob: Tôi ngây ngất. :-) Bỏ phiếu để mở lại.
fixer1234

Câu trả lời:


232

Tôi đã viết một tập lệnh bash để kiểm tra bộ mật mã. Nó nhận được một danh sách các bộ mật mã được hỗ trợ từ OpenSSL và cố gắng kết nối bằng cách sử dụng từng bộ. Nếu bắt tay thành công, nó sẽ in YES. Nếu bắt tay không thành công, nó sẽ in NO, theo sau là văn bản lỗi OpenSSL.

#!/usr/bin/env bash

# OpenSSL requires the port number.
SERVER=$1
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
do
echo -n Testing $cipher...
result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
if [[ "$result" =~ ":error:" ]] ; then
  error=$(echo -n $result | cut -d':' -f6)
  echo NO \($error\)
else
  if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
    echo YES
  else
    echo UNKNOWN RESPONSE
    echo $result
  fi
fi
sleep $DELAY
done

Đây là đầu ra mẫu hiển thị 3 mật mã không được hỗ trợ và 1 mật mã được hỗ trợ:

[@linux ~]$ ./test_ciphers 192.168.1.11:443
Obtaining cipher list from OpenSSL 0.9.8k 25 Mar 2009.
Testing ADH-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-DSS-AES256-SHA...NO (sslv3 alert handshake failure)
Testing AES256-SHA...YES

EDIT: Thêm tính linh hoạt khi máy chủ và cổng được cung cấp làm tham số cho tập lệnh


7
openssl 1.0 cần một sự thay đổi: if [[ "$result" =~ "Cipher :" ]] ; thenthay vì if [[ "$result" =~ "Cipher is " ]] ; thentôi cũng kiểm tra SSL2 và đàm phán lại an toàn:echo -n Testing ssl2... result=$(echo -n | openssl s_client -ssl2 -connect $SERVER 2>&1) if [[ "$result" =~ "Cipher :" ]] ; then echo supported. INSECURE! else echo no support, OK fi echo -n Testing SSL secure renegotiation... echo -n "" | openssl s_client -connect $SERVER 2>&1 | grep 'Secure Renegotiation'
Hubert Kario

9
Có một kịch bản shell rất tinh vi khác có sẵn sử dụng sslscan và openssl: TLSSLed
Robert

2
Tôi đã liệt kê bên dưới một tập lệnh khác chỉ yêu cầu OpenSSL được gọi là CodesScan
Olivier - interfaSys

1
Lưu ý rằng tập lệnh này có thể sẽ không cho bạn biết nếu máy chủ hỗ trợ các bộ mật mã mà OpenSSL không hỗ trợ.
sampablokuper

2
Đề xuất từ ​​@Robert cho TLSSLed thật tuyệt vời. Nó đã được cập nhật lên 1.3 và có nhiều chức năng hơn. Tôi đã được sử dụng để kiểm tra bảo mật và phải nói rằng tôi rất ấn tượng.
John Yeary

162

Nmap với ssl-enum-ciphers

Không có cách nào tốt hơn hoặc nhanh hơn để có được danh sách các mật mã có sẵn từ một dịch vụ mạng. Thêm vào đó, nmap sẽ cung cấp một đánh giá sức mạnh của mạnh, yếu hoặc không xác định cho mỗi mật mã có sẵn.

Đầu tiên, tải xuống tập lệnh nmap ssl-enum-ciphers.nse ( giải thích tại đây ). Sau đó, từ cùng thư mục với tập lệnh, hãy chạy nmap như sau:

Liệt kê các mật mã được hỗ trợ bởi máy chủ HTTP

$ nmap --script ssl-enum-ciphers -p 443 www.example.com

Liệt kê các mật mã được hỗ trợ bởi máy chủ IMAP

$ nmap --script ssl-enum-ciphers -p 993 mail.example.com

Đây là một đoạn đầu ra từ máy chủ Dovecot IMAP:

993/tcp open  imaps
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|_  least strength: weak

Nmap done: 1 IP address (1 host up) scanned in 1.03 seconds

2
Có cách nào để sử dụng tập lệnh này trên IMAP với STARTTLS không? STARTTLS trên SMTP dường như hoạt động, nhưng trên IMAP, tập lệnh thậm chí không xuất hiện để chạy.
Giel

Vài điều: bạn có thể đang chạy tập lệnh trong bản phân phối nmap của mình, thay vì tập lệnh bạn đã tải xuống. Kiểm tra bằng cách đổi tên của bạn. Sau đó kiểm tra "portrule" mà trong một số phiên bản kiểm tra số cổng thường được sử dụng. Thay thế bằngportrule = function() \n return true \n end
mỏng

... và nó sẽ cần một số hack để hoạt động với IMAP STARTTLS, FTPS AUTH TLS, v.v., nhưng điều đó là có thể.
mỏng

1
Một lưu ý là các tập lệnh cũ hơn, có thể được bao gồm trong distro / gói của bạn, liệt kê các mật mã theo thứ tự bảng chữ cái, không phải thứ tự ưu tiên của máy chủ (hoặc máy khách). Xem nhận xét trên từ @slim
Clint Pachl

3
Trong 2 năm kể từ khi câu trả lời này được viết, Nmap đã thêm hỗ trợ cho STARTTLS qua FTP, NNTP, IMAP, LDAP, POP3, PostgreQuery, SMTP, XMPP, VNC và MS SQL, cũng như nhiều cải tiến khác ngoài việc liệt kê các mật mã được hỗ trợ .
bonsaiviking

104

Có công cụ nào có thể kiểm tra bộ mật mã SSL / TLS mà một trang web cụ thể cung cấp không?

Có, bạn có thể sử dụng công cụ trực tuyến trên trang web của SSL Labs để truy vấn Cơ sở dữ liệu Máy chủ SSL công cộng.

Đây là một đoạn thông tin mà nó cung cấp:

văn bản thay thế

(ảnh chụp màn hình từ kết quả của google.com)


Đây chính xác là những gì tôi đang tìm kiếm! Cảm ơn rất nhiều!
Jeremy Powell

11
Thật không may, nó chỉ hỗ trợ HTTPS trên cổng tiêu chuẩn, không thể sử dụng nó để kiểm tra POP3S, IMAPS hoặc IMAP bằng TLS
Hubert Kario

1
Và trong khi nó chỉ hỗ trợ HTTPS, nó thậm chí còn thiếu hỗ trợ cho SNI.
Gurken Papst

12
Và mặc dù nó tuyệt vời cho các trang web công khai, bạn không thể sử dụng nó cho các trang web trên các mạng cách ly với Internet.
Iszi

53

sslscan là một tiện ích nhỏ đẹp.

Nó kiểm tra kết nối với TLS và SSL (và tập lệnh xây dựng có thể liên kết với bản sao OpenSSL của chính nó để các phiên bản SSL lỗi thời cũng được kiểm tra) và báo cáo về các bộ và chứng chỉ mật mã của máy chủ.

Ví dụ đầu ra cho google.com(cắt giảm để dễ đọc):

$ sslscan google.com
Testing SSL server google.com on port 443

 TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  AES128-GCM-SHA256
Accepted  TLSv1.2  128 bits  AES128-SHA
<snip>
Preferred TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  AES128-SHA
<snip>
Preferred TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  AES128-SHA
<snip>
Preferred SSLv3    128 bits  RC4-SHA
Accepted  SSLv3    128 bits  RC4-MD5
<snip>

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  *.google.com
Altnames: DNS:*.google.com, DNS:*.android.com, <snip>
Issuer:   Google Internet Authority G2

Not valid before: Apr  7 08:24:31 2016 GMT
Not valid after:  Jun 30 08:20:00 2016 GMT

1
yum install sslscanhoạt động trên CentOS 6.
một lập trình viên

1
sudo dnf install sslscantrên Fedora 22 là tốt.
Zayne S Halsall

2
brew install sslscantrên OSX
Xiao

sudo apt-get install sslscantrên Ubuntu (12.04 - vì vậy tất cả các phiên bản mới hơn sẽ ổn).
balu

3
Cập nhật: Cần lưu ý rằng phiên bản chính thức của sslscan được tìm thấy trong kho Debian và Ubuntu (hiện là 1.8.2 từ năm 2009) không hỗ trợ TLS v1.1 và 1.2, xem bug.launchpad.net/ub Ubuntu / + source / sslscan / + lỗi / 1372741 . Do đó, người ta nên sử dụng phiên bản trên GitHub mà OP liên kết đến.
balu

15

Vì đây là một chủ đề tham khảo tuyệt vời cho các công cụ quét SSL, tôi sẽ liệt kê CodesScan được tạo ra một năm trước và cũng có thể xác định các vấn đề với mật mã trao đổi khóa. https://github.com/jveeaver/cipherscan

Nếu bạn muốn ngã ba của tôi hỗ trợ SNI và FreeBSD, URL là https://github.com/oparoz/cipherscan

Đó là tập lệnh gọi openssl s_clientvà hỗ trợ sử dụng nhị phân OpenSSL của riêng bạn để bạn có thể kiểm tra các tính năng sắp tới hoặc mật mã mới (chacha20 + poly1305 mỗi ví dụ).

Nó cũng cho phép bạn kết nối với bất kỳ cổng nào bạn muốn và sử dụng starttlss.

Đây là một đầu ra điển hình

# ./cipherscan -o ./openssl api.mycompany.com:443
...................
prio  ciphersuite                  protocols              pfs_keysize
1     DHE-RSA-AES256-GCM-SHA384    TLSv1.2                DH,4096bits
2     DHE-RSA-AES256-SHA256        TLSv1.2                DH,4096bits
3     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2                ECDH,P-384,384bits
4     ECDHE-RSA-AES256-SHA384      TLSv1.2                ECDH,P-384,384bits
5     DHE-RSA-AES128-GCM-SHA256    TLSv1.2                DH,4096bits
6     DHE-RSA-AES128-SHA256        TLSv1.2                DH,4096bits
7     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2                ECDH,P-384,384bits
8     ECDHE-RSA-AES128-SHA256      TLSv1.2                ECDH,P-384,384bits
9     DHE-RSA-CAMELLIA256-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
10    DHE-RSA-AES256-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
11    ECDHE-RSA-AES256-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
12    DHE-RSA-CAMELLIA128-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
13    DHE-RSA-AES128-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
14    ECDHE-RSA-AES128-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
15    CAMELLIA256-SHA              TLSv1,TLSv1.1,TLSv1.2
16    AES256-SHA                   TLSv1,TLSv1.1,TLSv1.2
17    CAMELLIA128-SHA              TLSv1,TLSv1.1,TLSv1.2
18    AES128-SHA                   TLSv1,TLSv1.1,TLSv1.2

Certificate: trusted, 4096 bit, sha256WithRSAEncryption signature
TLS ticket lifetime hint: 300
OCSP stapling: supported

Và đây là danh sách các lựa chọn

-a | --allciphers   Test all known ciphers individually at the end.
-b | --benchmark    Activate benchmark mode.
-d | --delay        Pause for n seconds between connections
-D | --debug        Output ALL the information.
-h | --help         Shows this help text.
-j | --json         Output results in JSON format.
-o | --openssl      path/to/your/openssl binary you want to use.
-v | --verbose      Increase verbosity.

Đầu ra json rất hữu ích nếu bạn gọi nó từ các tập lệnh khác.


"Cấu hình big-SSLv3 không được hỗ trợ, kết nối không thành công"
một lập trình viên


8

Sau một chút loay hoay, tôi đã tìm thấy Thử nghiệm này cho SSL-TLS (OWASP-CM-001) :

Trình quét nmap , thông qua tùy chọn quét quét các ứng dụng SSL, có thể xác định các dịch vụ SSL. Máy quét lỗ hổng, ngoài việc thực hiện khám phá dịch vụ, có thể bao gồm kiểm tra đối với các mật mã yếu (ví dụ: máy quét Nessus có khả năng kiểm tra các dịch vụ SSL trên các cổng tùy ý và sẽ báo cáo các mật mã yếu).

và cũng: Foundstone SSL Digger là một công cụ để đánh giá sức mạnh của các máy chủ SSL bằng cách kiểm tra các mật mã được hỗ trợ. Một số mật mã được biết là không an toàn.



2

SSLScan là tuyệt vời; một công cụ mới SSLDiagnos hoạt động cho Windows hoặc bạn chỉ có thể viết một tập lệnh bằng cách sử dụng openssl s_client.



2

Nếu bạn muốn có một đầu ra có thể chỉnh sửa tốt (và hỗ trợ kiểm tra tất cả các phiên bản SSL / TLS)

Cách sử dụng: ./script.sh www.url.com

#!/usr/bin/env bash
ciphers2=$(openssl ciphers -ssl2 'ALL:eNULL' | sed -e 's/:/ /g')
ciphers3=$(openssl ciphers -ssl3 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst1=$(openssl ciphers -tls1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst11=$(openssl ciphers -tls1.1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst12=$(openssl ciphers -tls1.2 'ALL:eNULL' | sed -e 's/:/ /g')

SSL2="SSL2("
for cipher in ${ciphers2[@]}
do
result=$(echo -n | openssl s_client -ssl2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL2="${SSL2}${cipher}:"
fi
done
SSL2=$(echo "${SSL2})" | sed -e 's/:)/)/g')

SSL3="SSL3("
for cipher in ${ciphers3[@]}
do
result=$(echo -n | openssl s_client -ssl3 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL3="${SSL3}${cipher}:"
fi
done
SSL3=$(echo "${SSL3})" | sed -e 's/:)/)/g')
TLS1="TLS1("
for cipher in ${cipherst1[@]}
do
result=$(echo -n | openssl s_client -tls1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS1="${TLS1}${cipher}:"
fi
done
TLS1=$(echo "${TLS1})" | sed -e 's/:)/)/g')

TLS11="TLS1.1("
for cipher in ${cipherst11[@]}
do
result=$(echo -n | openssl s_client -tls1_1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS11="${TLS11}${cipher}:"
fi
done
TLS11=$(echo "${TLS11})" | sed -e 's/:)/)/g')

TLS12="TLS1.2("
for cipher in ${cipherst12[@]}
do
result=$(echo -n | openssl s_client -tls1_2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS12="${TLS12}${cipher}:"
fi
done
TLS12=$(echo "${TLS12})" | sed -e 's/:)/)/g')

echo "$1,$SSL2,$SSL3,$TLS1,$TLS11,$TLS12";

Bạn đang biểu diễn openssl ciphers -tls1.1openssl ciphers -tls1.2tuy nhiên những thông số đó dường như không tồn tại ... Chỉ có -tls1(ít nhất là trên các nền tảng tôi đã thử).
Marki

(Dường như có các tùy chọn bổ sung ở dạng tls1_1tls1_2nhưng chúng chỉ được hiển thị trên phiên bản chính của openssl và thậm chí không phải trong 1.0.2 ....)
Marki

Lưu ý rằng tập lệnh này có thể sẽ không cho bạn biết nếu máy chủ hỗ trợ các bộ mật mã mà OpenSSL không hỗ trợ.
sampablokuper

2

Có một kịch bản nhỏ đẹp tại pentesterscripting.com để sử dụng cả SSLScan và OpenSSL để kiểm tra:

  • SSL v2;
  • Phù hợp với mật mã tuần;
  • MD5; và
  • Lỗ hổng đàm phán lại TLS

http://www.pentesterscripting.com/discovery/ssl_tests (thông qua Máy lưu trữ Internet Wayback )

Sao chép ở đây để tương lai vì trang web chính hiện đã chết:

#!/usr/bin/env bash

# Description:
#       Script to extract the most security relevant details from a 
#       target SSL/TLS implementation by using sslscan.
# Author:  Raul Siles (raul _AT_ taddong _DOT_ com)
#          Taddong (www.taddong.com)
# Date:    2011-05-27
# Version: 1.0
#
# - Current SSL/TLS tests: 
#   SSLv2, NULL cipher, weak ciphers -key length-, strong 
#   ciphers -AES-, MD5 signed cert, SSL/TLS renegotiation
#
# Requires: 
# - sslscan
# https://sourceforge.net/projects/sslscan/
#
# Credits: Based on ssl_test.sh by Aung Khant, http://yehg.net.
# 

#
# /**************************************************************************
# *   Copyright 2011 by Taddong (Raul Siles)                                *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 3 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU General Public License for more details.                          *
# *                                                                         *
# *   You should have received a copy of the GNU General Public License     *
# *   along with this program. If not, see <http://www.gnu.org/licenses/>.  *
# *                                                                         *
# **************************************************************************/
#

VERSION=1.0

OPENSSLVERSION=$(openssl version)
SSLSCANVERSION=$(sslscan --version | grep version | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")

echo ------------------------------------------------------
echo " TLSSLed - ($VERSION) based on sslscan and openssl"
echo " by Raul Siles (www.taddong.com)"
echo " ( inspired by ssl_test.sh by Aung Khant )"
echo ------------------------------------------------------
echo + openssl version: $OPENSSLVERSION
echo + $SSLSCANVERSION
echo ------------------------------------------------------
echo

if [ $# -ne 2 ]; then 
   echo Usage: $0 IP PORT
   exit
fi

HOST=$1
PORT=$2

echo  [*] Analyzing SSL/TLS on $HOST:$PORT ...
echo 

# Run sslcan once, store the results to a log file and
# analyze that file for all the different tests:
DATE=$(date +%F_%R:%S)
TARGET=$HOST:$PORT
LOGFILE=sslscan\_$TARGET\_$DATE.log
ERRFILE=sslscan\_$TARGET\_$DATE.err

echo [*] Running sslscan on $HOST:$PORT...
sslscan $HOST:$PORT > $LOGFILE 2> $ERRFILE

echo
echo [*] Testing for SSLv2 ...
cat $LOGFILE | grep "Accepted  SSLv2"
echo
echo [*] Testing for NULL cipher ...
cat $LOGFILE | grep "NULL" | grep Accepted
echo
echo [*] Testing for weak ciphers \(based on key length\) ...
cat $LOGFILE | grep " 40 bits" | grep Accepted
echo 
cat $LOGFILE | grep " 56 bits" | grep Accepted
echo
echo [*] Testing for strong ciphers \(AES\) ...
cat $LOGFILE | grep "AES" | grep Accepted

echo 
echo [*] Testing for MD5 signed certificate ...
#cat $LOGFILE | grep -E 'MD5WithRSAEncryption|md5WithRSAEncryption'
cat $LOGFILE | grep -i 'MD5WithRSAEncryption'

echo 
echo [*] Checking preferred server ciphers ...
cat $LOGFILE | sed '/Prefered Server Cipher(s):/,/^$/!d' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

echo
echo [*] Testing for SSLv3/TLSv1 renegotiation vuln. \(CVE-2009-3555\) ...
#echo [*] echo R \| openssl s_client -connect $HOST:$PORT \| grep "DONE"
#
# Renegotiation details go to stderr (2>)
#
# if $OPENSSLVERSION is updated (version?) it supports RFC5746 and will print:
# Secure Renegotiation IS NOT supported
# Secure Renegotiation IS supported
#

echo R | openssl s_client -connect $HOST:$PORT | grep -E "Secure Renegotiation IS|DONE"

echo
echo [*] New files created:
ls -l $LOGFILE
if [ ! -s $ERRFILE ]; then
        # Error file is empty
        rm $ERRFILE
else
        ls -l $ERRFILE
fi

echo
echo 
echo [*] done
echo

Cách sử dụng: ./ssltest.sh PORT HOST


2

Dựa trên câu trả lời và đề xuất của @ indiv để đăng nó dưới dạng câu trả lời của riêng mình, tôi đang cung cấp phiên bản tinh chỉnh của tập lệnh @ indiv. Bạn có thể cung cấp máy chủ làm đối số đầu tiên và nó sẽ cho kết quả giống như tập lệnh gốc, nhưng được định dạng hơn một chút:

#!/usr/bin/env bash
# adapted from https://superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-particular-website-offers

# OpenSSL requires the port number.
# SERVER=192.168.1.1:443
SERVER=$1
if [[ -z "$SERVER" ]]; then echo "ERROR: no server specified"; exit 1; fi;

## Set up colors, if possible
if [[ $(tput colors) ]];then
  COLOR_BOLD="$(tput bold)"     # "\e[1;32m"
  COLOR_GREEN="$(tput setaf 2)" # "\e[1;32m"
  COLOR_RESET="$(tput sgr0)"    # "\e[0m"
fi


SERVER=$1:443
echo Server is ${COLOR_BOLD}"$SERVER"${COLOR_RESET}

DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
  do
  printf "%-42s" "Testing $cipher... "
  result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
  if [[ "$result" =~ ":error:" ]] ; then
    error=$(echo -n $result | cut -d':' -f6)
    echo NO \($error\)
  else
    if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
      echo ${COLOR_BOLD}${COLOR_GREEN}YES${COLOR_RESET}
    else
      echo UNKNOWN RESPONSE
      echo $result
    fi
  fi
  sleep $DELAY
done

2

Sách dạy nấu ăn OpenSSL (miễn phí) của Ivan Ristić, người đã phát triển công cụ trực tuyến SSL Labs được ghi chú trong câu trả lời của Kez , nêu rõ:

Nếu bạn muốn xác định tất cả các bộ được hỗ trợ bởi một máy chủ cụ thể, hãy bắt đầu bằng cách gọi openssl ciphers ALLđể có được danh sách tất cả các bộ được hỗ trợ bởi phiên bản OpenSSL của bạn. Sau đó gửi chúng đến máy chủ từng cái một để kiểm tra chúng riêng lẻ. Tôi không đề nghị bạn làm điều này bằng tay; đây là một tình huống trong đó một chút tự động hóa đi một chặng đường dài. Trên thực tế, đây là một tình huống trong đó tìm kiếm một công cụ tốt có thể phù hợp .

Tuy nhiên, có một bất lợi khi thử nghiệm theo cách này. Bạn chỉ có thể kiểm tra các bộ mà OpenSSL hỗ trợ. ...

Không có thư viện SSL / TLS duy nhất hỗ trợ tất cả các bộ mật mã và điều đó làm cho việc kiểm tra toàn diện trở nên khó khăn. Đối với SSL Labs, tôi đã sử dụng các bắt tay một phần cho mục đích này, với một khách hàng tùy chỉnh giả vờ hỗ trợ các bộ tùy ý . Nó thực sự không thể đàm phán ngay cả một bộ duy nhất, nhưng chỉ cần đề xuất đàm phán là đủ để các máy chủ cho bạn biết nếu họ hỗ trợ một bộ hay không. Bạn không chỉ có thể kiểm tra tất cả các bộ theo cách này, mà bạn còn có thể làm điều đó rất hiệu quả.

(Nhấn mạnh của tôi.)

Một công cụ mà tôi chưa thấy được đề cập trong các câu trả lời khác là SSLTest của Stephen Bradshaw , trong số những thứ khác, được dùng để so sánh "các mật mã và giao thức được phát hiện so với các tiêu chuẩn tuân thủ như DSD ISM và PCI-DSS."

Vì vậy, hãy thử điều này hoặc một trong những công cụ được đề cập trong các câu trả lời khác, hoặc người nào khác tự xây dựng và xem xét sử dụng phương pháp bắt tay một phần của Ristić.


1

Tôi đã viết một công cụ thực hiện chính xác điều này. Nó được gọi là tlsenum và nó có sẵn trên GitHub .

[ayrx@division tlsenum]$ ./tlsenum.py twitter.com 443
TLS Versions supported by server: 3.0, 1.0, 1.1, 1.2
Supported Cipher suites in order of priority:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

Đây là một ví dụ đầu ra của công cụ chống lại twitter.com.

Nó tương tự như những gì SSL Lab làm nhưng tôi thấy rằng việc có một công cụ dòng lệnh mà bạn có thể tự động hóa và phân tích cú pháp sẽ hữu ích hơn nhiều.


1

SSLyze, ban đầu tại https://github.com/iSECPartners/sslyze , hiện có tại https://github.com/nabla-c0d3/sslyze . Nó đã được đề cập trong một câu trả lời khác , nhưng không có nhiều chi tiết.

SSLyze dựa trên Python và hoạt động trên Linux / Mac / Windows từ dòng lệnh. Nó sử dụng OpenSSL và trên Windows, nó đi kèm với một bản sao OpenSSL đi kèm.

Liệt kê các giao thức, bộ mật mã và chi tiết chính, cộng với các bài kiểm tra cho một số lỗ hổng phổ biến. Có thể bật hoặc tắt kiểm tra cụ thể, để có thêm dữ liệu hoặc tăng tốc độ quét.


0

Điều duy nhất bạn có thể làm là thử tất cả chúng, từng cái một và xem cái nào được chấp nhận. Tôi không biết về một công cụ để làm điều này, mặc dù không khó để kết hợp chúng với nhau từ các công cụ kịch bản và openssl s_client.

Trong khi máy khách quảng cáo loại mật mã nào sẽ chấp nhận, máy chủ chỉ cần chọn một và sử dụng nó hoặc không kết nối nếu không tìm thấy thứ gì nó thích.


Ồ vâng ... vì một số lý do tôi đã nghĩ rằng đó là cách khác. Có lẽ tôi có thể tìm thấy một công cụ trộn sẵn ... :)
Jeremy Powell

0

Tất cả những câu trả lời là tốt. Một phần của câu trả lời có thể giải thích tại sao chúng ta cần một công cụ để khám phá danh sách máy chủ và không hỏi trực tiếp trong TLS rằng máy chủ cung cấp cho tất cả các bộ mật mã được hỗ trợ của nó giống như máy khách TLS làm khi kết nối với máy chủ.

Trả lời là máy chủ không gửi danh sách bao giờ , nó chỉ chọn trong danh sách mật mã máy khách mà nó muốn sử dụng, đây là cách viết giao thức SSL / TLS: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Prot Protocol # Codes_Suites

Đó là lý do tại sao khách hàng phải liệt kê các mật mã để có thể tìm thấy các mật mã được hỗ trợ bởi máy chủ và để thực hiện ít nhất một cái bắt tay mới (ClientHello) cho mỗi bộ mật mã.


0

Trong khi tìm kiếm thứ gì đó có AUTH TLStrên FTP, tôi đã phát hiện ra công cụ này: ssl-Codes-suite-enum

Đó là một tập lệnh perl về cơ bản thực hiện những gì tập lệnh shell của hackajar làm, chỉ phức tạp hơn.

Nó cũng cung cấp một đánh giá cơ bản về mật mã và giao thức được cung cấp. Nó hơi giống các công cụ SSL Labs, chỉ sử dụng cho gia đình. :)

Theo mặc định, nó chỉ hỗ trợ AUTH SSLtrên FTP, nhưng một tìm kiếm và thay thế đơn giản có thể khắc phục điều đó. Như một phần thưởng, nó cũng tuyên bố sẽ hỗ trợ SMTP với STARTTLSvà RDP.


0

TestSSLServer là một giải pháp hoàn toàn dựa trên Java. Ưu điểm:

  • nó hoạt động ở mức rất thấp, chỉ trên các Ổ cắm đơn giản, do đó, nó độc lập với các mật mã không khả dụng từ JDK hoặc OpenSSL .

  • nó không yêu cầu bất kỳ cổng bổ sung nào (như ICMP cho ping) để được mở

  • nó đang làm việc với chứng chỉ ứng dụng khách

Nhược điểm:

  • kể từ năm 2016, danh sách các mật mã có thể đã lỗi thời (mặc dù tôi không có chuyên gia nào ở đây để đánh giá điều này)

Kinh nghiệm cá nhân của tôi: được cung cấp một máy chủ hoạt động chặt chẽ chỉ với một cổng HTTPS duy nhất (không có cổng nào khác), yêu cầu chứng chỉ ứng dụng khách và iptables đang hoạt động, nó vẫn có thể liệt kê các mật mã có sẵn, trong khi các giải pháp được bình chọn hàng đầu thì không (tôi đã thử tập lệnh shell nhỏ, SSL Labs, NMap, sslscan)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.