mirror of
https://github.com/drwetter/testssl.sh.git
synced 2025-08-07 22:57:19 +02:00
1529 lines
61 KiB
Groff
1529 lines
61 KiB
Groff
.\" Automatically generated by Pandoc 2.17.1.1
|
|
.\"
|
|
.\" Define V font for inline verbatim, using C font in formats
|
|
.\" that render this, and otherwise B font.
|
|
.ie "\f[CB]x\f[]"x" \{\
|
|
. ftr V B
|
|
. ftr VI BI
|
|
. ftr VB B
|
|
. ftr VBI BI
|
|
.\}
|
|
.el \{\
|
|
. ftr V CR
|
|
. ftr VI CI
|
|
. ftr VB CB
|
|
. ftr VBI CBI
|
|
.\}
|
|
.TH "" "" "" "" ""
|
|
.hy
|
|
.SS NAME
|
|
.PP
|
|
testssl.sh \[en] check encryption of SSL/TLS servers
|
|
.SS SYNOPSIS
|
|
.PP
|
|
\f[V]testssl.sh [OPTIONS] <URI>\f[R],
|
|
\f[V]testssl.sh [OPTIONS] --file <FILE>\f[R]
|
|
.PP
|
|
or
|
|
.PP
|
|
\f[V]testssl.sh [BANNER OPTIONS]\f[R]
|
|
.SS DESCRIPTION
|
|
.PP
|
|
testssl.sh is a free command line tool which checks a server\[cq]s
|
|
service on any port for the support of TLS/SSL ciphers, protocols as
|
|
well as cryptographic flaws and much more.
|
|
.PP
|
|
The output rates findings by color (screen) or severity (file output) so
|
|
that you are able to tell whether something is good or bad.
|
|
The (screen) output has several sections in which classes of checks are
|
|
being performed.
|
|
To ease readability on the screen it aligns and indents the output
|
|
properly.
|
|
.PP
|
|
Only you see the result.
|
|
You also can use it internally on your LAN.
|
|
Except DNS lookups or unless you instruct testssl.sh to check for
|
|
revocation of certificates it doesn\[cq]t use any other hosts or even
|
|
third parties for any test.
|
|
.SS REQUIREMENTS
|
|
.PP
|
|
Testssl.sh is out of the box portable: it runs under any Unix-like
|
|
stack: Linux, *BSD, MacOS X, WSL=Windows Subsystem for Linux, Cygwin and
|
|
MSYS2.
|
|
\f[V]bash\f[R] is a prerequisite, also version 3 is still supported.
|
|
Standard utilities like awk, sed, tr and head are also needed.
|
|
This can be of a BSD, System 5 or GNU flavor whereas grep from System V
|
|
is not yet supported.
|
|
.PP
|
|
Any OpenSSL or LibreSSL version is needed as a helper.
|
|
Unlike previous versions of testssl.sh almost every check is done via
|
|
(TCP) sockets.
|
|
In addition statically linked OpenSSL binaries for major operating
|
|
systems are supplied in \f[V]./bin/\f[R].
|
|
.SS GENERAL
|
|
.PP
|
|
\f[V]testssl.sh URI\f[R] as the default invocation does the so-called
|
|
default run which does a number of checks and puts out the results
|
|
colorized (ANSI and termcap) on the screen.
|
|
It does every check listed below except \f[V]-E\f[R] which are (order of
|
|
appearance):
|
|
.IP " 0)" 4
|
|
displays a banner (see below), does a DNS lookup also for further IP
|
|
addresses and does for the returned IP address a reverse lookup.
|
|
Last but not least a service check is being done.
|
|
.IP " 1)" 4
|
|
SSL/TLS protocol check
|
|
.IP " 2)" 4
|
|
standard cipher categories
|
|
.IP " 3)" 4
|
|
server\[cq]s cipher preferences (server order?)
|
|
.IP " 4)" 4
|
|
forward secrecy: ciphers and elliptical curves
|
|
.IP " 5)" 4
|
|
server defaults (certificate info, TLS extensions, session information)
|
|
.IP " 6)" 4
|
|
HTTP header (if HTTP detected or being forced via
|
|
\f[V]--assume-http\f[R])
|
|
.IP " 7)" 4
|
|
vulnerabilities
|
|
.IP " 8)" 4
|
|
testing each of 370 preconfigured ciphers
|
|
.IP " 9)" 4
|
|
client simulation
|
|
.IP "10)" 4
|
|
rating
|
|
.PP
|
|
If a target FQDN has multiple IPv4 and/or multiple IPv6 addresses, it
|
|
scans all IPs with the specified options or using the default run -
|
|
unless specified otherwise, see \f[V]--ip\f[R], \f[V]-4\f[R] and
|
|
\f[V]-6\f[R].
|
|
IPv6 connectivity is automagically checked.
|
|
If there\[cq]s noch such thing you will see a banner \f[I]Testing all
|
|
\f[BI]IPv4\f[I] addresses\f[R] and all IPv6 addresses will appear in
|
|
round brackets.
|
|
.SS OPTIONS AND PARAMETERS
|
|
.PP
|
|
Options are either short or long options.
|
|
Any long or short option requiring a value can be called with or without
|
|
an equal sign.
|
|
E.g.
|
|
\f[V]testssl.sh -t=smtp --wide --openssl=/usr/bin/openssl <URI>\f[R]
|
|
(short options with equal sign) is equivalent to
|
|
\f[V]testssl.sh --starttls smtp --wide --openssl /usr/bin/openssl <URI>\f[R]
|
|
(long option without equal sign).
|
|
Some command line options can also be preset via ENV variables.
|
|
\f[V]WIDE=true OPENSSL=/usr/bin/openssl testssl.sh --starttls=smtp <URI>\f[R]
|
|
would be the equivalent to the aforementioned examples.
|
|
Preference has the command line over any environment variables.
|
|
.PP
|
|
\f[V]<URI>\f[R] or \f[V]--file <FILE>\f[R] always needs to be the last
|
|
parameter.
|
|
.SS BANNER OPTIONS (standalone)
|
|
.PP
|
|
\f[V]--help\f[R] (or no arg) displays command line help
|
|
.PP
|
|
\f[V]-b, --banner\f[R] displays testssl.sh banner, including license,
|
|
usage conditions, version of testssl.sh, detected openssl version, its
|
|
path to it, # of ciphers of openssl, its build date and the
|
|
architecture.
|
|
.PP
|
|
\f[V]-v, --version\f[R] same as before
|
|
.PP
|
|
\f[V]-V [pattern], --local [pattern]\f[R] pretty print all local ciphers
|
|
supported by openssl version.
|
|
If a pattern is supplied it performs a match (ignore case) on any of the
|
|
strings supplied in the wide output, see below.
|
|
The pattern will be searched in the any of the columns: hexcode, cipher
|
|
suite name (OpenSSL or IANA), key exchange, encryption, bits.
|
|
It does a word pattern match for non-numbers, for number just a normal
|
|
match applies.
|
|
Numbers here are defined as [0-9,A-F].
|
|
This means (attention: catch) that the pattern CBC is matched as
|
|
non-word, but AES as word.
|
|
This option also accepts \f[V]--openssl=<path_to_openssl>\f[R].
|
|
.SS INPUT PARAMETERS
|
|
.PP
|
|
\f[V]URI\f[R] can be a hostname, an IPv4 or IPv6 address (restriction
|
|
see below) or an URL.
|
|
IPv6 addresses need to be in square brackets.
|
|
For any given parameter port 443 is assumed unless specified by
|
|
appending a colon and a port number.
|
|
The only preceding protocol specifier allowed is \f[V]https\f[R].
|
|
You need to be aware that checks for an IP address might not hit the
|
|
vhost you want.
|
|
DNS resolution (A/AAAA record) is being performed unless you have an
|
|
\f[V]/etc/hosts\f[R] entry for the hostname.
|
|
.PP
|
|
\f[V]--file <fname>\f[R] or the equivalent \f[V]-iL <fname>\f[R] are
|
|
mass testing options.
|
|
Per default it implicitly turns on \f[V]--warnings batch\f[R], unless
|
|
warnings has been set to off before.
|
|
In its first incarnation the mass testing option reads command lines
|
|
from \f[V]fname\f[R].
|
|
\f[V]fname\f[R] consists of command lines of testssl, one line per
|
|
instance.
|
|
Comments after \f[V]#\f[R] are ignored, \f[V]EOF\f[R] signals the end of
|
|
fname any subsequent lines will be ignored too.
|
|
You can also supply additional options which will be inherited to each
|
|
child, e.g.\ When invoking
|
|
\f[V]testssl.sh --wide --log --file <fname>\f[R] .
|
|
Each single line in \f[V]fname\f[R] is parsed upon execution.
|
|
If there\[cq]s a conflicting option and serial mass testing option is
|
|
being performed the check will be aborted at the time it occurs and
|
|
depending on the output option potentially leaving you with an output
|
|
file without footer.
|
|
In parallel mode the mileage varies, likely a line won\[cq]t be scanned.
|
|
.PP
|
|
Alternatively \f[V]fname\f[R] can be in \f[V]nmap\f[R]\[cq]s grep(p)able
|
|
output format (\f[V]-oG\f[R]).
|
|
Only open ports will be considered.
|
|
Multiple ports per line are allowed.
|
|
The ports can be different and will be tested by testssl.sh according to
|
|
common practice in the internet, i.e.\ if nmap shows in its output an
|
|
open port 25, automatically \f[V]-t smtp\f[R] will be added before the
|
|
URI whereas port 465 will be treated as a plain TLS/SSL port, not
|
|
requiring an STARTTLS SMTP handshake upfront.
|
|
This is done by an internal table which correlates nmap\[cq]s open port
|
|
detected to the STARTTLS/plain text decision from testssl.sh.
|
|
.PP
|
|
Nmap\[cq]s output always returns IP addresses and only if there\[cq]s a
|
|
PTR DNS record available a hostname.
|
|
As it is not checked by nmap whether the hostname matches the IP (A or
|
|
AAAA record), testssl.sh does this automatically for you.
|
|
If the A record of the hostname matches the IP address, the hostname is
|
|
used and not the IP address.
|
|
Please keep in mind that checks against an IP address might not hit the
|
|
vhost you maybe were aiming at and thus it may lead to different
|
|
results.
|
|
.PP
|
|
A typical internal conversion to testssl.sh file format from nmap\[cq]s
|
|
grep(p)able format could look like:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
10.10.12.16:443
|
|
10.10.12.16:1443
|
|
-t smtp host.example.com:25
|
|
host.example.com:443
|
|
host.example.com:631
|
|
-t ftp 10.10.12.11:21
|
|
10.10.12.11:8443
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
Please note that \f[V]fname\f[R] has to be in Unix format.
|
|
DOS carriage returns won\[cq]t be accepted.
|
|
Instead of the command line switch the environment variable FNAME will
|
|
be honored too.
|
|
.PP
|
|
\f[V]--mode <serial|parallel>\f[R].
|
|
Mass testing to be done serial (default) or parallel
|
|
(\f[V]--parallel\f[R] is shortcut for the latter, \f[V]--serial\f[R] is
|
|
the opposite option).
|
|
Per default mass testing is being run in serial mode, i.e.\ one line
|
|
after the other is processed and invoked.
|
|
The variable \f[V]MASS_TESTING_MODE\f[R] can be defined to be either
|
|
equal \f[V]serial\f[R] or \f[V]parallel\f[R].
|
|
.PP
|
|
\f[V]--warnings <batch|off>\f[R].
|
|
The warnings parameter determines how testssl.sh will deal with
|
|
situations where user input normally will be necessary.
|
|
There are two options.
|
|
\f[V]batch\f[R] doesn\[cq]t wait for a confirming keypress when a
|
|
client- or server-side problem is encountered.
|
|
As of 3.0 it just then terminates the particular scan.
|
|
This is automatically chosen for mass testing (\f[V]--file\f[R]).
|
|
\f[V]off\f[R] just skips the warning, the confirmation but continues the
|
|
scan, independent whether it makes sense or not.
|
|
Please note that there are conflicts where testssl.sh will still ask for
|
|
confirmation which are the ones which otherwise would have a drastic
|
|
impact on the results.
|
|
Almost any other decision will be made in the future as a best guess by
|
|
testssl.sh.
|
|
The same can be achieved by setting the environment variable
|
|
\f[V]WARNINGS\f[R].
|
|
.PP
|
|
\f[V]--socket-timeout <seconds>\f[R] This is useful for socket TCP
|
|
connections to a node.
|
|
If the node does not complete a TCP handshake (e.g.\ because it is down
|
|
or behind a firewall or there\[cq]s an IDS or a tarpit) testssl.sh may
|
|
usually hang for around 2 minutes or even much more.
|
|
This parameter instructs testssl.sh to wait at most \f[V]seconds\f[R]
|
|
for the handshake to complete before giving up.
|
|
This option only works if your OS has a timeout binary installed.
|
|
SOCKET_TIMEOUT is the corresponding environment variable.
|
|
This doesn\[cq]t work on Macs out of the box.
|
|
.PP
|
|
\f[V]--openssl-timeout <seconds>\f[R] This is especially useful for all
|
|
connects using openssl and practically useful for mass testing.
|
|
It avoids the openssl connect to hang for \[ti]2 minutes.
|
|
The expected parameter \f[V]seconds\f[R] instructs testssl.sh to wait
|
|
before the openssl connect will be terminated.
|
|
The option is only available if your OS has a timeout binary installed.
|
|
As there are different implementations of \f[V]timeout\f[R]: It
|
|
automatically calls the binary with the right parameters.
|
|
OPENSSL_TIMEOUT is the equivalent environment variable.
|
|
This doesn\[cq]t work on Macs out of the box.
|
|
.PP
|
|
\f[V]--basicauth <user:pass>\f[R] This can be set to provide HTTP basic
|
|
auth credentials which are used during checks for security headers.
|
|
BASICAUTH is the ENV variable you can use instead.
|
|
.PP
|
|
\f[V]--reqheader <header>\f[R] This can be used to add additional HTTP
|
|
request headers in the correct format
|
|
\f[V]Headername: headercontent\f[R].
|
|
This parameter can be called multiple times if required.
|
|
For example:
|
|
\f[V]--reqheader \[aq]Proxy-Authorization: Basic dGVzdHNzbDpydWxlcw==\[aq] --reqheader \[aq]ClientID: 0xDEADBEAF\[aq]\f[R].
|
|
REQHEADER is the corresponding environment variable.
|
|
.PP
|
|
\f[V]--mtls <path_to_client_cert>\f[R] This can be set to provide a file
|
|
containing a client certificatete and a private key (not encrypted) in
|
|
PEM format, which is used when a mutual TLS authentication is required
|
|
by the remote server.
|
|
MTLS is the equivalent environment variable.
|
|
.SS SPECIAL INVOCATIONS
|
|
.PP
|
|
\f[V]-t <protocol>, --starttls <protocol>\f[R] does a default run
|
|
against a STARTTLS enabled \f[V]protocol\f[R].
|
|
\f[V]protocol\f[R] must be one of \f[V]ftp\f[R], \f[V]smtp\f[R],
|
|
\f[V]pop3\f[R], \f[V]imap\f[R], \f[V]xmpp\f[R], \f[V]sieve\f[R],
|
|
\f[V]xmpp-server\f[R], \f[V]telnet\f[R], \f[V]ldap\f[R], \f[V]irc\f[R],
|
|
\f[V]lmtp\f[R], \f[V]nntp\f[R], \f[V]postgres\f[R], \f[V]mysql\f[R].
|
|
For the latter four you need e.g.\ the supplied OpenSSL or OpenSSL
|
|
version 1.1.1.
|
|
Please note: MongoDB doesn\[cq]t offer a STARTTLS connection, IRC
|
|
currently only works with \f[V]--ssl-native\f[R].
|
|
\f[V]irc\f[R] is WIP.
|
|
.PP
|
|
\f[V]--xmpphost <jabber_domain>\f[R] is an additional option for
|
|
STARTTLS enabled XMPP: It expects the jabber domain as a parameter.
|
|
This is only needed if the domain is different from the URI supplied.
|
|
.PP
|
|
\f[V]--mx <domain|host>\f[R] tests all MX records (STARTTLS on port 25)
|
|
from high to low priority, one after the other.
|
|
.PP
|
|
\f[V]--ip <ip>\f[R] tests either the supplied IPv4 or IPv6 address
|
|
instead of resolving host(s) in \f[V]<URI>\f[R].
|
|
IPv6 addresses need to be supplied in square brackets.
|
|
\f[V]--ip=one\f[R] means: just test the first A record DNS returns
|
|
(useful for multiple IPs).
|
|
If \f[V]-6\f[R] and \f[V]--ip=one\f[R] was supplied an AAAA record will
|
|
be picked if available.
|
|
The \f[V]--ip\f[R] option might be also useful if you want to resolve
|
|
the supplied hostname to a different IP, similar as if you would edit
|
|
\f[V]/etc/hosts\f[R] or \f[V]/c/Windows/System32/drivers/etc/hosts\f[R].
|
|
\f[V]--ip=proxy\f[R] tries a DNS resolution via proxy.
|
|
\f[V]--ip=proxy\f[R] plus \f[V]--nodns=min\f[R] is useful for situations
|
|
with no local DNS as there\[cq]ll be no DNS timeouts when trying to
|
|
resolve CAA, TXT and MX records.
|
|
.PP
|
|
\f[V]--proxy <host>:<port>\f[R] does ANY check via the specified proxy.
|
|
\f[V]--proxy=auto\f[R] inherits the proxy setting from the environment.
|
|
Any hostname supplied will be resolved to the first A record, if it does
|
|
not exist the AAAA record is used.
|
|
IPv4 and IPv6 addresses can be passed too, the latter \f[I]also\f[R]
|
|
with square bracket notation.
|
|
Please note that you need a newer OpenSSL or LibreSSL version for IPv6
|
|
proxy functionality.
|
|
In addition if you want lookups via proxy you can specify
|
|
\f[V]DNS_VIA_PROXY=true\f[R].
|
|
OCSP revocation checking (\f[V]-S --phone-out\f[R]) is not supported by
|
|
OpenSSL via proxy.
|
|
As supplying a proxy is an indicator for port 80 and 443 outgoing being
|
|
blocked in your network an OCSP revocation check won\[cq]t be performed.
|
|
However if \f[V]IGN_OCSP_PROXY=true\f[R] has been supplied it will be
|
|
tried directly.
|
|
Authentication to the proxy is not supported, also no HTTPS or SOCKS
|
|
proxy.
|
|
.PP
|
|
\f[V]-6\f[R] scans only IPv6 addresses of the target.
|
|
Besides the OpenSSL binary supplied IPv6 is known to work with vanilla
|
|
OpenSSL >= 1.1.0 and older versions >=1.0.2 in RHEL/CentOS/FC and
|
|
Gentoo.
|
|
Scans are somewhat in line with tools like curl or wget, i.e.\ if
|
|
there\[cq]s an IPv6 address of the target which can be reached, it just
|
|
uses them.
|
|
If you don\[cq]t want this behavior, you need to supply \f[V]-4.\f[R]
|
|
.PP
|
|
\f[V]-4\f[R] scans only IPv4 addresses of the target, IPv6 addresses of
|
|
the target won\[cq]t be scanned.
|
|
.PP
|
|
\f[V]--ssl-native\f[R] Instead of using a mixture of bash sockets and a
|
|
few openssl s_client connects, testssl.sh uses the latter (almost) only.
|
|
This is faster but provides less accurate results, especially for the
|
|
client simulation and for cipher support.
|
|
For all checks you will see a warning if testssl.sh cannot tell if a
|
|
particular check cannot be performed.
|
|
For some checks however you might end up getting false negatives without
|
|
a warning.
|
|
Thus it is not recommended to use.
|
|
It should only be used if you prefer speed over accuracy or you know
|
|
that your target has sufficient overlap with the protocols and cipher
|
|
provided by your openssl binary.
|
|
.PP
|
|
\f[V]--openssl <path_to_openssl>\f[R] testssl.sh tries first very hard
|
|
to find the binary supplied (where the tree of testssl.sh resides, from
|
|
the directory where testssl.sh has been started from, etc.).
|
|
If all that doesn\[cq]t work it falls back to openssl supplied from the
|
|
OS (\f[V]$PATH\f[R]).
|
|
With this option you can point testssl.sh to your binary of choice and
|
|
override any internal magic to find the openssl binary.
|
|
(Environment preset via \f[V]OPENSSL=<path_to_openssl>\f[R]).
|
|
Depending on your test parameters it could be faster to pick the OpenSSL
|
|
version which has a bigger overlap in terms of ciphers protocols with
|
|
the target.
|
|
Also, when testing a modern server, OpenSSL 3.X is faster than older
|
|
OpenSSL versions, or on MacOS 18, as opposed to the provided LibreSSL
|
|
version.
|
|
.SS TUNING OPTIONS
|
|
.PP
|
|
\f[V]--bugs\f[R] does some workarounds for buggy servers like padding
|
|
for old F5 devices.
|
|
The option is passed as \f[V]-bug\f[R] to openssl when needed, see
|
|
\f[V]s_client(1)\f[R], environment preset via
|
|
\f[V]BUGS=\[dq]-bugs\[dq]\f[R] (1x dash).
|
|
For the socket part testssl.sh has always workarounds in place to cope
|
|
with broken server implementations.
|
|
.PP
|
|
\f[V]--assuming-http\f[R] testssl.sh normally does upfront an
|
|
application protocol detection.
|
|
In cases where HTTP cannot be automatically detected you may want to use
|
|
this option.
|
|
It enforces testssl.sh not to skip HTTP specific tests (HTTP header) and
|
|
to run a browser based client simulation.
|
|
Please note that sometimes also the severity depends on the application
|
|
protocol, e.g.\ SHA1 signed certificates, the lack of any SAN matches
|
|
and some vulnerabilities will be punished harder when checking a web
|
|
server as opposed to a mail server.
|
|
.PP
|
|
\f[V]-n, --nodns <min|none>\f[R] tells testssl.sh which DNS lookups
|
|
should be performed.
|
|
\f[V]min\f[R] uses only forward DNS resolution (A and AAAA record or MX
|
|
record) and skips CAA lookups and PTR records from the IP address back
|
|
to a DNS name.
|
|
\f[V]none\f[R] performs no DNS lookups at all.
|
|
For the latter you either have to supply the IP address as a target, to
|
|
use \f[V]--ip\f[R] or have the IP address in \f[V]/etc/hosts\f[R].
|
|
The use of the switch is only useful if you either can\[cq]t or are not
|
|
willing to perform DNS lookups.
|
|
The latter can apply e.g.\ to some pentests.
|
|
In general this option could e.g.\ help you to avoid timeouts by DNS
|
|
lookups.
|
|
\f[V]NODNS\f[R] is the environment variable for this.
|
|
\f[V]--nodns=min\f[R] plus \f[V]--ip=proxy\f[R] is useful for situations
|
|
with no local DNS as there\[cq]ll be no DNS timeouts when trying to
|
|
resolve CAA, TXT and MX records.
|
|
.PP
|
|
\f[V]--sneaky\f[R] For HTTP header checks testssl.sh uses normally the
|
|
server friendly HTTP user agent \f[V]TLS tester from ${URL}\f[R].
|
|
With this option your traces are less verbose and a Firefox user agent
|
|
is being used.
|
|
Be aware that it doesn\[cq]t hide your activities.
|
|
That is just not possible (environment preset via
|
|
\f[V]SNEAKY=true\f[R]).
|
|
.PP
|
|
\f[V]--user-agent <user agent>\f[R] tells testssl.sh to use the supplied
|
|
HTTP user agent instead of the standard user agent
|
|
\f[V]TLS tester from ${URL}\f[R].
|
|
.PP
|
|
\f[V]--ids-friendly\f[R] is a switch which may help to get a scan
|
|
finished which otherwise would be blocked by a server side IDS.
|
|
This switch skips tests for the following vulnerabilities: Heartbleed,
|
|
CCS Injection, Ticketbleed and ROBOT.
|
|
The environment variable OFFENSIVE set to false will achieve the same
|
|
result.
|
|
Please be advised that as an alternative or as a general approach you
|
|
can try to apply evasion techniques by changing the variables USLEEP_SND
|
|
and / or USLEEP_REC and maybe MAX_WAITSOCK.
|
|
.PP
|
|
\f[V]--phone-out\f[R] Checking for revoked certificates via CRL and OCSP
|
|
is not done per default.
|
|
This switch instructs testssl.sh to query external \[en] in a sense of
|
|
the current run \[en] URIs.
|
|
By using this switch you acknowledge that the check might have privacy
|
|
issues, a download of several megabytes (CRL file) may happen and there
|
|
may be network connectivity problems while contacting the endpoint which
|
|
testssl.sh doesn\[cq]t handle.
|
|
PHONE_OUT is the environment variable for this which needs to be set to
|
|
true if you want this.
|
|
.PP
|
|
\f[V]--add-ca <CAfile>\f[R] enables you to add your own CA(s) in PEM
|
|
format for trust chain checks.
|
|
\f[V]CAfile\f[R] can be a directory containing files with a .pem
|
|
extension, a single file or multiple files as a comma separated list of
|
|
root CAs.
|
|
Internally they will be added during runtime to all CA stores.
|
|
This is (only) useful for internal hosts whose certificates are issued
|
|
by internal CAs.
|
|
Alternatively ADDTL_CA_FILES is the environment variable for this.
|
|
.SS SINGLE CHECK OPTIONS
|
|
.PP
|
|
Any single check switch supplied as an argument prevents testssl.sh from
|
|
doing a default run.
|
|
It just takes this and if supplied other options and runs them - in the
|
|
order they would also appear in the default run.
|
|
.PP
|
|
\f[V]-e, --each-cipher\f[R] checks each of the (currently configured)
|
|
370 ciphers via openssl + sockets remotely on the server and reports
|
|
back the result in wide mode.
|
|
If you want to display each cipher tested you need to add
|
|
\f[V]--show-each\f[R].
|
|
Per default it lists the following parameters: \f[V]hexcode\f[R],
|
|
\f[V]OpenSSL cipher suite name\f[R], \f[V]key exchange\f[R],
|
|
\f[V]encryption bits\f[R], \f[V]IANA/RFC cipher suite name\f[R].
|
|
Please note the \f[V]--mapping\f[R] parameter changes what cipher suite
|
|
names you will see here and at which position.
|
|
Also please note that the \f[B]bit\f[R] length for the encryption is
|
|
shown and not the \f[B]security\f[R] length, albeit it\[cq]ll be sorted
|
|
by the latter.
|
|
For 3DES due to the Meet-in-the-Middle problem the bit size of 168 bits
|
|
is equivalent to the security size of 112 bits.
|
|
.PP
|
|
\f[V]-E, --cipher-per-proto\f[R] is similar to
|
|
\f[V]-e, --each-cipher\f[R].
|
|
It checks each of the possible ciphers, here: per protocol.
|
|
If you want to display each cipher tested you need to add
|
|
\f[V]--show-each\f[R].
|
|
The output is sorted by security strength, it lists the encryption bits
|
|
though.
|
|
.PP
|
|
\f[V]-s, --std, --categories\f[R] tests certain lists of cipher suites /
|
|
cipher categories by strength.
|
|
(\f[V]--standard\f[R] is deprecated.)
|
|
Those lists are (\f[V]openssl ciphers $LIST\f[R], $LIST from below:)
|
|
.IP \[bu] 2
|
|
\f[V]NULL encryption ciphers\f[R]: `NULL:eNULL'
|
|
.IP \[bu] 2
|
|
\f[V]Anonymous NULL ciphers\f[R]: `aNULL:ADH'
|
|
.IP \[bu] 2
|
|
\f[V]Export ciphers\f[R] (w/o the preceding ones): `EXPORT:!ADH:!NULL'
|
|
.IP \[bu] 2
|
|
\f[V]LOW\f[R] (64 Bit + DES ciphers, without EXPORT ciphers):
|
|
`LOW:DES:RC2:RC4:MD5:!ADH:!EXP:!NULL:!eNULL:!AECDH'
|
|
.IP \[bu] 2
|
|
\f[V]3DES + IDEA ciphers\f[R]: `3DES:IDEA:!aNULL:!ADH:!MD5'
|
|
.IP \[bu] 2
|
|
\f[V]Obsoleted CBC ciphers\f[R]:
|
|
`HIGH:MEDIUM:AES:CAMELLIA:ARIA:!IDEA:!CHACHA20:!3DES:!RC2:!RC4:!AESCCM8:!AESCCM:!AESGCM:!ARIAGCM:!aNULL:!MD5'
|
|
.IP \[bu] 2
|
|
\f[V]Strong ciphers with no FS\f[R] (AEAD):
|
|
`AESGCM:CHACHA20:CamelliaGCM:AESCCM:ARIAGCM:!kEECDH:!kEDH:!kDHE:!kDHEPSK:!kECDHEPSK:!aNULL'
|
|
.IP \[bu] 2
|
|
\f[V]Forward Secrecy strong ciphers\f[R] (AEAD):
|
|
`AESGCM:CHACHA20:CamelliaGCM:AESCCM:ARIAGCM:!kPSK:!kRSAPSK:!kRSA:!kDH:!kECDH:!aNULL'
|
|
.PP
|
|
\f[V]-f, --fs, --nsa, --forward-secrecy\f[R] Checks robust forward
|
|
secrecy key exchange.
|
|
\[lq]Robust\[rq] means that ciphers having intrinsic severe weaknesses
|
|
like Null Authentication or Encryption, 3DES and RC4 won\[cq]t be
|
|
considered here.
|
|
There shouldn\[cq]t be the wrong impression that a secure key exchange
|
|
has been taking place and everything is fine when in reality the
|
|
encryption sucks.
|
|
Also this section lists the available elliptical curves and Diffie
|
|
Hellman groups, as well as FFDHE groups (TLS 1.2 and TLS 1.3).
|
|
.PP
|
|
\f[V]-p, --protocols\f[R] checks TLS/SSL protocols SSLv2, SSLv3, TLS 1.0
|
|
through TLS 1.3.
|
|
And for HTTP also QUIC (HTTP/3), SPDY (NPN) and ALPN (HTTP/2).
|
|
For TLS 1.3 the final version and several drafts (from 18 on) are
|
|
tested.
|
|
QUIC needs OpenSSL >= 3.2 which can be automatically picked up when in
|
|
\f[V]/usr/bin/openssl\f[R] (or when defined environment variable
|
|
OPENSSL2).
|
|
If a TLS-1.3-only host is encountered and the openssl-bad version is
|
|
used testssl.sh will e.g.\ for HTTP header checks switch to
|
|
\f[V]/usr/bin/openssl\f[R] (or when defined via ENV to OPENSSL2).
|
|
Also this will be tried for the QUIC check.
|
|
.PP
|
|
\f[V]-P, --server-preference, --preference\f[R] displays the servers
|
|
preferences: cipher order, with used openssl client: negotiated protocol
|
|
and cipher.
|
|
If there\[cq]s a cipher order enforced by the server it displays it for
|
|
each protocol (openssl+sockets).
|
|
If there\[cq]s not, it displays instead which ciphers from the server
|
|
were picked with each protocol.
|
|
.PP
|
|
\f[V]-S, --server_defaults\f[R] displays information from the server
|
|
hello(s):
|
|
.IP \[bu] 2
|
|
Available TLS extensions,
|
|
.IP \[bu] 2
|
|
TLS ticket + session ID information/capabilities,
|
|
.IP \[bu] 2
|
|
session resumption capabilities,
|
|
.IP \[bu] 2
|
|
Time skew relative to localhost (most server implementations return
|
|
random values).
|
|
.IP \[bu] 2
|
|
Several certificate information
|
|
.RS 2
|
|
.IP \[bu] 2
|
|
signature algorithm,
|
|
.IP \[bu] 2
|
|
key size,
|
|
.IP \[bu] 2
|
|
key usage and extended key usage,
|
|
.IP \[bu] 2
|
|
fingerprints and serial
|
|
.IP \[bu] 2
|
|
Common Name (CN), Subject Alternative Name (SAN), Issuer,
|
|
.IP \[bu] 2
|
|
Trust via hostname + chain of trust against supplied certificates
|
|
.IP \[bu] 2
|
|
EV certificate detection
|
|
.IP \[bu] 2
|
|
experimental \[lq]eTLS\[rq] detection
|
|
.IP \[bu] 2
|
|
validity: start + end time, how many days to go (warning for certificate
|
|
lifetime >=5 years)
|
|
.IP \[bu] 2
|
|
revocation info (CRL, OCSP, OCSP stapling + must staple).
|
|
When \f[V]--phone-out\f[R] supplied it checks against the certificate
|
|
issuer whether the host certificate has been revoked (plain OCSP, CRL).
|
|
.IP \[bu] 2
|
|
displaying DNS Certification Authority Authorization resource record
|
|
.IP \[bu] 2
|
|
Certificate Transparency info (if provided by server).
|
|
.RE
|
|
.PP
|
|
For the trust chain check 5 certificate stores are provided.
|
|
If the test against one of the trust stores failed, the one is being
|
|
identified and the reason for the failure is displayed - in addition the
|
|
ones which succeeded are displayed too.
|
|
You can configure your own CA via ADDTL_CA_FILES, see section
|
|
\f[V]FILES\f[R] below.
|
|
If the server provides no matching record in Subject Alternative Name
|
|
(SAN) but in Common Name (CN), it will be indicated as this is
|
|
deprecated.
|
|
Also for multiple server certificates are being checked for as well as
|
|
for the certificate reply to a non-SNI (Server Name Indication) client
|
|
hello to the IP address.
|
|
Regarding the TLS clock skew: it displays the time difference to the
|
|
client.
|
|
Only a few TLS stacks nowadays still support this and return the local
|
|
clock \f[V]gmt_unix_time\f[R], e.g.\ IIS, openssl < 1.0.1f.
|
|
In addition to the HTTP date you could e.g.\ derive that there are
|
|
different hosts where your TLS and your HTTP request ended \[en] if the
|
|
time deltas differ significantly.
|
|
.PP
|
|
\f[V]-x <pattern>, --single-cipher <pattern>\f[R] tests matched
|
|
\f[V]pattern\f[R] of ciphers against a server.
|
|
Patterns are similar to \f[V]-V pattern , --local pattern\f[R], see
|
|
above about matching.
|
|
.PP
|
|
\f[V]-h, --header, --headers\f[R] if the service is HTTP (either by
|
|
detection or by enforcing via \f[V]--assume-http\f[R].
|
|
It tests several HTTP headers like
|
|
.IP \[bu] 2
|
|
HTTP Strict Transport Security (HSTS)
|
|
.IP \[bu] 2
|
|
HTTP Public Key Pinning (HPKP)
|
|
.IP \[bu] 2
|
|
Server banner
|
|
.IP \[bu] 2
|
|
HTTP date+time
|
|
.IP \[bu] 2
|
|
Server banner like Linux or other Unix vendor headers
|
|
.IP \[bu] 2
|
|
Application banner (PHP, RoR, OWA, SharePoint, Wordpress, etc)
|
|
.IP \[bu] 2
|
|
Reverse proxy headers
|
|
.IP \[bu] 2
|
|
Web server modules
|
|
.IP \[bu] 2
|
|
IPv4 address in header
|
|
.IP \[bu] 2
|
|
Cookie (including Secure/HTTPOnly flags)
|
|
.IP \[bu] 2
|
|
Decodes BIG IP F5 non-encrypted cookies
|
|
.IP \[bu] 2
|
|
Security headers (X-Frame-Options, X-XSS-Protection, Expect-CT,\&...
|
|
, CSP headers).
|
|
Nonsense is not yet detected here.
|
|
.PP
|
|
\f[V]-c, --client-simulation\f[R] This simulates a handshake with a
|
|
number of standard clients so that you can figure out which client
|
|
cannot or can connect to your site.
|
|
For the latter case the protocol, cipher and curve is displayed, also if
|
|
there\[cq]s Forward Secrecy.
|
|
testssl.sh uses a handselected set of clients which are retrieved by the
|
|
SSLlabs API.
|
|
The output is aligned in columns when combined with the \f[V]--wide\f[R]
|
|
option.
|
|
If you want the full nine yards of clients displayed use the environment
|
|
variable ALL_CLIENTS.
|
|
.PP
|
|
\f[V]-g, --grease\f[R] checks several server implementation bugs like
|
|
tolerance to size limitations and GREASE, see RFC 8701.
|
|
This check doesn\[cq]t run per default.
|
|
.SS VULNERABILITIES
|
|
.PP
|
|
\f[V]-U, --vulnerable, --vulnerabilities\f[R] Just tests all (of the
|
|
following) vulnerabilities.
|
|
The environment variable \f[V]VULN_THRESHLD\f[R] determines after which
|
|
value a separate headline for each vulnerability is being displayed.
|
|
Default is \f[V]1\f[R] which means if you check for two vulnerabilities,
|
|
only the general headline for vulnerabilities section is displayed \[en]
|
|
in addition to the vulnerability and the result.
|
|
Otherwise each vulnerability or vulnerability section gets its own
|
|
headline in addition to the output of the name of the vulnerability and
|
|
test result.
|
|
A vulnerability section is comprised of more than one check, e.g.\ the
|
|
renegotiation vulnerability check has two checks, so has Logjam.
|
|
.PP
|
|
\f[V]-H, --heartbleed\f[R] Checks for Heartbleed, a memory leakage in
|
|
openssl.
|
|
Unless the server side doesn\[cq]t support the heartbeat extension it is
|
|
likely that this check runs into a timeout.
|
|
The seconds to wait for a reply can be adjusted with
|
|
\f[V]HEARTBLEED_MAX_WAITSOCK\f[R].
|
|
8 is the default.
|
|
.PP
|
|
\f[V]-I, --ccs, --ccs-injection\f[R] Checks for CCS Injection which is
|
|
an openssl vulnerability.
|
|
Sometimes also here the check needs to wait for a reply.
|
|
The predefined timeout of 5 seconds can be changed with the environment
|
|
variable \f[V]CCS_MAX_WAITSOCK\f[R].
|
|
.PP
|
|
\f[V]-T, --ticketbleed\f[R] Checks for Ticketbleed memory leakage in
|
|
BigIP loadbalancers.
|
|
.PP
|
|
\f[V]--OP, --opossum\f[R] Checks for HTTP to HTTPS upgrade vulnerability
|
|
named Opossum.
|
|
.PP
|
|
\f[V]--BB, --robot\f[R] Checks for vulnerability to ROBOT / (\f[I]Return
|
|
Of Bleichenbacher\[cq]s Oracle Threat\f[R]) attack.
|
|
.PP
|
|
\f[V]--SI, --starttls-injection\f[R] Checks for STARTTLS injection
|
|
vulnerabilities (SMTP, IMAP, POP3 only).
|
|
\f[V]socat\f[R] and OpenSSL >=1.1.0 is needed.
|
|
.PP
|
|
\f[V]-R, --renegotiation\f[R] Tests renegotiation vulnerabilities.
|
|
Currently there\[cq]s a check for \f[I]Secure Renegotiation\f[R] and for
|
|
\f[I]Secure Client-Initiated Renegotiation\f[R].
|
|
Please be aware that vulnerable servers to the latter can likely be
|
|
DoSed very easily (HTTP).
|
|
A check for \f[I]Insecure Client-Initiated Renegotiation\f[R] is not yet
|
|
implemented.
|
|
.PP
|
|
\f[V]-C, --compression, --crime\f[R] Checks for CRIME (\f[I]Compression
|
|
Ratio Info-leak Made Easy\f[R]) vulnerability in TLS.
|
|
CRIME in SPDY is not yet being checked for.
|
|
.PP
|
|
\f[V]-B, --breach\f[R] Checks for BREACH (\f[I]Browser Reconnaissance
|
|
and Exfiltration via Adaptive Compression of Hypertext\f[R])
|
|
vulnerability.
|
|
As for this vulnerability HTTP level compression is a prerequisite
|
|
it\[cq]ll be not tested if HTTP cannot be detected or the detection is
|
|
not enforced via \f[V]--assume-http\f[R].
|
|
Please note that only the URL supplied (normally \[lq]/\[rq] ) is being
|
|
tested.
|
|
.PP
|
|
\f[V]-O, --poodle\f[R] Tests for SSL POODLE (\f[I]Padding Oracle On
|
|
Downgraded Legacy Encryption\f[R]) vulnerability.
|
|
It basically checks for the existence of CBC ciphers in SSLv3.
|
|
.PP
|
|
\f[V]-Z, --tls-fallback\f[R] Checks TLS_FALLBACK_SCSV mitigation.
|
|
TLS_FALLBACK_SCSV is basically a ciphersuite appended to the Client
|
|
Hello trying to prevent protocol downgrade attacks by a Man in the
|
|
Middle.
|
|
.PP
|
|
\f[V]-W, --sweet32\f[R] Checks for vulnerability to SWEET32 by testing
|
|
64 bit block ciphers (3DES, RC2 and IDEA).
|
|
.PP
|
|
\f[V]-F, --freak\f[R] Checks for FREAK vulnerability (\f[I]Factoring RSA
|
|
Export Keys\f[R]) by testing for EXPORT RSA ciphers
|
|
.PP
|
|
\f[V]-D, --drown\f[R] Checks for DROWN vulnerability (\f[I]Decrypting
|
|
RSA with Obsolete and Weakened eNcryption\f[R]) by checking whether the
|
|
SSL 2 protocol is available at the target.
|
|
Please note that if you use the same RSA certificate elsewhere you might
|
|
be vulnerable too.
|
|
testssl.sh doesn\[cq]t check for this but provides a helpful link \[at]
|
|
censys.io which provides this service.
|
|
.PP
|
|
\f[V]-J, --logjam\f[R] Checks for LOGJAM vulnerability by checking for
|
|
DH EXPORT ciphers.
|
|
It also checks for \[lq]common primes\[rq] which are preconfigured DH
|
|
keys.
|
|
DH keys =< 1024 Bit will be penalized.
|
|
Also FFDHE groups (TLS 1.2) will be displayed here.
|
|
.PP
|
|
\f[V]-A, --beast\f[R] Checks BEAST vulnerabilities in SSL 3 and TLS 1.0
|
|
by testing the usage of CBC ciphers.
|
|
.PP
|
|
\f[V]-L, --lucky13\f[R] Checks for LUCKY13 vulnerability.
|
|
It checks for the presence of CBC ciphers in TLS versions 1.0 - 1.2.
|
|
.PP
|
|
\f[V]-WS, --winshock\f[R] Checks for Winshock vulnerability.
|
|
It tests for the absence of a lot of ciphers, some TLS extensions and ec
|
|
curves which were introduced later in Windows.
|
|
In the end the server banner is being looked at.
|
|
.PP
|
|
\f[V]--rc4, --appelbaum\f[R] Checks which RC4 stream ciphers are being
|
|
offered.
|
|
.SS OUTPUT OPTIONS
|
|
.PP
|
|
\f[V]-q, --quiet\f[R] Normally testssl.sh displays a banner on stdout
|
|
with several version information, usage rights and a warning.
|
|
This option suppresses it.
|
|
Please note that by choosing this option you acknowledge usage terms and
|
|
the warning normally appearing in the banner.
|
|
.PP
|
|
\f[V]--wide\f[R] Except the \[lq]each cipher output\[rq] all tests
|
|
displays the single cipher name (scheme see below).
|
|
This option enables testssl.sh to display also for the following
|
|
sections the same output as for testing each ciphers: BEAST, FS, RC4.
|
|
The client simulation has also a wide mode.
|
|
The difference here is restricted to a column aligned output and a
|
|
proper headline.
|
|
The environment variable \f[V]WIDE\f[R] can be used instead.
|
|
.PP
|
|
\f[V]--mapping <openssl|iana|no-openssl|no-iana>\f[R]
|
|
.IP \[bu] 2
|
|
\f[V]openssl\f[R]: use the OpenSSL cipher suite name as the primary name
|
|
cipher suite name form (default),
|
|
.IP \[bu] 2
|
|
\f[V]iana\f[R]: use the IANA cipher suite name as the primary name
|
|
cipher suite name form.
|
|
.IP \[bu] 2
|
|
\f[V]no-openssl\f[R]: don\[cq]t display the OpenSSL cipher suite name,
|
|
display IANA names only.
|
|
.IP \[bu] 2
|
|
\f[V]no-iana\f[R]: don\[cq]t display the IANA cipher suite name, display
|
|
OpenSSL names only.
|
|
.PP
|
|
Please note that in testssl.sh 3.0 you can still use \f[V]rfc\f[R]
|
|
instead of \f[V]iana\f[R] and \f[V]no-rfc\f[R] instead of
|
|
\f[V]no-iana\f[R] but it\[cq]ll disappear after 3.0.
|
|
.PP
|
|
\f[V]--show-each\f[R] This is an option for all wide modes only: it
|
|
displays all ciphers tested \[en] not only succeeded ones.
|
|
\f[V]SHOW_EACH_C\f[R] is your friend if you prefer to set this via the
|
|
shell environment.
|
|
.PP
|
|
\f[V]--color <0|1|2|3>\f[R] determines the use of colors on the screen
|
|
and in the log file: \f[V]2\f[R] is the default and makes use of ANSI
|
|
and termcap escape codes on your terminal.
|
|
\f[V]1\f[R] just uses non-colored mark-up like bold, italics, underline,
|
|
reverse.
|
|
\f[V]0\f[R] means no mark-up at all = no escape codes.
|
|
This is also what you want when you want a log file without any escape
|
|
codes.
|
|
\f[V]3\f[R] will color ciphers and EC according to an internal (not yet
|
|
perfect) rating.
|
|
Setting the environment variable \f[V]COLOR\f[R] to the value achieves
|
|
the same result.
|
|
Please not that OpenBSD and early FreeBSD do not support italics.
|
|
.PP
|
|
\f[V]--colorblind\f[R] Swaps green and blue colors in the output, so
|
|
that this percentage of folks (up to 8% of males, see
|
|
https://en.wikipedia.org/wiki/Color_blindness) can distinguish those
|
|
findings better.
|
|
\f[V]COLORBLIND\f[R] is the according variable if you want to set this
|
|
in the environment.
|
|
.PP
|
|
\f[V]--debug <0-6>\f[R] This gives you additional output on the screen
|
|
(2-6), only useful for debugging.
|
|
\f[V]DEBUG\f[R] is the according environment variable which you can use.
|
|
There are six levels (0 is the default, thus it has no effect):
|
|
.IP "1." 3
|
|
screen output normal but leaves useful debug output in
|
|
\f[B]/tmp/testssl.XXXXXX/\f[R] .
|
|
The info about the exact directory is included in the screen output in
|
|
the end of the run.
|
|
.IP "2." 3
|
|
lists more what\[cq]s going on, status (high level) and connection
|
|
errors, a few general debug output
|
|
.IP "3." 3
|
|
even slightly more info: hexdumps + other info
|
|
.IP "4." 3
|
|
display bytes sent via sockets
|
|
.IP "5." 3
|
|
display bytes received via sockets
|
|
.IP "6." 3
|
|
whole 9 yards
|
|
.PP
|
|
\f[V]--disable-rating\f[R] disables rating.
|
|
Rating automatically gets disabled, to not give a wrong or misleading
|
|
grade, when not all required functions are executed (e.g when checking
|
|
for a single vulnerabilities).
|
|
.SS FILE OUTPUT OPTIONS
|
|
.PP
|
|
\f[V]--log, --logging\f[R] Logs stdout also to
|
|
\f[V]${NODE}-p${port}${YYYYMMDD-HHMM}.log\f[R] in current working
|
|
directory of the shell.
|
|
Depending on the color output option (see above) the output file will
|
|
contain color and other markup escape codes, unless you specify
|
|
\f[V]--color 0\f[R] too.
|
|
\f[V]cat\f[R] and \[en] if properly configured \f[V]less\f[R] \[en] will
|
|
show the output properly formatted on your terminal.
|
|
The output shows a banner with the almost the same information as on the
|
|
screen.
|
|
In addition it shows the command line of the testssl.sh instance.
|
|
Please note that the resulting log file is formatted according to the
|
|
width of your screen while running testssl.sh.
|
|
You can override the width with the environment variable TERM_WIDTH.
|
|
.PP
|
|
\f[V]--logfile <logfile>\f[R] or \f[V]-oL <logfile>\f[R] Instead of the
|
|
previous option you may want to use this one if you want to log into a
|
|
directory or if you rather want to specify the log file name yourself.
|
|
If \f[V]logfile\f[R] is a directory the output will put into
|
|
\f[V]logfile/${NODE}-p${port}${YYYYMMDD-HHMM}.log\f[R].
|
|
If \f[V]logfile\f[R] is a file it will use that file name, an absolute
|
|
path is also permitted here.
|
|
LOGFILE is the variable you need to set if you prefer to work
|
|
environment variables instead.
|
|
Please note that the resulting log file is formatted according to the
|
|
width of your screen while running testssl.sh.
|
|
You can override the width with the environment variable TERM_WIDTH.
|
|
.PP
|
|
\f[V]--json\f[R] Logs additionally to JSON file
|
|
\f[V]${NODE}-p${port}${YYYYMMDD-HHMM}.json\f[R] in the current working
|
|
directory of the shell.
|
|
The resulting JSON file is opposed to \f[V]--json-pretty\f[R] flat \[en]
|
|
which means each section is self contained and has an identifier for
|
|
each single check, the hostname/IP address, the port, severity and the
|
|
finding.
|
|
For vulnerabilities it may contain a CVE and CWE entry too.
|
|
The output doesn\[cq]t contain a banner or a footer.
|
|
.PP
|
|
\f[V]--jsonfile <jsonfile>\f[R] or \f[V]-oj <jsonfile>\f[R] Instead of
|
|
the previous option you may want to use this one if you want to log the
|
|
JSON out put into a directory or if you rather want to specify the log
|
|
file name yourself.
|
|
If \f[V]jsonfile\f[R] is a directory the output will put into
|
|
\f[V]logfile/${NODE}-p${port}${YYYYMMDD-HHMM}.json\f[R].
|
|
If \f[V]jsonfile\f[R] is a file it will use that file name, an absolute
|
|
path is also permitted here.
|
|
.PP
|
|
\f[V]--json-pretty\f[R] Logs additionally to JSON file
|
|
\f[V]${NODE}-p${port}${YYYYMMDD-HHMM}.json\f[R] in the current working
|
|
directory of the shell.
|
|
The resulting JSON file is opposed to \f[V]--json\f[R] non-flat \[en]
|
|
which means it is structured.
|
|
The structure contains a header similar to the banner on the screen,
|
|
including the command line, scan host, openssl binary used, testssl
|
|
version and epoch of the start time.
|
|
Then for every test section of testssl.sh it contains a separate JSON
|
|
object/section.
|
|
Each finding has a key/value pair identifier with the identifier for
|
|
each single check, the severity and the finding.
|
|
For vulnerabilities it may contain a CVE and CWE entry too.
|
|
The footer lists the scan time in seconds.
|
|
.PP
|
|
\f[V]--jsonfile-pretty <jsonfile>\f[R] or \f[V]-oJ <jsonfile>\f[R]
|
|
Similar to the aforementioned \f[V]--jsonfile\f[R] or
|
|
\f[V]--logfile\f[R] it logs the output in pretty JSON format (see
|
|
\f[V]--json-pretty\f[R]) into a file or a directory.
|
|
For further explanation see \f[V]--jsonfile\f[R] or \f[V]--logfile\f[R].
|
|
.PP
|
|
\f[V]--csv\f[R] Logs additionally to a CSV file
|
|
\f[V]${NODE}-p${port}${YYYYMMDD-HHMM}.csv\f[R] in the current working
|
|
directory of the shell.
|
|
The output contains a header with the keys, the values are the same as
|
|
in the flat JSON format (identifier for each single check, the
|
|
hostname/IP address, the port, severity, the finding and for
|
|
vulnerabilities a CVE and CWE number).
|
|
.PP
|
|
\f[V]--csvfile <csvfile>\f[R] or \f[V]-oC <csvfile>\f[R] Similar to the
|
|
aforementioned \f[V]--jsonfile\f[R] or \f[V]--logfile\f[R] it logs the
|
|
output in CSV format (see \f[V]--cvs\f[R]) additionally into a file or a
|
|
directory.
|
|
For further explanation see \f[V]--jsonfile\f[R] or \f[V]--logfile\f[R].
|
|
.PP
|
|
\f[V]--html\f[R] Logs additionally to an HTML file
|
|
\f[V]${NODE}-p${port}${YYYYMMDD-HHMM}.html\f[R] in the current working
|
|
directory of the shell.
|
|
It contains a 1:1 output of the console.
|
|
In former versions there was a non-native option to use \[lq]aha\[rq]
|
|
(Ansi HTML Adapter: github.com/theZiz/aha) like
|
|
\f[V]testssl.sh [options] <URI> | aha >output.html\f[R].
|
|
This is not necessary anymore.
|
|
.PP
|
|
\f[V]--htmlfile <htmlfile>\f[R] or \f[V]-oH <htmlfile>\f[R] Similar to
|
|
the aforementioned \f[V]--jsonfile\f[R] or \f[V]--logfile\f[R] it logs
|
|
the output in HTML format (see \f[V]--html\f[R]) additionally into a
|
|
file or a directory.
|
|
For further explanation see \f[V]--jsonfile\f[R] or \f[V]--logfile\f[R].
|
|
.PP
|
|
\f[V]-oA <filename>\f[R] / \f[V]--outFile <filename>\f[R] Similar to
|
|
nmap it does a file output to all available file formats: LOG, JSON
|
|
pretty, CSV, HTML.
|
|
If the filename supplied is equal \f[V]auto\f[R] the filename is
|
|
automatically generated using
|
|
`\f[I]N\f[R]\f[I]O\f[R]\f[I]D\f[R]\f[I]E\f[R]\[u2005]\[mi]\[u2005]\f[I]p\f[R]{port}\f[I]Y\f[R]\f[I]Y\f[R]\f[I]Y\f[R]\f[I]Y\f[R]\f[I]M\f[R]\f[I]M\f[R]\f[I]D\f[R]\f[I]D\f[R]\[u2005]\[mi]\[u2005]\f[I]H\f[R]\f[I]H\f[R]\f[I]M\f[R]\f[I]M\f[R].{EXT}'
|
|
with the according extension.
|
|
If a directory is provided all output files will put into
|
|
\f[V]<filename>/${NODE}-p${port}${YYYYMMDD-HHMM}.{log,json,csv,html}\f[R].
|
|
.PP
|
|
\f[V]-oa <filename>\f[R] / \f[V]--outfile <filename>\f[R] Does the same
|
|
as the previous option but uses flat JSON instead.
|
|
.PP
|
|
\f[V]--hints\f[R] This option is not in use yet.
|
|
This option is meant to give hints how to fix a finding or at least a
|
|
help to improve something.
|
|
GIVE_HINTS is the environment variable for this.
|
|
.PP
|
|
\f[V]--severity <severity>\f[R] For CSV and both JSON outputs this will
|
|
only add findings to the output file if a severity is equal or higher
|
|
than the \f[V]severity\f[R] value specified.
|
|
Allowed are \f[V]<LOW|MEDIUM|HIGH|CRITICAL>\f[R].
|
|
WARN is another level which translates to a client-side scanning error
|
|
or problem.
|
|
Thus you will always see them in a file if they occur.
|
|
.PP
|
|
\f[V]--append\f[R] Normally, if an output file already exists and it has
|
|
a file size greater zero, testssl.sh will prompt you to manually remove
|
|
the file and exit with an error.
|
|
\f[V]--append\f[R] however will append to this file, without a header.
|
|
The environment variable APPEND does the same.
|
|
Be careful using this switch/variable.
|
|
A complementary option which overwrites an existing file doesn\[cq]t
|
|
exist per design.
|
|
.PP
|
|
\f[V]--overwrite\f[R] Normally, if an output file already exists and it
|
|
has a file size greater zero, testssl.sh will not allow you to overwrite
|
|
this file.
|
|
This option will do that \f[B]without any warning\f[R].
|
|
The environment variable OVERWRITE does the same.
|
|
Be careful, you have been warned!
|
|
.PP
|
|
\f[V]--outprefix <fname_prefix>\f[R] Prepend output filename prefix
|
|
before \f[V]${NODE}-\f[R].
|
|
You can use as well the environment variable FNAME_PREFIX.
|
|
Using this any output files will be named
|
|
\f[V]<fname_prefix>-${NODE}-p${port}${YYYYMMDD-HHMM}.<format>\f[R] when
|
|
no file name of the respective output option was specified.
|
|
If you do not like the separator `-' you can as well supply a
|
|
\f[V]<fname_prefix>\f[R] ending in `.', \[cq]_\[cq] or `,'.
|
|
In this case or if you already supplied `-' no additional `-' will be
|
|
appended to \f[V]<fname_prefix>\f[R].
|
|
.PP
|
|
A few file output options can also be preset via environment variables.
|
|
.SS COLOR RATINGS
|
|
.PP
|
|
Testssl.sh makes use of (the eight) standard terminal colors.
|
|
The color scheme is as follows:
|
|
.IP \[bu] 2
|
|
light red: a critical finding
|
|
.IP \[bu] 2
|
|
red: a high finding
|
|
.IP \[bu] 2
|
|
brown: a medium finding
|
|
.IP \[bu] 2
|
|
yellow: a low finding
|
|
.IP \[bu] 2
|
|
green (blue if COLORBLIND is set): something which is either in general
|
|
a good thing or a negative result of a check which otherwise results in
|
|
a high finding
|
|
.IP \[bu] 2
|
|
light green (light blue if COLORBLIND is set) : something which is
|
|
either in general a very good thing or a negative result of a check
|
|
which otherwise results in a critical finding
|
|
.IP \[bu] 2
|
|
no color at places where also a finding can be expected: a finding on an
|
|
info level
|
|
.IP \[bu] 2
|
|
cyan: currently only used for \f[V]--show-each\f[R] or an additional
|
|
hint
|
|
.IP \[bu] 2
|
|
magenta: signals a warning condition, e.g.\ either a local lack of
|
|
capabilities on the client side or another problem
|
|
.IP \[bu] 2
|
|
light magenta: a fatal error which either requires strict consent from
|
|
the user to continue or a condition which leaves no other choice for
|
|
testssl.sh to quit
|
|
.PP
|
|
What is labeled as \[lq]light\[rq] above appears as such on the screen
|
|
but is technically speaking \[lq]bold\[rq].
|
|
Besides \f[V]--color=3\f[R] will color ciphers according to an internal
|
|
and rough rating.
|
|
.PP
|
|
Markup (without any color) is used in the following manner:
|
|
.IP \[bu] 2
|
|
bold: for the name of the test
|
|
.IP \[bu] 2
|
|
underline + bold: for the headline of each test section
|
|
.IP \[bu] 2
|
|
underline: for a sub-headline
|
|
.IP \[bu] 2
|
|
italics: for strings just reflecting a value read from the server
|
|
.SS TUNING via ENV variables and more options
|
|
.PP
|
|
Except the environment variables mentioned above which can replace
|
|
command line options here a some which cannot be set otherwise.
|
|
Variables used for tuning are preset with reasonable values.
|
|
\f[I]There should be no reason to change them\f[R] unless you use
|
|
testssl.sh under special conditions.
|
|
.IP \[bu] 2
|
|
TERM_WIDTH is a variable which overrides the auto-determined terminal
|
|
width size.
|
|
Setting this variable normally only makes sense if you log the output to
|
|
a file using the \f[V]--log\f[R], \f[V]--logfile\f[R] or \f[V]-oL\f[R]
|
|
option.
|
|
.IP \[bu] 2
|
|
DEBUG_ALLINONE / SETX: when setting one of those to true testssl.sh
|
|
falls back to the standard bash behavior, i.e.\ calling
|
|
\f[V]bash -x testssl.sh\f[R] it displays the bash debugging output not
|
|
in an external file \f[V]/tmp/testssl-<XX>.log\f[R]
|
|
.IP \[bu] 2
|
|
DEBUGTIME: Profiling option.
|
|
When using bash\[cq]s debug mode and when this is set to true, it
|
|
generates a separate text file with epoch times in
|
|
\f[V]/tmp/testssl-<XX>.time\f[R].
|
|
They need to be concatenated by
|
|
\f[V]paste /tmp/testssl-<XX>.{time,log}\f[R]
|
|
.IP \[bu] 2
|
|
EXPERIMENTAL=true is an option which is sometimes used in the
|
|
development process to make testing easier.
|
|
In released versions this has no effect.
|
|
.IP \[bu] 2
|
|
ALL_CLIENTS=true runs a client simulation with \f[I]all\f[R] (currently
|
|
126) clients when testing HTTP.
|
|
.IP \[bu] 2
|
|
UNBRACKTD_IPV6: needs to be set to true for some old versions of OpenSSL
|
|
(like from Gentoo) which don\[cq]t support [bracketed] IPv6 addresses
|
|
.IP \[bu] 2
|
|
NO_ENGINE: if you have problems with garbled output containing the word
|
|
`engine' you might want to set this to true.
|
|
It forces testssl.sh not try to configure openssl\[cq]s engine or a non
|
|
existing one from libressl
|
|
.IP \[bu] 2
|
|
HEADER_MAXSLEEP: To wait how long before killing the process to retrieve
|
|
a service banner / HTTP header
|
|
.IP \[bu] 2
|
|
MAX_WAITSOCK: It instructs testssl.sh to wait until the specified time
|
|
before declaring a socket connection dead.
|
|
Don\[cq]t change this unless you\[cq]re absolutely sure what you\[cq]re
|
|
doing.
|
|
Value is in seconds.
|
|
.IP \[bu] 2
|
|
CCS_MAX_WAITSOCK Is the similar to above but applies only to the CCS
|
|
handshakes, for both of the two the two CCS payload.
|
|
Don\[cq]t change this unless you\[cq]re absolutely sure what you\[cq]re
|
|
doing.
|
|
Value is in seconds.
|
|
.IP \[bu] 2
|
|
HEARTBLEED_MAX_WAITSOCK Is the similar to MAX_WAITSOCK but applies only
|
|
to the ServerHello after sending the Heartbleed payload.
|
|
Don\[cq]t change this unless you\[cq]re absolutely sure what you\[cq]re
|
|
doing.
|
|
Value is in seconds.
|
|
.IP \[bu] 2
|
|
MEASURE_TIME_FILE For seldom cases when you don\[cq]t want the scan time
|
|
to be included in the output you can set this to false.
|
|
.IP \[bu] 2
|
|
STARTTLS_SLEEP is per default set to 10 (seconds).
|
|
That\[cq]s the value testssl.sh waits for a string in the STARTTLS
|
|
handshake before giving up.
|
|
.IP \[bu] 2
|
|
MAX_PARALLEL is the maximum number of tests to run in parallel in
|
|
parallel mass testing mode.
|
|
The default value of 20 may be made larger on systems with faster
|
|
processors.
|
|
.IP \[bu] 2
|
|
MAX_WAIT_TEST is the maximum time (in seconds) to wait for a single test
|
|
in parallel mass testing mode to complete.
|
|
The default is 1200.
|
|
.IP \[bu] 2
|
|
HSTS_MIN is preset to 179 (days).
|
|
If you want warnings sooner or later for HTTP Strict Transport Security
|
|
you can change this.
|
|
.IP \[bu] 2
|
|
HPKP_MIN is preset to 30 (days).
|
|
If you want warnings sooner or later for HTTP Public Key Pinning you can
|
|
change this
|
|
.IP \[bu] 2
|
|
DAYS2WARN1 is the first threshold when you\[cq]ll be warning of a
|
|
certificate expiration of a host, preset to 60 (days).
|
|
For Let\[cq]s Encrypt this value will be divided internally by 2.
|
|
.IP \[bu] 2
|
|
DAYS2WARN2 is the second threshold when you\[cq]ll be warning of a
|
|
certificate expiration of a host, preset to 30 (days).
|
|
For Let\[cq]s Encrypt this value will be divided internally by 2.
|
|
.IP \[bu] 2
|
|
TESTSSL_INSTALL_DIR is the derived installation directory of testssl.sh.
|
|
Relatively to that the \f[V]bin\f[R] and mandatory \f[V]etc\f[R]
|
|
directory will be looked for.
|
|
.IP \[bu] 2
|
|
CA_BUNDLES_PATH: If you have an own set of CA bundles or you want to
|
|
point testssl.sh to a specific location of a CA bundle, you can use this
|
|
variable to set the directory which testssl.sh will use.
|
|
Please note that it overrides completely the builtin path of testssl.sh
|
|
which means that you will only test against the bundles you point to.
|
|
Also you might want to use \f[V]\[ti]/utils/create_ca_hashes.sh\f[R] to
|
|
create the hashes for HPKP.
|
|
.IP \[bu] 2
|
|
MAX_SOCKET_FAIL: A number which tells testssl.sh how often a TCP socket
|
|
connection may fail before the program gives up and terminates.
|
|
The default is 2.
|
|
You can increase it to a higher value if you frequently see a message
|
|
like \f[I]Fatal error: repeated openssl s_client connect problem,
|
|
doesn\[cq]t make sense to continue\f[R].
|
|
.IP \[bu] 2
|
|
MAX_OSSL_FAIL: A number which tells testssl.sh how often an OpenSSL
|
|
s_client connect may fail before the program gives up and terminates.
|
|
The default is 2.
|
|
You can increase it to a higher value if you frequently see a message
|
|
like \f[I]Fatal error: repeated TCP connect problems, giving up\f[R].
|
|
.IP \[bu] 2
|
|
MAX_HEADER_FAIL: A number which tells testssl.sh how often a HTTP GET
|
|
request over OpenSSL may return an empty file before the program gives
|
|
up and terminates.
|
|
The default is 3.
|
|
Also here you can increase the threshold when you spot messages like
|
|
\f[I]Fatal error: repeated HTTP header connect problems, doesn\[cq]t
|
|
make sense to continue\f[R].
|
|
.IP \[bu] 2
|
|
OPENSSL2 can be used to supply an alternative openssl version.
|
|
This only makes sense if you want to amend the supplied version in
|
|
\f[V]bin/\f[R] which lacks TLS 1.3 support with a version which doesn
|
|
not and is not in \f[V]/usr/bin/openssl\f[R].
|
|
.IP \[bu] 2
|
|
OSSL_SHORTCUT should be set to false when you run interactively and
|
|
don\[cq]t want to switch automatically to \f[V]/usr/bin/openssl\f[R]
|
|
(\f[V]OPENSSL2\f[R]) if you encounter a TLS 1.3-only host.
|
|
.SS RATING
|
|
.PP
|
|
This program has a near-complete implementation of SSL Labs\[cq]s `SSL
|
|
Server Rating
|
|
Guide (https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide)'.
|
|
.PP
|
|
This is \f[I]not\f[R] a 100% reimplementation of the SSL Lab\[cq]s SSL
|
|
Server Test (https://www.ssllabs.com/ssltest/analyze.html), but an
|
|
implementation of the above rating specification, slight discrepancies
|
|
may occur.
|
|
Please note that for now we stick to the SSL Labs rating as good as
|
|
possible.
|
|
We are not responsible for their rating.
|
|
Before filing issues please inspect their Rating Guide.
|
|
.PP
|
|
Disclaimer: Having a good grade is \f[B]NOT\f[R] necessarily equal to
|
|
having good security!
|
|
Don\[cq]t start a competition for the best grade, at least not without
|
|
monitoring the client handshakes and not without adding a portion of
|
|
good sense to it.
|
|
Please note STARTTLS always results in a grade cap to T.
|
|
Anything else would lead to a false sense of security.
|
|
Use TLS, see also RFC 8314.
|
|
The security of STARTTLS is always client determined, i.e.\ checking the
|
|
certificate which for SMTP port 25 is often enough not the case.
|
|
Also with DANE or MTA-STS no one can test on the server side whether a
|
|
client makes use if it.
|
|
.PP
|
|
As of writing, these checks are missing:
|
|
.IP \[bu] 2
|
|
GOLDENDOODLE - should be graded \f[B]F\f[R] if vulnerable
|
|
.IP \[bu] 2
|
|
Insecure renegotiation - should be graded \f[B]F\f[R] if vulnerable
|
|
.IP \[bu] 2
|
|
Padding oracle in AES-NI CBC MAC check (CVE-2016-2107) - should be
|
|
graded \f[B]F\f[R] if vulnerable
|
|
.IP \[bu] 2
|
|
Sleeping POODLE - should be graded \f[B]F\f[R] if vulnerable
|
|
.IP \[bu] 2
|
|
Zero Length Padding Oracle (CVE-2019-1559) - should be graded
|
|
\f[B]F\f[R] if vulnerable
|
|
.IP \[bu] 2
|
|
Zombie POODLE - should be graded \f[B]F\f[R] if vulnerable
|
|
.IP \[bu] 2
|
|
All remaining old Symantec PKI certificates are distrusted - should be
|
|
graded \f[B]T\f[R]
|
|
.IP \[bu] 2
|
|
Symantec certificates issued before June 2016 are distrusted - should be
|
|
graded \f[B]T\f[R]
|
|
.IP \[bu] 2
|
|
Anonymous key exchange - should give \f[B]0\f[R] points in
|
|
\f[V]set_key_str_score()\f[R]
|
|
.IP \[bu] 2
|
|
Exportable key exchange - should give \f[B]40\f[R] points in
|
|
\f[V]set_key_str_score()\f[R]
|
|
.IP \[bu] 2
|
|
Weak key (Debian OpenSSL Flaw) - should give \f[B]0\f[R] points in
|
|
\f[V]set_key_str_score()\f[R]
|
|
.SS Implementing new grades caps or -warnings
|
|
.PP
|
|
To implement a new grading cap, simply call the
|
|
\f[V]set_grade_cap()\f[R] function, with the grade and a reason:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
set_grade_cap \[dq]D\[dq] \[dq]Vulnerable to documentation\[dq]
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
To implement a new grade warning, simply call the
|
|
\f[V]set_grade_warning()\f[R] function, with a message:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
set_grade_warning \[dq]Documentation is always right\[dq]
|
|
\f[R]
|
|
.fi
|
|
.SS Implementing a new check which contains grade caps
|
|
.PP
|
|
When implementing a new check (be it vulnerability or not) that sets
|
|
grade caps, the \f[V]set_rating_state()\f[R] has to be updated
|
|
(i.e.\ the \f[V]$do_mycheck\f[R] variable-name has to be added to the
|
|
loop, and \f[V]$nr_enabled\f[R] if-statement has to be incremented)
|
|
.PP
|
|
The \f[V]set_rating_state()\f[R] automatically disables rating, if all
|
|
the required checks are \f[I]not\f[R] enabled.
|
|
This is to prevent giving out a misleading or wrong grade.
|
|
.SS Implementing a new revision
|
|
.PP
|
|
When a new revision of the rating specification comes around, the
|
|
following has to be done:
|
|
.IP \[bu] 2
|
|
New grade caps has to be either:
|
|
.RS 2
|
|
.IP "1." 3
|
|
Added to the script wherever relevant, or
|
|
.IP "2." 3
|
|
Added to the above list of missing checks (if above is not possible)
|
|
.RE
|
|
.IP \[bu] 2
|
|
New grade warnings has to be added wherever relevant
|
|
.IP \[bu] 2
|
|
The revision output in \f[V]run_rating()\f[R] function has to updated
|
|
.SS EXAMPLES
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
testssl.sh testssl.sh
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
does a default run on https://testssl.sh (protocols, standard cipher
|
|
lists, server\[cq]s cipher preferences, forward secrecy, server
|
|
defaults, vulnerabilities, client simulation, and rating.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
testssl.sh testssl.net:443
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
does the same default run as above with the subtle difference that
|
|
testssl.net has two IPv4 addresses.
|
|
Both are tested.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
testssl.sh --ip=one --wide https://testssl.net:443
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
does the same checks as above, with the difference that one IP address
|
|
is being picked randomly.
|
|
Displayed is everything where possible in wide format.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
testssl.sh -6 https://testssl.net
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
As opposed to the first example it also tests the IPv6 part \[en]
|
|
supposed you have an IPv6 network and your openssl supports IPv6 (see
|
|
above).
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
testssl.sh -t smtp smtp.gmail.com:25
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
Checks are done via a STARTTLS handshake on the plain text port 25.
|
|
It checks every IP on smtp.gmail.com.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
testssl.sh --starttls=imap imap.gmx.net:143
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
does the same on the plain text IMAP port.
|
|
.PP
|
|
Please note that for plain TLS-encrypted ports you must not specify the
|
|
protocol option when no STARTTLS handshake is offered:
|
|
\f[V]testssl.sh smtp.gmail.com:465\f[R] just checks the encryption on
|
|
the SMTPS port, \f[V]testssl.sh imap.gmx.net:993\f[R] on the IMAPS port.
|
|
Also MongoDB which provides TLS support without STARTTLS can be tested
|
|
directly.
|
|
.SS RFCs and other standards
|
|
.IP \[bu] 2
|
|
RFC 2246: The TLS Protocol Version 1.0
|
|
.IP \[bu] 2
|
|
RFC 2595: Using TLS with IMAP, POP3 and ACAP
|
|
.IP \[bu] 2
|
|
RFC 2817: Upgrading to TLS Within HTTP/1.1
|
|
.IP \[bu] 2
|
|
RFC 2818: HTTP Over TLS
|
|
.IP \[bu] 2
|
|
RFC 2830: Lightweight Directory Access Protocol (v3): Extension for
|
|
Transport Layer Security
|
|
.IP \[bu] 2
|
|
RFC 3207: SMTP Service Extension for Secure SMTP over Transport Layer
|
|
Security
|
|
.IP \[bu] 2
|
|
RFC 3501: INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1
|
|
.IP \[bu] 2
|
|
RFC 4346: The Transport Layer Security (TLS) Protocol Version 1.1
|
|
.IP \[bu] 2
|
|
RFC 4366: Transport Layer Security (TLS) Extensions
|
|
.IP \[bu] 2
|
|
RFC 4492: Elliptic Curve Cryptography (ECC) Cipher Suites for Transport
|
|
Layer Security (TLS)
|
|
.IP \[bu] 2
|
|
RFC 5077: Transport Layer Security (TLS) Session Resumption
|
|
.IP \[bu] 2
|
|
RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2
|
|
.IP \[bu] 2
|
|
RFC 5280: Internet X.509 Public Key Infrastructure Certificate and
|
|
Certificate Revocation List (CRL) Profile
|
|
.IP \[bu] 2
|
|
RFC 5321: Simple Mail Transfer Protocol
|
|
.IP \[bu] 2
|
|
RFC 5746: Transport Layer Security (TLS) Renegotiation Indication
|
|
Extension
|
|
.IP \[bu] 2
|
|
RFC 5804: A Protocol for Remotely Managing Sieve Scripts
|
|
.IP \[bu] 2
|
|
RFC 6066: Transport Layer Security (TLS) Extensions: Extension
|
|
Definitions
|
|
.IP \[bu] 2
|
|
RFC 6101: The Secure Sockets Layer (SSL) Protocol Version 3.0
|
|
.IP \[bu] 2
|
|
RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core
|
|
.IP \[bu] 2
|
|
RFC 6125: Domain-Based Application Service Identity [..]
|
|
.IP \[bu] 2
|
|
RFC 6797: HTTP Strict Transport Security (HSTS)
|
|
.IP \[bu] 2
|
|
RFC 6961: The Transport Layer Security (TLS) Multiple Certificate Status
|
|
Request Extension
|
|
.IP \[bu] 2
|
|
RFC 7469: Public Key Pinning Extension for HTTP (HPKP)
|
|
.IP \[bu] 2
|
|
RFC 7507: TLS Fallback Signaling Cipher Suite Value (SCSV) for
|
|
Preventing Protocol Downgrade Attacks
|
|
.IP \[bu] 2
|
|
RFC 7627: Transport Layer Security (TLS) Session Hash and Extended
|
|
Master Secret Extension
|
|
.IP \[bu] 2
|
|
RFC 7633: X.509v3 Transport Layer Security (TLS) Feature Extension
|
|
.IP \[bu] 2
|
|
RFC 7465: Prohibiting RC4 Cipher Suites
|
|
.IP \[bu] 2
|
|
RFC 7685: A Transport Layer Security (TLS) ClientHello Padding Extension
|
|
.IP \[bu] 2
|
|
RFC 7905: ChaCha20-Poly1305 Cipher Suites for Transport Layer Security
|
|
(TLS)
|
|
.IP \[bu] 2
|
|
RFC 7919: Negotiated Finite Field Diffie-Hellman Ephemeral Parameters
|
|
for Transport Layer Security
|
|
.IP \[bu] 2
|
|
RFC 8143: Using Transport Layer Security (TLS) with Network News
|
|
Transfer Protocol (NNTP)
|
|
.IP \[bu] 2
|
|
RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
|
|
.IP \[bu] 2
|
|
RFC 8701: Applying Generate Random Extensions And Sustain Extensibility
|
|
(GREASE) to TLS Extensibility
|
|
.IP \[bu] 2
|
|
RFC 9000: QUIC: A UDP-Based Multiplexed and Secure Transport
|
|
.IP \[bu] 2
|
|
W3C CSP: Content Security Policy Level 1-3
|
|
.IP \[bu] 2
|
|
TLSWG Draft: The Transport Layer Security (TLS) Protocol Version 1.3
|
|
.SS EXIT STATUS
|
|
.IP \[bu] 2
|
|
0 testssl.sh finished successfully without errors and without ambiguous
|
|
results
|
|
.IP \[bu] 2
|
|
1 testssl.sh has encountered exactly one ambiguous situation or an error
|
|
during run
|
|
.IP \[bu] 2
|
|
1+n same as previous.
|
|
The errors or ambiguous results are added, also per IP.
|
|
.IP \[bu] 2
|
|
50-200 reserved for returning a vulnerability scoring for system
|
|
monitoring or a CI tools
|
|
.IP \[bu] 2
|
|
242 (ERR_CHILD) Child received a signal from master
|
|
.IP \[bu] 2
|
|
244 (ERR_RESOURCE) Resources testssl.sh needs couldn\[cq]t be read
|
|
.IP \[bu] 2
|
|
245 (ERR_CLUELESS) Weird state, either though user options or testssl.sh
|
|
.IP \[bu] 2
|
|
246 (ERR_CONNECT) Connectivity problem
|
|
.IP \[bu] 2
|
|
247 (ERR_DNSLOOKUP) Problem with resolving IP addresses or names
|
|
.IP \[bu] 2
|
|
248 (ERR_OTHERCLIENT) Other client problem
|
|
.IP \[bu] 2
|
|
249 (ERR_DNSBIN) Problem with DNS lookup binaries
|
|
.IP \[bu] 2
|
|
250 (ERR_OSSLBIN) Problem with OpenSSL binary
|
|
.IP \[bu] 2
|
|
251 (ERR_NOSUPPORT) Feature requested is not supported
|
|
.IP \[bu] 2
|
|
252 (ERR_FNAMEPARSE) Input file couldn\[cq]t be parsed
|
|
.IP \[bu] 2
|
|
253 (ERR_FCREATE) Output file couldn\[cq]t be created
|
|
.IP \[bu] 2
|
|
254 (ERR_CMDLINE) Cmd line couldn\[cq]t be parsed
|
|
.IP \[bu] 2
|
|
255 (ERR_BASH) Bash version incorrect
|
|
.SS FILES
|
|
.PP
|
|
\f[B]etc/*pem\f[R] are the certificate stores from Apple, Linux, Mozilla
|
|
Firefox, Windows and Java.
|
|
.PP
|
|
\f[B]etc/client-simulation.txt\f[R] contains client simulation data.
|
|
.PP
|
|
\f[B]etc/cipher-mapping.txt\f[R] provides a mandatory file with mapping
|
|
from OpenSSL cipher suites names to the ones from IANA / used in the
|
|
RFCs.
|
|
.PP
|
|
\f[B]etc/tls_data.txt\f[R] provides a mandatory file for ciphers (bash
|
|
sockets) and key material.
|
|
.SS AUTHORS
|
|
.PP
|
|
Developed by Dirk Wetter, David Cooper and many others, see CREDITS.md .
|
|
.SS COPYRIGHT
|
|
.PP
|
|
Copyright \[co] 2012 Dirk Wetter.
|
|
License GPLv2: Free Software Foundation, Inc.
|
|
This is free software: you are free to change and redistribute it under
|
|
the terms of the license, see LICENSE.
|
|
.PP
|
|
Attribution is important for the future of this project - also in the
|
|
internet.
|
|
Thus if you\[cq]re offering a scanner based on testssl.sh as a public
|
|
and/or paid service in the internet you are strongly encouraged to
|
|
mention to your audience that you\[cq]re using this program and where to
|
|
get this program from.
|
|
That helps us to get bugfixes, other feedback and more contributions.
|
|
.PP
|
|
Usage WITHOUT ANY WARRANTY.
|
|
USE at your OWN RISK!
|
|
.SS LIMITATION
|
|
.PP
|
|
All native Windows platforms emulating Linux are known to be slow.
|
|
.SS BUGS
|
|
.PP
|
|
Probably.
|
|
Current known ones and interface for filing new ones:
|
|
https://testssl.sh/bugs/ .
|
|
.SS SEE ALSO
|
|
.PP
|
|
\f[V]ciphers\f[R](1), \f[V]openssl\f[R](1), \f[V]s_client\f[R](1),
|
|
\f[V]x509\f[R](1), \f[V]verify\f[R](1), \f[V]ocsp\f[R](1),
|
|
\f[V]crl\f[R](1), \f[V]bash\f[R](1) and the websites https://testssl.sh/
|
|
and https://github.com/testssl/testssl.sh/ .
|